「if」の実装
大丈夫かと思っていた汎用スクリプトだけど、どうもif関連の挙動がおかしい…。
えーと、
でいいはずだから、
※Cの定義に従い、「真 = 0」「偽 = 非0」とする。
※「ifの終端」 … if,else等すべて合わせた終わり
「ifの閉じ」 … 次の「}」時・if内が「真」 -> そのまま通過
(閉じまできたら、そのifの終端までjmp)
・if内が「偽」 -> そのifの閉じまでjmp
・ifの閉じ時 -> ifの閉じ生成
それに加えて、
次にelse系が無い -> ifの終端生成
次にelse系が有る -> 特に何もしない
は
// はじめ
if( A )
{
A ++;
// 内部1
if( B )
{
B ++;
}
A --;
}
// はじめ2
else if( AA )
{
AA ++;
// 内部2
if( C )
{
C ++;
}
AA --;
}
こうなるはず。
※「「IF src, dst」は、srcが偽であればdstへ飛ぶ」; はじめ
IF A, :A_01
INC A
; 内部1
IF B, :B_01
INC B
JMP :B_END
:B_01
:B_END
DEC A
JMP :A_END
:A_01; はじめ2
IF AA, :AA_01
INC AA
; 内部2
IF C, :C_01
INC C
JMP :C_END
:C_01
:C_END
DEC AA
JMP :AA_END
:AA_01
:AA_END
:A_END
…むぅ、「if〜elseで一区切り」と考えずに
「if・else・else ifそれぞれ別個で一区切り」と考えた方が単純化できていいのかな?(汗)
(普通にstackに積みまくるだけでいけそう。)
ラベル数ケチれるかと思ったけど、相当なことが無い限り意味無いレベルになりそうだし。
(ただ、現状switchを実装していないので、完全に意味なしでも無さそう?)
…あ、でもそれだと最後の終端を別扱いにしないといけなさそう?
それはどっちにしても変わらないか。