首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当运算符分组为非终结符时,Bison shift-reduce冲突

当运算符分组为非终结符时,Bison shift-reduce冲突
EN

Stack Overflow用户
提问于 2013-01-25 10:30:44
回答 1查看 590关注 0票数 0

假设我的语法中有以下规则。

代码语言:javascript
复制
expr: expr op expr
    | NUMBER

op: '+' | '-' | '*' | '/'

我已经完成了以下声明

代码语言:javascript
复制
%token NUMBER

%left '+' '-'
%right '*' '/'

这会导致4个shift-reduce冲突

代码语言:javascript
复制
State 12

    4 expr: expr . op expr
    4     | expr op expr .

    '+'  shift, and go to state 6
    '-'  shift, and go to state 7
    '*'  shift, and go to state 8
    '/'  shift, and go to state 9

    '+'       [reduce using rule 4 (expr)]
    '-'       [reduce using rule 4 (expr)]
    '*'       [reduce using rule 4 (expr)]
    '/'       [reduce using rule 4 (expr)]
    $default  reduce using rule 4 (expr)

    op   go to state 11

但是,如果我将语法重写为

代码语言:javascript
复制
expr: expr '+' expr
    | expr '-' expr
    | expr '*' expr
    | expr '/' expr
    | NUMBER

优先级规则生效,冲突得到解决。我认为冲突的产生是因为当bison遇到op时,它不会跟踪转移到堆栈中的前一个op。有没有一种方法可以将所有运算符组合在一起,同时仍然解决冲突?

EN

回答 1

Stack Overflow用户

发布于 2013-01-25 10:45:42

显然,这里已经回答了这个问题,1

通过对运算符进行分组,会丢失优先级信息。

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

https://stackoverflow.com/questions/14514424

复制
相关文章

相似问题

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