这是我的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将查询优先级以确定正确的解析.
| 归档时间: |
|
| 查看次数: |
3024 次 |
| 最近记录: |