如何防止多个空规则的减少/减少冲突?

时间:2019-06-18 03:30:17

标签: bison yacc

我才刚开始与野牛一起学习绳索,对空规则感到非常困惑。所以我的第一个问题是,只有一个规则可以匹配为空吗?我正在阅读here,想知道如果我需要2条规则,这些规则可以包含“ 0个或多个”。这不会为解析器造成歧义吗?我已经对此进行了测试,它可以减少/减少冲突。

让我更加困惑的是,我测试了一些玩具规则,例如:

rule1: TOKEN { printf("rule1"); }
    | ANOTHER_TOKEN { printf("rule1"); }
;

rule2: ANOTHER_TOKEN { printf("rule2"); }
;

这显然是模棱两可的,因为Rule1和Rule2匹配相同的输入(我对其进行了测试),但这并没有给我减少/减少冲突警告。有什么理由吗?应该不惜一切代价避免上述代码之类的事情吗?

1 个答案:

答案 0 :(得分:0)

在同一右侧,您可以根据需要设置任意数量的规则,只要它们永远都不适用即可。

这很好:

 foo_list: %empty
         | foo_list foo
 bar_list: %empty
         | bar_list bar

但是,如果您尝试以下操作,则会造成歧义:

either_list: foo_list | bar_list

因为尚不清楚空either_list指的是哪种选择。这两个空规则都适用。

另一方面,这很好:

both_list: foo_list bar_list

在这里,一个空both_list明确包含一个空foo_list,然后是一个空bar_list

注意::第二个示例要求foobar可以通过第一个标记来区分。否则,您将获得移位减少冲突。 )