以下の文法を見てみると、より具体的な式タイプに解析される主要なルールexpressionが見えます。GrakoのModelBuilderSemanticsを使用したネストされたオブジェクトの回避
expression::Expression
=
or_ex:and_expr {'||' or_ex:and_expr}+
| andex:and_expr
;
and_expr::AndExpression
=
and_ex:sub_expr {'&&' and_ex:sub_expr}+
| subex:sub_expr
;
sub_expr::SubExpression
=
{'!!'}* '!(' not_ex:expression ')'
| {'!!'}* '(' sub_ex:expression ')'
| compex:comp_expr
;
comp_expr::CompareExpression
=
comp:identifier operator:('>=' | '<=' | '==' | '!=' | '>' | '<') comp:identifier
;
identifier::str
=
?/[a-zA-Z][A-Za-z0-9_]*/?
;
test_inputの解析、以下、期待通りに動作しますが、私は「@」の代わりに「andex」で表現ルールでand_expr要素にラベルを付けることを好むだろう。私の希望は、解析された出力は、Expressionオブジェクトのnot_ex要素の内部にあるCompareExpressionオブジェクトのみになるということでした。
!(a == b)
and_expr要素に '@'ラベルを使用すると、Expressionオブジェクトに属性が表示されないようです。これはバグか故意ですか? ModelBuilderSemanticsを使用する場合は、すべての要素に名前を付ける必要がありますが、 '@'ラベルは使用しないでください。
私が直面してきたもう一つの問題は、comp_exprのような後の規則に関連するクラス名がないと、その要素が印刷時に辞書に表示されますが、ドット表記アクセサーがAttributeErrorつまり、 "AttributeError: 'dict'オブジェクトには属性 'comp'がありません。ルールにクラス名が関連付けられていない場合でも、ドット表記アクセッサを使用する方法はありますか?私が使用基準の