词法分析器作为编译器的一个重要组成部分,原理很简单,代码也都没什么技术含量,但是如果让你手工写一个词法分析器,哪怕是一个简单的词法分析器,工作量无疑是巨大的。现代的词法分析器一般都是依靠工具自动生成,这里我们选用flex生成词法分析器,下面是用到的flex的下载地址。windows的环境的话,lex.exe文件使我们所需要的工具。里面的帮助文档将教会你如何更好的使用flex。

学习编译原理并非一定要做一个完美的编译器,我们所需要的只是了解编译器的工作原理并能运用这些特性写出更高效合法的程序,因此我们只用lex的一些简单功能写一个简单的词法分析器来印证我们所学的知识。下图是lex的使用步骤简要说明:

这里的源文件是符合lex的语句,flex 的输入文件由三段组成,用一行中只有%%来分隔。

定义;definition
%%
规则;rules
%%
用户代码;code

这个源文件输出的就是词法分析器的C语言源程序,编译这个.c的源程序生成的就是你所定义语言的词法分析器。

这里我们用一个简单的例子来做一个简单的词法分析器,词法规则符合《编译原理及实践教程》中描述的sample语言。

下面是Source文件

%{
#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;
}

这里我们把Source源文件保存为lex.l
通过在命令行模式下输出命令 lex lex.l 生成lex.yy.c文件,这就是我们的词法分析器的源代码了,打开看看,吃惊吧,这么简单的语言的词法分析程序竟然需要这么多代码,还好我们不用手工写。编译这个源程序,得到 lex.yy.exe,测试一下

OK,简单词法分析器就完成了。

欢迎转载,转载注明出处

LEX自动生成词法分析器相关推荐

  1. 利用Flex自动生成C语言词法分析器

    利用Flex自动生成C语言词法分析器 Flex介绍 C语言词法规则 具体实现 源代码 测试代码 实验结果 Flex介绍   1975年Mike Lesk和实习生Eric Schmidt设计并实现了一个 ...

  2. C代码工具--自动生成enum值和名字映射代码

    这年头好像继续做C语言的人不多了,年轻人大多去互联网和移动应用.确实,那两个领域现在来钱快,且总是供不应求.就说刚刚在一个旧同事的微信群里,有人刚放出自己有团队可以做App几分钟,哇塞,好几个人说有项 ...

  3. 自动生成马斯克的推特几乎无破绽!MIT用GPT-2模型做了个名人发言模仿器

    铜灵 发自 凹非寺 量子位 出品 | 公众号 QbitAI 模仿各路名人的推特行文,现在可以分分钟做到. MIT的研究科学家.深度学习课老师Lex Fridman做了一个新应用: DeepTweets ...

  4. java语言生成语法分析_语法分析器自动生成工具一览

    最近打算重做以前的一个留下遗憾的工作,当中的一项小任务就是要求编写一个简易SQL语言的语法分析器. 本科的<编译原理>课程依稀在我脑中留下些许映象.当初的课程大作业是写一个叫Dicuf(貌 ...

  5. IDEA自动生成对象所有set方法

    idea中有一款插件能够生成对象所有的set方法,GenerateAllSetter :下载地址 步骤1:将下载好的压缩包放在自己记得的文件夹中,在idea中进行导入 步骤2:在本地选中刚才的压缩包, ...

  6. IDEA中根据数据库自动生成实体类,并自定义所生成的实体类中的注解 @Table @Id @...

    使用IDEA项目添加Hibernate扩展,生成实体类并配置实体类中的注解 一.使用Hibernate自动生成实体类 1.在项目上右键,选择Add Framework Support找到 Hibern ...

  7. IDEA自动生成类注解,IDEA作者信息自动生成,IDEA类信息自动生成

    在新建类文件的时候自动生成注解,诸如我们常见的那些 作者,创建时间,TODO 等等 将以下格式的代码放在Settings -> File and Code Templates -> Inc ...

  8. FastAPI 自动生成的docs文档没法使用

    FastAPI 自动生成的docs文档没法使用,当展开路径时候一直在转圈,具体就是这样 这个是由于swagger-ui 3.30.1 中的bug导致,具体bug可以看这里 我们可以通过在FastAPI ...

  9. 自动生成低精度深度学习算子

    自动生成低精度深度学习算子 深度学习模型变得越来越大,越来越复杂,由于其有限的计算和能源预算,部署在低功耗电话和IoT设备上变得充满挑战.深度学习的最新趋势是使用高度量化的模型,该模型可对输入和几位权 ...

最新文章

  1. winxp运行html代码,关于WinXP系统实现自动化运行的操作技巧
  2. 关卡设计快速入门P_4. 放置Actor
  3. 为了在 Windows 上安装 GCC
  4. 深夜,我用python爬取了整个斗图网站,不服来斗
  5. [JS]图片自动切换效果(学习笔记)
  6. I - Crossword Answers
  7. 解决css中height:100%失效的问题
  8. 《Ray Tracing in One Weekend》——Chapter 12: What's next?
  9. L2-027 名人堂与代金券 (25 分)—团体程序设计天梯赛
  10. 浏览器背后的运行机制
  11. STM32中RTC唤醒停止模式
  12. 第五章、Zigbee模块的数据传输
  13. 7年阿里Java人教你:秒杀活动就应该这样玩?
  14. iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
  15. 关于微信小程序danmu-List所遇到的坑
  16. 原腾讯QQ技术总监、T13专家,黄希彤被裁,原因竟是不愿意被 PUA ?
  17. 最右ollvm字符串混淆还原
  18. openwrt 透明代理上网
  19. 持续更新 BUUCTF——PWN(二)
  20. 任正非接班人李一男离开华为时给属下的忠告

热门文章

  1. 基于高分辨率影像城市绿地信息提取_[转]ENVI支持下利用高分辨率影像城市绿地信息提取方案...
  2. 42. 通俗易懂大数据实时计算Storm教程
  3. 新手项目:黑马旅行网(踩坑bug集合以及笔记)
  4. 北斗导航 | ION GNSS+ 2014到 ION GNSS+ 2017会议论文下载:ION 美国导航学会
  5. 在线传输文件的方法有哪些?镭速云帮您领略最快文件传输的攻略!
  6. 亲测有效,一招解决错误:This application failed to start because not Qt platform plugin could be initialized.
  7. 【Azure Data Platform】ETL工具(22)——Azure Databricks与ADF整合
  8. python使用第三方函数库_Python(七)python下的内部函数库和第三方函数库
  9. Redis Desktop Manager 运行时报0xc000007b
  10. android关于讯飞语音包的开发