0

以下の文法を見ると、より具体的な式タイプに解析される主要なルールである式が表示されます。

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' がありません". ルールにクラス名が関連付けられていない場合でも、ドット表記アクセサーを使用する方法はありますか?

4

1 に答える 1

0

私が使用する基準のいくつか:

  1. すべてのルールにNodeクラスが関連付けられている必要はありません。
  2. 主な式としてクロージャを持つルールは{}、リストを返すのに適しています。
  3. 主な式として選択肢を含むルールは|、オプションを独自のルールに分解する必要がある場合でも、成功したオプションが返すものを返すのが最適です。
  4. 優先順位が重要です。
  5. Ect。

アイデアは、生成された解析モデルは、特にwalkersを使用して、最小限のif-elseまたはで使いやすくする必要があるということisinstance()です。

これは私があなたの例を行う方法です:

start
    =
    expression $
    ;


expression
    =
    | or_expre
    | and_expre
    | sub_expre
    ;


or_expre::OrExpression
    =
    operands:'||'.{and_expre}+
    ;


and_expr::AndExpression
    =
    operands:'&&'.{sub_expre}+
    ;


sub_expr
    =
    | not_expr
    | comp_expre
    | atomic
    ;


not_expre::NotExpression
   =
   '!!' ~ sub_expr
   ;


comp_expr::CompareExpression
    =
    lef:atomic operator:('>=' | '<=' | '==' | '!=' | '>' | '<') ~ right:atomic
    ;


atomic
    =
    | group_expre
    | identifier
    ;


group_expr::GroupExpression
    =
    '(' ~ expre:expression ')'
    ;


identifier::str
    =
    /[a-zA-Z][A-Za-z0-9_]*/
    ;
于 2016-10-13T01:26:38.747 に答える