野牛:转移减少冲突

时间:2011-03-21 18:24:46

标签: c++ parsing grammar yacc bison

我相信我无法理解轮班减少冲突的工作方式。我知道野牛可以向前看,所以我不明白为什么我会遇到这个问题。

在我的语言中,List被定义为[]之间的一组数字或列表。 例如[] [1] [1 2] [1 [2] 3]都是有效列表。

以下是导致问题的定义

 value: num 
    | stringValue
    | list          
    ;

list: LEFTBRACE RIGHTBRACE  
    | LEFTBRACE list RIGHTBRACE 
    | num list          
    | RIGHTBRACE            
    ;

冲突发生在数字上,它不知道按列表规则移动的天气,或者通过值规则减少。我很困惑,因为它无法检查列表是否跟随该号码?

任何关于我应该如何进行的煽动都将不胜感激。

2 个答案:

答案 0 :(得分:6)

我认为我以不同的方式定义事物,以避免问题开始,例如:

value: num
     | stringvalue
     | list
     ;

items:
     | items value
     ;

list: LEFTBRACE items RIGHTBRACE;

编辑:除非您删除空列表,否则不能干净地完成从字符串列表中分离数字列表。出现的问题是您希望允许空列表包含在数字列表中一个字符串列表,但查看空列表本身并不能让解析器决定哪一个。例如:

  

[[] [] [] [] [] [] [] [] 1]

要弄清楚这是什么类型的列表,解析器必须一直向前看1 - 但是LALR(N)解析器只能查找N个符号来做出该决定。 Yacc(和Byacc,Bison等)只做LALR(1),所以他们只能向前看一个符号。这留下了一些可能性:

  1. 完全消除空列表的可能性
  2. 让词法分析器将任意数量的连续空列表视为单个标记
  3. 使用不限于LALR(1)语法的解析器生成器
  4. 然而,在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 

这样你没有正确的递归,语法的嵌套逻辑更简单地表达出来。

相关问题