我正在尝试用野牛描述语法,但我不确定是否可以做到。我的预期语法是这样的:
%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 个移位/减少冲突。查看“输出”,我了解它们出现的位置以及原因;但我不知道如何(以及是否)可以编写预期的语法来摆脱 S/R 冲突。
我不愿意使用%expect
声明。同样,我不愿意让我的扫描仪使用分隔符标记,而不是将它们传递给解析器。
任何有关如何清理此语法的提示将不胜感激。