我才刚开始与野牛一起学习绳索,对空规则感到非常困惑。所以我的第一个问题是,只有一个规则可以匹配为空吗?我正在阅读here,想知道如果我需要2条规则,这些规则可以包含“ 0个或多个”。这不会为解析器造成歧义吗?我已经对此进行了测试,它可以减少/减少冲突。
让我更加困惑的是,我测试了一些玩具规则,例如:
rule1: TOKEN { printf("rule1"); }
| ANOTHER_TOKEN { printf("rule1"); }
;
rule2: ANOTHER_TOKEN { printf("rule2"); }
;
这显然是模棱两可的,因为Rule1和Rule2匹配相同的输入(我对其进行了测试),但这并没有给我减少/减少冲突警告。有什么理由吗?应该不惜一切代价避免上述代码之类的事情吗?
答案 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
。
(注意::第二个示例要求foo
和bar
可以通过第一个标记来区分。否则,您将获得移位减少冲突。 )