私は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.
御時間ありがとうございます。