コンパイル、パース部分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部分と同じ扱いみたい。