1

私はantlr v4を使用しています(直接左再帰を排除します)。

私の文法の非終端記号は次のとおりです: and, or, id.

andは よりも優先度が高くor、両方とも関連付けられたままです。
Antlr4 のリファレンスによると、and前に置くorと優先順位が高くなります。

だから私はこの簡単な文法を書いた:

expr : 'id'
     | expr BINOP expr
     ;

BINOP: 'and'<assoc=left>    //higher precedence
     | 'or'<assoc=left>     //lower precedence
     ;

しかし、文字列を解析するとid and id or id and id、結合性は問題ありませんが、
優先順位は問題ありません: ((id and id) or id) and id.

BINOPパーサー ルールにすると、次のようになります。

binop: 'and'<assoc=left>
     | 'or'<assoc=left>
     ;

結合性も優先順位も正しく機能しません:
id and (id or (id and id))

BINOPただし、 expr パーサールール内に実装すると:

expr : 'id'
     | expr 'and'<assoc=left> expr
     | expr 'or'<assoc=left> expr
     ;

すべてが正常に機能し、目的の解析ツリーを取得します。
(id and id) or (id and id)

私は問題について多くのことをグーグルで調べましたが、何も見つかりませんでした。

問題がどこにあるのか、また
BINOP.

御時間ありがとうございます。

4

1 に答える 1

0

assoc=left がデフォルトなので、ここでは何もしません。また、優先順位は代替レベルで機能し、両方の演算子を同じレベルに配置しました。

expr BINOP expr

テル

于 2013-10-17T20:12:22.893 に答える