课堂实验题
要求
通过YACC构造能够识别台式计算器表达式的文法的语法分析程序
文法:
E–>E+T|E-T|T
T–>T*F|F
F–>(E)|DIGIT分析
YACC的工作流程是:
1.L语言的YACC源程序trans.y 通过YACC编译器生成trans_tab.c
2.trans_tab.c通过C语言编译器生成trans_tab.exe
trans_tab.exe就是我们需要的语法分析器。
trans.y的格式为:
说明部分
%% 翻译规则 %%
用C语言编写的辅助例程
按照YACC的源程序规则由题中所给文法写出trans.y
- Code
%{
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
%}
%token DIGIT
%%
line :expr'\n' { printf("%d\n",$1);return;}
;
expr :expr'+'term { $$=$1+$3;}
|expr'-'term { $$=$1-$3;}
|term
;
term :term'*'factor {$$=$1*$3;}
|factor
;
factor :'('expr')' {$$=$2;}
|DIGIT
;
%%
main(){
return yyparse();
}
int yylex(){
int c;
while ((c=getchar())==' ');
if(isdigit(c)){
yylval=c-'0';
return DIGIT;
}
return c;
}
int yyerror(char *s){
fprintf(stderr,"%s\n",s);
return 1;
}
我所使用的YACC工具是bision,执行 bison trans.y得到trans.tab.c,然后对.c文件进行编译得到trans.tab.exe可执行文件。
最后测试一下就OK了。
最后结果很明显是正确的。
注:上面的代码并不是严格按照课本上的方法做的(严格按照课本上的做法会出错,需要在一些地方做一些修改。)