flex是windows下词法分析工具,lex是linux下词法分析工具,bison是windows下的语法分析工具,而yacc对应为linux下的语法分析工具,flex和bison如何配置网上教程一搜一大把。
如图所示
先定义了一个二义性文法
%%
exp:n|exp '+' exp;
n:'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'|'0';
%%
int main()
{
yyparse();
return 0;
}
经过命令行编译后,发现了移进归约冲突,于是报错。test.y.txt contains 1 shift/reduce conflict.
正确的带上语义的代码
%{
#include<malloc.h>;
int yylex();
void yyerror(const char* s);
%}
%left'+'
%%
lines:line
|line lines
;
line:exp '\n' {printf ("value=%d\n",$1);}
;
exp:n {$$=$1;}
|exp '+' exp {$$=$1+$3;}
n:'1'{$$=1}
|'2'{$$=2;}
|'3'{$$=3;}
|'4'{$$=4;}
|'5'{$$=5;}
|'6'{$$=6;}
|'7'{$$=7;}
|'8'{$$=8;}
|'9'{$$=9;}
|'0'{$$=0;}
;
%%
int main()
{
yyparse();
return 0;
}
int yylex()
{
return getchar();
}
void yyerror(const char *s)
{
fprintf(stderr,"%s\n",s);
return;
}