您的位置:首页 > 其它

用YACC构造简单语法分析器

2015-12-02 21:23 274 查看
课堂实验题

要求

通过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了。



最后结果很明显是正确的。

注:上面的代码并不是严格按照课本上的方法做的(严格按照课本上的做法会出错,需要在一些地方做一些修改。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: