バイソンで文法を説明しようとしていますが、それができるかどうかわかりません。私の意図する文法はこれです:
%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
(空の可能性がある)要素のシーケンスです。item
SEP
各アイテムは、最大4つのトークン(A B C D
)で構成され、この順序で。で区切られSEP
ます。アイテム内のA
、、、C
およびD
トークンはオプションです。
各アイテム内、およびアイテム自体の間で同じセパレータトークンSEPが再利用されていることに注意してください。
意図した文法が明確であることを願っています。明確だと思いますが、バイソンで解析できるように十分に制限されているかどうかはよくわかりません。残念ながら、パーサーの知識はかなり錆びています。
与えられた文法を使用して、bisonは4つのshift/reduceの競合を報告します。「出力」を見ると、それらがどこで発生し、その理由がわかります。しかし、S / Rの競合を取り除くために、意図した文法をどのように(そしてもし)書くことができるのか、私は途方に暮れています。
私は%expect
宣言を使いたくありません。同様に、スキャナーにセパレータートークンを渡してもらうのではなく、セパレータートークンを消費させたくありません。
この文法をサニタイズする方法についてのヒントをいただければ幸いです。