以下の文法を見ると、より具体的な式タイプに解析される主要なルールである式が表示されます。
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 の解析は期待どおりに機能しますが、式ルールの and_expr 要素に「andex」ではなく「@」のラベルを付けたいと思います。私の希望は、解析された出力が Expression オブジェクトの not_ex 要素内にある CompareExpression オブジェクトのみになることでした。
!(a == b)
and_expr 要素で「@」ラベルを使用すると、Expression オブジェクトに属性が表示されないようです! これはバグですか、それとも意図的なものですか? ModelBuilderSemantics を使用する場合、すべての要素に名前を付けて「@」ラベルを使用しないようにする必要がありますか?
私が直面しているもう 1 つの問題は、comp_expr などの後のルールに関連付けられたクラス名がない場合、その要素は印刷時に辞書に表示されますが、ドット表記のアクセサーは AttributeError で失敗することです。 : 'dict' オブジェクトには属性 'comp' がありません". ルールにクラス名が関連付けられていない場合でも、ドット表記アクセサーを使用する方法はありますか?