当运营商被分组为非终端时,野牛转移减少冲突

时间:2013-01-25 02:30:44

标签: bison yacc

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

expr: expr op expr
    | NUMBER

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

我已完成以下声明

%token NUMBER

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

这导致

处的4次移位减少冲突
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

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

expr: expr '+' expr
    | expr '-' expr
    | expr '*' expr
    | expr '/' expr
    | NUMBER

优先规则启动并解决冲突。我相信冲突的产生是因为当野牛遇到op时,它不会跟踪转移到堆栈中的先前op。有没有办法可以将所有操作员分组并仍然解决冲突?

1 个答案:

答案 0 :(得分:1)

显然,这里已经回答1

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