野牛优先权不起作用

use*_*183 3 bison

这是我的flex代码

%{
 #include "fl.tab.h"
%} 
    %% 
    [0-9]+  { yylval = atoi(yytext); 
        return INTEGER; } 
    \n  return 0;   
    [ \t]   ;   
    .   return yytext[0];
    %% 
Run Code Online (Sandbox Code Playgroud)

还有我的野牛代码

%{ 
    #include <stdio.h> 
%} 
%token INTEGER
%left '+' '-'
%left '*'
%% 
Statement : expr {printf("%d\n",$1);}
        ;
expr :  expr '+' INTEGER  {$$ = $1 + $3;}
     |  expr '-' INTEGER  {$$ = $1 - $3;}
     |  expr '*' INTEGER  {$$ = $1 * $3;}        
     |  INTEGER {$$ = $1;}
     ;
%% 

int main(void){
   yyparse();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我输入4 + 5*2时它输出为18.但是正确的答案应该是14.我在哪里弄错了?

小智 7

你的问题是expr OP INTEGER每个规则都有.

你有它的方式野牛解析它:

expr * 2 -> (4 + 5) * 2
Run Code Online (Sandbox Code Playgroud)

它强制优先级向左移动而不是由优先级规则确定的优先级.

优先级仅适用于解析文本的方法不止一种,而不是您拥有的方法

expr :  expr '+' expr  {$$ = $1 + $3;}
     |  expr '-' expr  {$$ = $1 - $3;}
     |  expr '*' expr  {$$ = $1 * $3;}        
     |  INTEGER {$$ = $1;}
     ;
Run Code Online (Sandbox Code Playgroud)

这种方式5 + 4 * 2可以解析为((5 + 4) * 2)或者(5 + (4 * 2)),并且bison将查询优先级以确定正确的解析.