编译原理学习一:flex,bsion工具使用
2016-07-05 12:25
357 查看
先尝试用它来做一个计算器(内容来自于自制编程语言——前桥和弥)
一、准备工作
关于flex, bsion工具,建议还是linux平台安装使用比较方便,我在windows下尝试过,太麻烦。
在ubuntu下安装很简单,只要执行下列语句即可:
没有报错就说明安装成功。
二、词法分析部分
创建mycalc.l
三、语法分析部分
创建mycalc.y
四、生成执行文件
执行上述语句后,可以在目录中看到mycalc程序。
五、测试
一、准备工作
关于flex, bsion工具,建议还是linux平台安装使用比较方便,我在windows下尝试过,太麻烦。
在ubuntu下安装很简单,只要执行下列语句即可:
sudo apt-get install flex bison flex -h bison -h
没有报错就说明安装成功。
二、词法分析部分
创建mycalc.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); } %%
三、语法分析部分
创建mycalc.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); } 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 const *str) { extern char *yytext; fprintf(stderr, "parser error near %s\n", yytext); return 0; } int main(void) { extern int yyparse(void); extern FILE *yyin; yyin = stdin; if(yyparse()) { fprintf(stderr, "Error ! Error ! Error !\n"); exit(1); } }
四、生成执行文件
bison --yacc -dv mycalc.y flex mycalc.y gcc -o mycalc y.tab.c lex.yy.c
执行上述语句后,可以在目录中看到mycalc程序。
五、测试
./mycalc 1+3*5 >>16 q lexical error.
相关文章推荐
- Android 高级UI设计笔记20:RecyclerView 的详解之RecyclerView添加Item点击事件
- 【数据结构】顺序队列
- 应用直接中断连接导致数据被锁(生产故障)
- 应用直接中断连接导致数据被锁(生产故障)
- Swap Nodes & Reverse Nodes in k-Group
- Unity3D优化之Draw Call Batching
- css 一些灵动性的小方法
- JavaScript取得标准的系统时间
- 如何通过Dynamics CRM 2015修改用户密码
- vmtools的安装 vim使用和配置
- 小波变换
- Redis源码解析:27集群(三)主从复制、故障转移
- 视图必须派生自 WebViewPage 或 WebViewPage<TModel>
- 依赖库arr包,提交到Nexus搭建的Maven私服,编译过程中出现的问题:错误: 编码GBK的不可映射字符
- Unity3D性能优化
- Linux下检测SSH暴力破解***与防护功能
- [2016/07/05] LeetCode / Java - Day 12 -
- oracle gateways 访问 sql server
- PHP 设计模式
- Duilib 使用Zip 资源