首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除reduce/reduce冲突

如何删除reduce/reduce冲突
EN

Stack Overflow用户
提问于 2013-09-15 22:14:19
回答 1查看 1K关注 0票数 0

我试图解决几个yacc错误,在得到冲突后,我的几次尝试都是徒劳的: reduce/reduce problems.And。举个例子,我正在试着解决"string FOr更多的0而不是1“,我写了下面的代码,它显示了reduce/reduce冲突(我在这里只给出了规则部分):

代码语言:javascript
复制
    s   :   s1 ';'   {printf("valid");exit(0);}
        ;
    s1  :   '0' '1' '0' s   
        |   '0' '0' '1' s
        |   '1' '0' '0' s
        |   '0' s
        | 
        ;

谁能告诉我在这里我做错了什么,如果你在未来建议我如何从这个错误中恢复,我将不胜感激。

谢谢,

EN

回答 1

Stack Overflow用户

发布于 2013-09-16 02:40:18

您使用的是右递归而不是左递归。通常,左递归在Bison和Yacc语法中是首选的。在s1规则中使用s而不是s1也有点奇怪。

详细的输出文件(bison -v rrconf.y生成rrconf.output)如下所示:

代码语言:javascript
复制
State 20 conflicts: 1 reduce/reduce
State 21 conflicts: 1 reduce/reduce

Grammar

    0 $accept: s $end

    1 s: s1 ';'

    2 s1: '0' '1' '0' s
    3   | '0' '0' '1' s
    4   | '1' '0' '0' s
    5   | '0' s
    6   | /* empty */

...

state 20

    2 s1: '0' '1' '0' s .
    5   | '0' s .

    ';'       reduce using rule 2 (s1)
    ';'       [reduce using rule 5 (s1)]
    $default  reduce using rule 2 (s1)


state 21

    4 s1: '1' '0' '0' s .
    5   | '0' s .

    ';'       reduce using rule 4 (s1)
    ';'       [reduce using rule 5 (s1)]
    $default  reduce using rule 4 (s1)

可以很容易地将语法更改为使用左递归:

代码语言:javascript
复制
%%
s   :   s1 ';'   {printf("valid");exit(0);}
    ;
s1  : s1 '0' '1' '0'
    | s1 '0' '0' '1'
    | s1 '1' '0' '0'
    | s1 '0'
    | 
    ;
%%

它给你留下了两个shift/reduce冲突(比reduce/reduce冲突要轻得多):

代码语言:javascript
复制
State 5 conflicts: 2 shift/reduce

Grammar

    0 $accept: s $end

    1 s: s1 ';'

    2 s1: s1 '0' '1' '0'
    3   | s1 '0' '0' '1'
    4   | s1 '1' '0' '0'
    5   | s1 '0'
    6   | /* empty */

...


state 5

    2 s1: s1 '0' . '1' '0'
    3   | s1 '0' . '0' '1'
    5   | s1 '0' .

    '0'  shift, and go to state 7
    '1'  shift, and go to state 8

    '0'       [reduce using rule 5 (s1)]
    '1'       [reduce using rule 5 (s1)]
    $default  reduce using rule 5 (s1)

这对你来说是否足够,我不确定。

不过,您还有另一个问题--高级算法设计问题。输入10个1,然后输入11个0符合0大于1的要求,但此语法无法识别。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18813361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档