首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决reduce reduce冲突:

如何解决reduce reduce冲突:
EN

Stack Overflow用户
提问于 2012-05-27 11:23:58
回答 1查看 318关注 0票数 3

以下(简化的) Bison语法会产生一个reduce reduce冲突:

代码语言:javascript
复制
expr
    :    '(' expr ')'
    |    ID
    |    fn
    ;

arg_list
    :    ID
    |    arg_list ID
    ;

fn
    :    '(' ')' fnbody
    |    '(' arg_list ')' fnbody
    ;

fnbody
    :    '{' '}'
    ;

我看到了问题--只有一个先行标记,不可能区分(an_id'(' expr ')'还是fn。但是我该如何解决它呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-27 14:23:44

最简单的答案就是在解析器中使用更多的先行检查--或者使用btyacc之类的东西,或者使用bison的%glr-parser选项。

第二种选择是在词法分析器中添加lookahead --在本例中,在返回')'标记之前,查看下一个标记是否为'{',然后返回一个特殊标记,告诉您即将结束的是arg_list,而不是带括号的表达式,或者将这两个标记作为单个标记返回,并适当地修改语法。

第三个选择是考虑语法因素。这并不总是很容易,而且可能会扩大语法的规模。基本思想是识别冲突的规则,并将它们组合成解析器可以识别的单个规则,并推迟选择最终构造是什么,直到您看够了。

在此示例中,您将为冲突情况添加新规则:

代码语言:javascript
复制
expr_or_fnhead:  '(' ID ')'  ;

它可以是表达式,也可以是fn的开头,然后修改其他规则以使用它。fn规则变为:

代码语言:javascript
复制
fn :  '(' ')' fnbody               /* 0 arg function */
   |  expr_or_fnhead fnbody        /* 1 arg function */
   |  '(' ID arg_list ')' fnbody   /* 2+ arg function */
   ;

expr规则更为复杂:

代码语言:javascript
复制
expr       : ID
           | non_ID_expr
           ;
non_ID_expr: '(' non_ID_expr ')'
           | expr_or_fnhead
           | fn
           ;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10771437

复制
相关文章

相似问题

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