【问题标题】:Bison: Shift Reduce Conflict野牛:转变减少冲突
【发布时间】:2011-03-21 18:24:45
【问题描述】:

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

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

以下是导致问题的定义

 value: num 
    | stringValue
    | list          
    ;

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

冲突发生在数字上,它不知道天气是按列表规则移动,还是按值规则减少。我很困惑,因为它不能检查列表是否跟在数字后面吗?

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

【问题讨论】:

    标签: c++ parsing grammar yacc bison


    【解决方案1】:

    我想我会以不同的方式定义事物,以避免一开始就出现问题,例如:

    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) 语法的解析器生成器

    但是,在 yacc 语法内部,我认为您无能为力——您的语法根本不符合 yacc 的限制。

    【讨论】:

    • 有时很高兴为空匹配添加评论,以便更容易看到。 items: /* Empty */
    • @Martin:有时是正确的——同时,任何能够阅读类似 yacc 语法的人几乎肯定会非常容易地识别它。
    • 这不允许字符串与数字一起出现在列表中吗?有没有办法确保列表中只有一种类型?
    • @Pieces:是的——我认为这就是目的。请参阅已编辑的问题。
    • @Samsdram:没有空列表的可能性是对的,但是允许空列表不仅很难,而且(我相信)不可能。
    【解决方案2】:

    使用自下而上的解析器,避免右递归通常是一个好主意,这就是您在下面的语法加星号行中所拥有的。

    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 
    

    这样你就没有正确的递归了,语法的嵌套逻辑表达得更简单了。

    【讨论】:

    • 好的,你想避免左递归是自上而下的解析器吗?
    • @Pieces:对于自上而下的解析器,您希望使用右递归。对于自下而上的解析器,通常首选左递归。
    猜你喜欢
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多