optional の処理の設計ノート 20050727 -MT- 20050824 -MT- 【decode】 + UMS + 処理方針 - 出現の有無を保持するため、loop[] と、loopIndex を持ちいる。 -> ループのネストに対応するため、loop 変数を配列にしている。 -> optionaol の処理の先頭で、loopIndex をインクリメントし、 loop[loopIndex] を初期化する。 - @occurs が 0 または false であれば、optional の最後に jump する。 - optional ごとに brunch() を行う。 -> brunch() 先は、optional の最後。 - コンテナ処理の後に、loop[] をインクリメントする。 - optional の処理を終えた際、loop[] が 0 であれば、パターンが存在 しなかった、1 であれば、パターンが存在したことになる。 - @occured が指定してある場合は、パターンの存在の有無を格納する。 + 生成ソースイメージ // loopIndex++; loop[loopIndex] = 0; brunch( -20 ); // // // // // // loop[loopIndex]++; case -20: if ( loop[loopIndex] == 0 ) { optionalFlag = false; } else { optionalFlag = true; } loopIndex--; // 【encode】 + UMS + 処理方針 - ループ変数の処理、ループの処理ロジックは、decode 側と同じ。 - @occurs の指定が必須。 - brunch() は行わない。 -> @occurs により、パターンの有無が指定されるため。 + 生成ソースイメージ // loopIndex++; loop[loopIndex] = 0; if ( true ) { cpos = -20; continue; } // // // // // // case -20: loopIndex--; // 【参照】 - デザインノート 2005061503 : 制御構造の取り扱い 以上