最近在自学《编译原理》,感觉对于我来说有点难度。

写这个的目的是为了做笔记,感谢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做词法分析相关推荐

  1. 编译原理 yacc lex 制作一个计算器

    这篇文档是我从别的地方摘抄的,留给自己以后回忆使用.(写的非常详细!) Flex工具的使用方法 Lex 是一种生成扫描器的工具. Lex是Unix环境下非常著名的工具,主要功能是生成一个扫描器(Sca ...

  2. 编译原理-如何使用flex和yacc工具构造一个高级计算器

    Flex工具的使用方法 Lex 是一种生成扫描器的工具. Lex是Unix环境下非常著名的工具,主要功能是生成一个扫描器(Scanner)的C源码. 扫描器是一种识别文本中的词汇模式的程序. 这些词汇 ...

  3. 【编译原理】学习笔记1 词法分析

    进行词法分析,打印分析结果. 编译器是一个程序:输入字符串,输出目标代码. 词法分析: 读入源码字节,将其组成有意义的TOKEN流. 语法分析: 根据TOKEN流构建树形的中间表示. 语义分析: 检查 ...

  4. 《编译原理》(三)词法分析

    hello大家好,今天我们来学习词法分析.教妹学编译原理,没见过这么酷炫的标题吧?"语不惊人死不休",没错,标题就是这么酷炫. 我的妹妹小埋18岁,校园中女神一般的存在,成绩优异体 ...

  5. 编译原理(3):词法分析

    声明:本系列文章,是根据中国大学MOOC网 哈工大的编译原理 这门课学习而成的学习笔记. 一.正则表达式 正则表达式 语言是一个集合,因此我们可以在语言上进行多种集合运算.比如说并运算,乘积运算(即连 ...

  6. 编译原理——编写LEX文件:一个能识别所有运算式中包含的符号

    目录 题目 1.首先需要有一个flex.exe文件 2.在这个文件中写.l文件 3.win+r打开cmd命令 (1)进入flex.exe文件所在文件夹 (2)使用dir命令查看目录中的文件 4.生成l ...

  7. 编译原理(一)之词法分析

    词法分析 (1)参考附录1设计一个简单语言的词法分析程序,要求能够处理注释.换行回车.部分复合运算符(如>=). (2)设计并实现含多条简单赋值语句的语法分析程序,要求有一定的出错提示与错误恢复 ...

  8. Keil 编译器AC6中的LLVM编译原理

    关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 Keil MDK中使用的是Arm编译器(Arm Compiler),目前主要是AC5和AC6. 而A ...

  9. 公式计算机实现,编译原理:实现容易数学公式排版

    编译原理:实现简单数学公式排版 这是大三下上编译原理时老师要求做的大作业 1.实验具体要求[题目和测试程序来自 李卫海老师:http://staff.ustc.edu.cn/~whli] 一.     ...

最新文章

  1. php 魔术方法 说明
  2. 让页面先发送ajax,Ajax, 了解一下
  3. java怎么使用log函数_在使用couenne求解器的spyder中使用logof函数
  4. python手机版ios-iOS 项目中如何使用 Python
  5. Cmd Markdown 公式指导手册
  6. python 中有趣的库tqdm
  7. android弹出选择usb,android 解决:默认情况下用于该USB设备 自动获取USB操作权限...
  8. linux终端xwindow,如何从命令行重新启动X Window Server?
  9. vue里写三元判断绑定class和style
  10. 开源在线文档编辑工具_开源暑期实习,在线教育新工具等
  11. win7家庭版更改桌面图标
  12. Nuget包管理工具(程序包控制台执行语句)
  13. euraka resttemplate
  14. 综合布线(楼栋)设计报告
  15. h5 app跳转客服咨询 临时会话 (没有开通在线咨询、无法会话)
  16. python时间模块详解(time模块)
  17. 介绍理想工作计算机 英语作文,我的理想工作(My Ideal Job)
  18. c语言单片机温度调节系统设计,基于单片机的温度控制系统的设计
  19. 数据库的增删改查的一个例题
  20. Python全栈(八)Flask项目实战之6.前台注册功能开发

热门文章

  1. MySQL高级-SQL优化步骤
  2. Java IO的一些列子
  3. 不均匀正负样本分布下的机器学习
  4. 面试中经常会被问到的70个问题
  5. 用Convert类实现数据类型转换
  6. dicom传图像故障
  7. 生成网站缩略图代码(C#)
  8. linux添加Mib库,Linux SNMP中的管理信息库(MIB)学习
  9. mysql 监控工具安装_Mysql监控工具Innotop工具安装
  10. oracle 自治事物,自治事务 - 努力创造未来! - BlogJava