野牛如何在语法中描述可选语法而没有移位-减少冲突?



我有一个用语法描述的文件。它有一个部分,可以包含一种或两种内容,并且可以按任意顺序排列:

...
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
;

所以contentsfoobar的列表,foobar要么是foo的列表,要么是bar的列表。这是模棱两可的,因为通过将两个foo解释为包含两个foo的单个foobar或两个foobar分别包含一个foo,可以将由两个连续foos组成的输入解析为contents

摆脱这种歧义的一个简单方法是放弃内部列表:

contents: foobar | contents foobar;
foobar: foo | bar;

如果需要以不同的方式处理连续foo,您仍然可以在后处理期间检测到它们。如果你绝对需要在语法中处理这个问题,你可以重构语法,使foos后面只能跟一个bars(而不是另一个foos(,反之亦然。

最新更新