「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を実装していないので、完全に意味なしでも無さそう?)



…あ、でもそれだと最後の終端を別扱いにしないといけなさそう?

それはどっちにしても変わらないか。