私はバイソンに文法を記述しようとしていますが、それができるかどうかはわかりません。シンプルな(?)文法でshift-reduce競合を修正する
%token A B C D SEP
%%
items : /* empty */
| items_nonempty
;
items_nonempty : item
| items_nonempty SEP item
;
item : B
| B SEP D
| B SEP C
| B SEP C SEP D
| A SEP B
| A SEP B SEP D
| A SEP B SEP C
| A SEP B SEP C SEP D
;
「items
」はSEP
トークンによって分離item
要素の(空の可能)配列である。私の意図した文法はこれです
各アイテムは、SEP
で区切られた順に、最大4つのトークン(A B C D
)で構成されています。項目内のA
、C
、およびD
のトークンはオプションです。
各アイテム内およびアイテム間で同じセパレータトークンSEPを再利用することに注意してください。
私は意図された文法がはっきりしていることを願っています。私はそれがあいまいではないと思うが、バイソンがそれを解析できるように十分に制限されているかどうかは不明だ。残念ながら、私のパーサーの知識はかなり錆びている。
与えられた文法を使用して、bisonは4つのシフト/リダクションの競合を報告します。 「アウトプット」を見ると、私は彼らの発生場所と理由を理解しています。私はS/Rの競合を取り除くために意図された文法をどのように書くことができますか?
私は%expect
宣言を使用したくないです。同様に、私はスキャナがパーザに渡されるのではなく、セパレータトークンを消費させたくないです。
この文法をどのようにサニタイズするかについてのヒントは非常に高く評価されます。