编译原理:用lex/flex做词法分析
最近在自学《编译原理》,感觉对于我来说有点难度。
写这个的目的是为了做笔记,感谢https://blog.csdn.net/xiaowei_cqu/article/details/7760927这篇文章的原创作者,接下来的内容也是这篇文章里的内容,如有侵权请联系删除。(只是为了做个笔记)
Lex语言格式:
说明部分 /*包含模式宏定义和C语言的说明信息*/
%%
规则部分 /*转换识别*/
%%
用户代码 /*规则动作部分所需的辅助过程的C代码*/
状态转换图如下:
运行环境:直接在cygwin里面安装了flex/lex来运行的,感觉还不错。
$ lex --version
lex 2.6.4
$ gcc --version
gcc (GCC) 6.4.0
1.编写一个Lex程序。该程序拷贝一个文件,并将文件中的每个非空的空白符序列替换为单个空格
lex程序:
%{%}%%[ \t]+ {printf(" ");}//表示遇到连续多个空白符(或制表符),则替换为一个空格符,编译时请删除此注释
\n|. {printf("%s",yytext);}//表示其余的语句均照常打印出来,编译时请删除此注释%%#pragma comment(lib,"y1.lib")
int main(void)
{yyin=stdin;return yylex();
}
编译后生成的lex.yy.c过长,此处不做展示。进行操作的输入文件如下:
My name is RT. space
UPC University.
Hello world !
整体的编译运行结果:
Toa@DESKTOP-499IG24 ~
$ lex a.lToa@DESKTOP-499IG24 ~
$ gcc lex.yy.c -lflToa@DESKTOP-499IG24 ~
$ ./a.exe < a.txt
My name is RT. space
UPC University.
Hello world !
可以看出,词法分析的结果中删除了多余的空格。
2.编写一个Lex程序。该程序拷贝一个C文件,并将程序中的关键字float的每个实例替换成double
lex程序:
%{%}%%
//表示如果是在双引号(")中(即为字符串),则照常打印,编译时请删除此注释
\".*\" {printf("%s",yytext);}
[^ \t\n]+ {printf("%s",yytext);}
//表示如果遇到float,且附加模式是后面跟有空白符,则将float替换为double,编译时请删除此注释
float/[ \t]+ {printf("double");}
\n|. {printf("%s",yytext);}
%%#pragma comment(lib,"y1.lib")
int main(void)
{yyin=stdin;return yylex();
}
测试用的a.txt文件内容:
My name is RT. space
float UPC University.
Hello world !
float a = 12345.0;
int b = 10;
整体的编译与运行:
Toa@DESKTOP-499IG24 ~
$ lex a.lToa@DESKTOP-499IG24 ~
$ gcc lex.yy.c -lflToa@DESKTOP-499IG24 ~
$ ./a.exe < a.txt
My name is RT. space
double UPC University.
Hello world !
double a = 12345.0;
int b = 10;
3.识别字符串https://blog.csdn.net/u014708761/article/details/49725343
%{
#include<math.h>
#include<stdlib.h>
#include<stdio.h>
%}DIGIT [0-9]
ID [a-z][a-z0-9]*
%%
{DIGIT}+ {printf("整数: %s(%d)\n",yytext,atoi(yytext));}
{DIGIT}+"."{DIGIT}+ {printf("实数: %s(%g)\n",yytext,atof(yytext));}
if|then|begin|end|program|while|repeat {printf("关键字: %s\n",yytext);}
{ID} {printf("标识符: %s\n",yytext);}
"+"|"-"|"*"|"/" {printf("运算符: %s\n",yytext);}
"{"[^}\n]*"}";
[\t\n\x20]+;
. {printf("不能识别的字符:%s\n",yytext);}
%%
int main(int argc,char **argv)
{++argv;--argc;if(argc>0) yyin=fopen(argv[0],"r");else yyin=stdin;yylex();return 0;
}
int yywrap()
{return 1;
}
输入的文本文件:
aword
bword
cword
awor
3.212
123123
234
编译与运行:
Toa@DESKTOP-499IG24 ~
$ lex a.lToa@DESKTOP-499IG24 ~
$ gcc lex.yy.c -lflToa@DESKTOP-499IG24 ~
$ ./a.exe < a.txt
标识符: aword标识符: bword标识符: cword标识符: awor实数: 3.212(3.212)整数: 123123(123123)整数: 234(234)
编译原理:用lex/flex做词法分析相关推荐
- 编译原理 yacc lex 制作一个计算器
这篇文档是我从别的地方摘抄的,留给自己以后回忆使用.(写的非常详细!) Flex工具的使用方法 Lex 是一种生成扫描器的工具. Lex是Unix环境下非常著名的工具,主要功能是生成一个扫描器(Sca ...
- 编译原理-如何使用flex和yacc工具构造一个高级计算器
Flex工具的使用方法 Lex 是一种生成扫描器的工具. Lex是Unix环境下非常著名的工具,主要功能是生成一个扫描器(Scanner)的C源码. 扫描器是一种识别文本中的词汇模式的程序. 这些词汇 ...
- 【编译原理】学习笔记1 词法分析
进行词法分析,打印分析结果. 编译器是一个程序:输入字符串,输出目标代码. 词法分析: 读入源码字节,将其组成有意义的TOKEN流. 语法分析: 根据TOKEN流构建树形的中间表示. 语义分析: 检查 ...
- 《编译原理》(三)词法分析
hello大家好,今天我们来学习词法分析.教妹学编译原理,没见过这么酷炫的标题吧?"语不惊人死不休",没错,标题就是这么酷炫. 我的妹妹小埋18岁,校园中女神一般的存在,成绩优异体 ...
- 编译原理(3):词法分析
声明:本系列文章,是根据中国大学MOOC网 哈工大的编译原理 这门课学习而成的学习笔记. 一.正则表达式 正则表达式 语言是一个集合,因此我们可以在语言上进行多种集合运算.比如说并运算,乘积运算(即连 ...
- 编译原理——编写LEX文件:一个能识别所有运算式中包含的符号
目录 题目 1.首先需要有一个flex.exe文件 2.在这个文件中写.l文件 3.win+r打开cmd命令 (1)进入flex.exe文件所在文件夹 (2)使用dir命令查看目录中的文件 4.生成l ...
- 编译原理(一)之词法分析
词法分析 (1)参考附录1设计一个简单语言的词法分析程序,要求能够处理注释.换行回车.部分复合运算符(如>=). (2)设计并实现含多条简单赋值语句的语法分析程序,要求有一定的出错提示与错误恢复 ...
- Keil 编译器AC6中的LLVM编译原理
关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 Keil MDK中使用的是Arm编译器(Arm Compiler),目前主要是AC5和AC6. 而A ...
- 公式计算机实现,编译原理:实现容易数学公式排版
编译原理:实现简单数学公式排版 这是大三下上编译原理时老师要求做的大作业 1.实验具体要求[题目和测试程序来自 李卫海老师:http://staff.ustc.edu.cn/~whli] 一. ...
最新文章
- php 魔术方法 说明
- 让页面先发送ajax,Ajax, 了解一下
- java怎么使用log函数_在使用couenne求解器的spyder中使用logof函数
- python手机版ios-iOS 项目中如何使用 Python
- Cmd Markdown 公式指导手册
- python 中有趣的库tqdm
- android弹出选择usb,android 解决:默认情况下用于该USB设备 自动获取USB操作权限...
- linux终端xwindow,如何从命令行重新启动X Window Server?
- vue里写三元判断绑定class和style
- 开源在线文档编辑工具_开源暑期实习,在线教育新工具等
- win7家庭版更改桌面图标
- Nuget包管理工具(程序包控制台执行语句)
- euraka resttemplate
- 综合布线(楼栋)设计报告
- h5 app跳转客服咨询 临时会话 (没有开通在线咨询、无法会话)
- python时间模块详解(time模块)
- 介绍理想工作计算机 英语作文,我的理想工作(My Ideal Job)
- c语言单片机温度调节系统设计,基于单片机的温度控制系统的设计
- 数据库的增删改查的一个例题
- Python全栈(八)Flask项目实战之6.前台注册功能开发