ツリー・グラフ変換ルールは、
「単位構文のid」「単位構文のリスト表現」「変換ルールの本体」の三つ組で
構成されます。「単位構文のid」「単位構文のリスト表現」の
スケルトンは自動生成出来ます。「変換ルールの本体」のヒントも
同時に自動生成出来ます。
ツリー・グラフ変換ルールの作成部分例 (1)
block_stat:
(
(
"{}*",
(
"block_stat_n",
(
(
"{}",
("block"),
("if"),
("switch"),
("label"),
("for"),
("while"),
("do"),
("continue"),
("break"),
("return"),
("stat_sync"),
("try"),
("throw"),
("stat_var_dcl"),
("stat_exp"),
("stat_colon")
)
)
)
)
)
attr_grmr {
loop1(stat, n) :- for($[1]) == 1 , ("block") == stat [ -/n/-> $[1][1] ], ! loop1(stat, n + 1) .
loop1(stat, n) :- for($[1]) == null, ("block") == stat, must_be(dst_node(stat, n), null) == 1 .
loop1($$, 1) .
}
ツリー・グラフ変換ルールの作成部分例 (2)
e_cmp:
(("e_sft"), ("{}?", ("e_cmp_1", (("{}", ("ge"), ("gt"), ("le"), ("lt"), ("instanceof")), ("e_sft")))))
attr_grmr {
op(">=") :- switch($[2][1]) == "ge" .
op(">" ) :- switch($[2][1]) == "gt" .
op("<=") :- switch($[2][1]) == "le" .
op("<" ) :- switch($[2][1]) == "lt" .
op("instanceof") :- switch($[2][1]) == "instanceof" .
if1(exp, exp1) :- if($[2]) == 1 , op(op), ("binary") == exp [ -/"op"/-> op ]
[ -/"exp1"/-> exp1 ]
[ -/"exp2"/-> $[2][2] ] .
if1(exp, exp ) :- if($[2]) == null .
if2(exp) :- $gen == 1, ("binary") == exp [ -/"op"/-> op ],
op != ">=", op != ">", op != "<=", op != "<", op != "instanceof", if($[2]) == null, exp === $[1] .
if2(exp) :- if1(exp, $[1]) .
if2($$) .
}