《自制编程语言》笔记:使用yacc与lex制作简单计算器
2015-07-09 19:43
666 查看
1、代码
1.1)test.l
1.2)test.y
1.3)Makefile (因为是在linux环境下,所以使用了Makefile)
2、编译与运行
2.1)编译
2.2)运行
1、代码(也可以在我的百度网盘下载:http://pan.baidu.com/s/1o65k7v8)
1.1)lex文件 test.l
1.2)yacc文件text.y
1.3)Makefile文件(其实不用Makefile的,我这里为了每次编译和清除的时候方面才使用的,以下的命令可以分三步手动执行,原著里面就是手动执行的)
2、编译与运行
2.1)编译
2.2)运行
来源:《自制编程语言》第二章
百度百科:http://baike.baidu.com/link?url=WC3BGKHo7gMEuPbxrX8Wsa6-KD69HLbRjd6TnmGPZNcq9j7xtgZxXh7RPufn2ISHIwW6A8Zri6Qt_5xViF9Vi_
豆瓣:http://book.douban.com/subject/25735333/
1.1)test.l
1.2)test.y
1.3)Makefile (因为是在linux环境下,所以使用了Makefile)
2、编译与运行
2.1)编译
2.2)运行
1、代码(也可以在我的百度网盘下载:http://pan.baidu.com/s/1o65k7v8)
1.1)lex文件 test.l
%{ #include <stdio.h> #include "y.tab.h" int yywrap(void) { return 1; } %} %% "+" return ADD; "-" return SUB; "*" return MUL; "/" return DIV; "\n" return CR; ([1-9][0-9]*)|0|([0-9]+\.[0-9]*) { double temp; sscanf(yytext, "%lf", &temp); yylval.double_value = temp; return DOUBLE_LITERAL; } [ \t] ; . { fprintf(stderr, "lexical error.\n"); exit(1); } %%
1.2)yacc文件text.y
%{ #include <stdio.h> #include <stdlib.h> #define YYDEBUG 1 %} %union { int int_value; double double_value; } %token <double_value> DOUBLE_LITERAL %token ADD SUB MUL DIV CR %type <double_value> expression term primary_expression %% line_list : line | line_list line ; line : expression CR { printf(">>%lf\n> ", $1); fflush(stdout); } expression : term | expression ADD term { $$ = $1 + $3; } | expression SUB term { $$ = $1 - $3; } ; term : primary_expression | term MUL primary_expression { $$ = $1 * $3; } | term DIV primary_expression { $$ = $1 / $3; } ; primary_expression : DOUBLE_LITERAL ; %% int yyerror(char * str) { extern char * yytext; fprintf(stderr, "parser error near %s\n", yytext); return 0; } int main(void) { extern int yyparse(void); extern FILE * yyin; printf("> "); fflush(stdout); yyin = stdin; if (yyparse()) { fprintf(stderr, "Error ! Error ! Error !\n"); exit(1); } }
1.3)Makefile文件(其实不用Makefile的,我这里为了每次编译和清除的时候方面才使用的,以下的命令可以分三步手动执行,原著里面就是手动执行的)
.PHONY : dummy all : dummy yacc -dv test.y lex test.l gcc -o test lex.yy.c y.tab.c clean : dummy rm -rf lex.yy.c test y.output y.tab.c y.tab.h
2、编译与运行
2.1)编译
$ make yacc -dv test.y lex test.l gcc -o test lex.yy.c y.tab.c
2.2)运行
$ ls lex.yy.c Makefile readme.txt test test.l test.y y.output y.tab.c y.tab.h $ ./test > 1 + 2 * 3-4+2*3/7 >>3.857143 > q lexical error.
来源:《自制编程语言》第二章
百度百科:http://baike.baidu.com/link?url=WC3BGKHo7gMEuPbxrX8Wsa6-KD69HLbRjd6TnmGPZNcq9j7xtgZxXh7RPufn2ISHIwW6A8Zri6Qt_5xViF9Vi_
豆瓣:http://book.douban.com/subject/25735333/
相关文章推荐
- C++ priority_queue
- Algorithms—58.Length of Last Word
- C++ HOJ 二阶魔方
- C# 工具库
- JAVA注解
- Python: The _imagingft C module is not installed错误的解决
- 小胖学PHP总结4-----PHP的字符串操作
- php的优缺点
- 深入理解Java:SimpleDateFormat安全的时间格式化
- Java MessageFormat.format 特殊符号、单引号
- 将字符串转化为数字的python实现
- java String.subString用法
- java集合(上)
- 【SSH异常系列】The Struts dispatcher cannot be found.
- 性能测试JMeter趟的坑之JMeter的bug:TPS周期性波动问题
- eclipse运行程序报error executing aapt错误的解决方案
- springMvc时间格式化
- 小胖学PHP总结3-----PHP的循环语句
- Eclipse中和编辑相关的快捷键
- 8. Laravel5学习笔记:在laravel5中使用OAuth授权