用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的格式为:
按照YACC的源程序规则由题中所给文法写出trans.y
Code
我所使用的YACC工具是bision,执行 bison trans.y得到trans.tab.c,然后对.c文件进行编译得到trans.tab.exe可执行文件。
最后测试一下就OK了。
最后结果很明显是正确的。
注:上面的代码并不是严格按照课本上的方法做的(严格按照课本上的做法会出错,需要在一些地方做一些修改。)
要求
通过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了。
最后结果很明显是正确的。
注:上面的代码并不是严格按照课本上的方法做的(严格按照课本上的做法会出错,需要在一些地方做一些修改。)
相关文章推荐
- Python的几种实现
- 完美解决IE8有两个进程的问题
- xml 文件介绍
- soap请求数据
- LINUX下SQLPLUS无法使用删除及上下键
- 为什么有这么多 Python版本
- ANDROID BASE64编码解码
- NSURLSession下载文件—断点续传
- docker的使用
- 在JQuery的validate功能中使用remote实现Ajax功能后台验证
- android 中Handler 引起的内存泄露
- 02-Git命令行演练-个人开发
- POJ 3468 A Simple Problem with Integers (splay)
- Spring的作用、Struts的作用、Hiberante的作用
- win8 64位使用plsql developer连接oracle数据库问题
- html li标签前面添加图标三种方法
- 实验三 进程调度模拟程序
- Mac下编译Android以及goldfish内核
- MySQL命令大全
- 【工具优化】Windows版Vim的优化设置