我相信我无法理解轮班减少冲突的工作方式。我知道野牛可以向前看,所以我不明白为什么我会遇到这个问题。
在我的语言中,List被定义为[]之间的一组数字或列表。 例如[] [1] [1 2] [1 [2] 3]都是有效列表。
以下是导致问题的定义
value: num
| stringValue
| list
;
list: LEFTBRACE RIGHTBRACE
| LEFTBRACE list RIGHTBRACE
| num list
| RIGHTBRACE
;
冲突发生在数字上,它不知道按列表规则移动的天气,或者通过值规则减少。我很困惑,因为它无法检查列表是否跟随该号码?
任何关于我应该如何进行的煽动都将不胜感激。
答案 0 :(得分:6)
我认为我以不同的方式定义事物,以避免问题开始,例如:
value: num
| stringvalue
| list
;
items:
| items value
;
list: LEFTBRACE items RIGHTBRACE;
编辑:除非您删除空列表,否则不能干净地完成从字符串列表中分离数字列表。出现的问题是您希望允许空列表包含在数字列表中或一个字符串列表,但查看空列表本身并不能让解析器决定哪一个。例如:
[[] [] [] [] [] [] [] [] 1]
要弄清楚这是什么类型的列表,解析器必须一直向前看1
- 但是LALR(N)解析器只能查找N个符号来做出该决定。 Yacc(和Byacc,Bison等)只做LALR(1),所以他们只能向前看一个符号。这留下了一些可能性:
然而,在yacc语法中,我并不认为你可以做很多事情 - 你的语法根本不适合yacc的限制。
答案 1 :(得分:1)
使用自下而上的解析器通常最好避免右递归,这就是您在下面的语法的星号行中所拥有的。
list: LEFTBRACE RIGHTBRACE
| LEFTBRACE list RIGHTBRACE
**| num list**
| RIGHTBRACE
相反,您是否考虑过这样的事情?
value:value num
| value string
| value list
| num
| string
| list
list: LEFTBRACE RIGHTBRACE
| LEFTBRACE value RIGHTBRACE
这样你没有正确的递归,语法的嵌套逻辑更简单地表达出来。