コンパイル、パース部分3

if文のところをもう少し詳しく見るために、下記のテンプレートをパースさせてみる。

$ if (message1 && message2) { $
uhouho1
$} elsif (message1 || message2) { $
uhouho2
$} else { $
uhouho3
$ } $

パース結果がこんな感じ。

$VAR1 = {
'cond' => 'message1',
'onfalse' => 4,
'type' => 4,
'condtyp' => 1,
'condval' => '',
'condkey' => 'message1',
'ontrue' => 1
};
$VAR2 = {
'cond' => 'message2',
'onfalse' => 4,
'type' => 4,
'condtyp' => 1,
'condval' => '',
'condkey' => 'message2',
'ontrue' => 2
};
$VAR3 = {
'rbpos' => 4,
'type' => 253
};
$VAR4 = {
'text' => '
uhouho1
',
'type' => 1
};
$VAR5 = {
'type' => 254
};
$VAR6 = {
'onfalse' => 10,
'type' => 5,
'ontrue' => 6
};
$VAR7 = {
'cond' => 'message1',
'onfalse' => 7,
'type' => 4,
'condtyp' => 1,
'condval' => '',
'condkey' => 'message1',
'ontrue' => 8
};
$VAR8 = {
'cond' => 'message2',
'onfalse' => 10,
'type' => 4,
'condtyp' => 1,
'condval' => '',
'condkey' => 'message2',
'ontrue' => 8
};
$VAR9 = {
'rbpos' => 10,
'type' => 253
};
$VAR10 = {
'text' => '
uhouho2
',
'type' => 1
};
$VAR11 = {
'type' => 254
};
$VAR12 = {
'onfalse' => 14,
'type' => 5,
'ontrue' => 12
};
$VAR13 = {
'rbpos' => 14,
'type' => 253
};
$VAR14 = {
'text' => '
uhouho3
',
'type' => 1
};
$VAR15 = {
'type' => 254
};
$VAR16 = {
'text' => '
',
'type' => 1
};
$VAR17 = {
'type' => 255
};

上から順番に追っていってみる。

$VAR1〜$VAR5

ここは、AND条件のif文の部分。
$VAR1のkey値について見ていく。
「type => 4」は、if文である事を示している。
condは変数名、condvalは変数の比較値。
condtypは、条件タイプを示している。条件タイプは下記のように定義されている。

COND_EQ => 0, # =
COND_NE => 1, # !=
COND_GT => 2, # >
COND_GE => 3, # >=
COND_LT => 4, # <
COND_LE => 5, # <=

onfalseとontrueは、条件の結果による飛び先を示している。$VAR1では、
'onfalse' => 4,
'ontrue' => 1
であるので、条件がfalseだと$VAR5に飛び、trueだとAND条件なので次の条件部である$VAR2に飛ぶ。

$VAR6〜$VAR11

ここはOR条件なので、$VAR7と$VAR8のontrueの飛び先が同じになっている。また、$VAR7でfalseなら$VAR8を見るようにもなっている。

$VAR7 = {
'cond' => 'message1',
'onfalse' => 7,
'type' => 4,
'condtyp' => 1,
'condval' => '',
'condkey' => 'message1',
'ontrue' => 8
};
$VAR8 = {
'cond' => 'message2',
'onfalse' => 10,
'type' => 4,
'condtyp' => 1,
'condval' => '',
'condkey' => 'message2',
'ontrue' => 8
};

elsif文の場合、elseとifで分けられているみたい。else部分は、

$VAR6 = {
'onfalse' => 10,
'type' => 5,
'ontrue' => 6
};

なにに対してtrue/falseなのか書いてないけど、飛び先から推測するに、前のif条件がtrueだったらfalse、前のif条件がfalseだったらtrueみたい。

$VAR12〜$VAR15

else文。elsif文のelse部分と同じ扱いみたい。