これが私が試していることです:
foreach_in.Rule = ToTerm("foreach") + "(" + VARIABLE + "in" + list_obj + ")";
foreach_as.Rule = ToTerm("foreach") + "(" + list_obj + "as" + VARIABLE + ")";
for_loop.Rule = ToTerm("for") + "(" + simple_assignment + ";" + comparison + ";" + assignment + ")";
if_condition.Rule = ToTerm("if") + "(" + comparison + ")";
if_else.Rule = if_condition + block + "else"; // <-- PROBLEM
preset_directive.Rule = foreach_in | foreach_as | for_loop | if_else | if_condition;
directive.Rule = preset_directive | custom_directive;
directive_blk.Rule = directive + block;
しかし、私はshift-reduce conflict
. 理由はよくわかりません...可能であれば、貪欲に「else」を取得しないでください。「if」ブロックのみが続くようにelseブロックを定義する方法がよくわかりません。
ノードとif_else
ノードを持つブロック ノードが最適だと思います。なぜなら、AST をトラバースしようとするときに、戻って前の兄弟をチェックする必要がないからです。if
else
文法の詳細を確認する必要がある場合は、お知らせください。「ブロック」は基本的に{ blah }
(間の一連のステートメント{}
) として定義されます。
オプションのブロックとして試してみてください:
custom_directive_kw.Rule = ToTerm("custom_directive1") | "custom_directive2";
custom_directive.Rule = custom_directive_kw + free_args_opt;
foreach_in.Rule = ToTerm("foreach") + "(" + variable + "in" + list_obj + ")" + block;
foreach_as.Rule = ToTerm("foreach") + "(" + list_obj + "as" + variable + ")" + block;
for_loop.Rule = ToTerm("for") + "(" + simple_assignment + ";" + comparison + ";" + assignment + ")" + block;
if_condition.Rule = ToTerm("if") + "(" + comparison + ")" + block + else_blk_opt;
else_blk.Rule = "else" + block;
else_blk_opt.Rule = else_blk | Empty;
preset_directive.Rule = foreach_in | foreach_as | for_loop | if_condition;
directive.Rule = preset_directive | custom_directive;
directive_blk.Rule = directive;
それも好きじゃない。それでも警告をスローします。