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