我有一个用语法描述的文件。它有一个部分,可以包含一种或两种内容,并且可以按任意顺序排列:
...
type_a_thing
type_b_thing
type_b_thing
type_a_thing
....
或者只是
...
type_a_thing
...
或
...
type_b_thing
type_b_thing
...
或任何组合,在任意次数的出现。两种type_a_thing andtype_b_thing都有一个明确的结构。我已经设法描述了这一点,以便解析器工作,但我仍然收到 shift/reduce 错误。 我在这里上传了一个最小的例子:
https://github.com/waszil/minimal_bison_parser
这是解决这个问题的正确方法吗?我做错了吗? 我为此尝试了很多东西,用详细标志检查了野牛生成的 .output 文件,但我不知道,应该如何正确完成。它有点类似于Flex&Bison O'Reilly书中描述的嵌套列表语法问题,但并不相同
感谢您的任何提示!
看看你的语法的这一部分:
contents:
foobar
| contents foobar
;
foobar:
foos
| bars
;
foos:
foo
| foos foo
;
bars:
bar
| bars bar
;
所以contents
是foobar
的列表,foobar
要么是foo
的列表,要么是bar
的列表。这是模棱两可的,因为通过将两个foo
解释为包含两个foo
的单个foobar
或两个foobar
分别包含一个foo
,可以将由两个连续foo
s组成的输入解析为contents
。
摆脱这种歧义的一个简单方法是放弃内部列表:
contents: foobar | contents foobar;
foobar: foo | bar;
如果需要以不同的方式处理连续foo
,您仍然可以在后处理期间检测到它们。如果你绝对需要在语法中处理这个问题,你可以重构语法,使foos
后面只能跟一个bars
(而不是另一个foos
(,反之亦然。