c语言lr分析器的设计与实现_编译原理——词法分析器的设计和实现(包含可视化)...

过了个五一小假期,调整了一下心情做完了前久积攒的作业,感觉甚是轻松。前久困扰我的事情已经尘埃落定了,也有了新的发展目标。开这个专栏本意就是把本科期间做过的有意思的课程作业放上来大家一起学习进步,淘了淘把编译原理排上号了,接下来的几篇文章应该都是与之相关的~感谢大家阅读!代码用的是MFC,框架简单上手快,还是大二数据结构课设的时候助教教的,很实用。MFC程序的设计需要遵循面向对象的原则,简单来说就是要把你实现的程序封装成类,这样就可以在它生成的对话框类中建立有关该类的对象并完成功能函数的调用。

PS:代码真的很简单,因为当时老师要求手写这个过程所以就放上来了。通常分词可以用正则表达来做,不用自己一个字符一个字符的手写。可能可视化方面会比较有意思吧。有什么不对的地方还请批评指正,谢谢~


一、实验目标

1、了解形式语言与自动机理论在计算机中的应用。

2、了解计算机对语言的处理方式,并能掌握词法分析的原理。

3、在上述基础上,编写词法分析器。这里我实现了对51个符号的识别。

二、设计说明

1. 功能设计及原理说明

1.1 实验原理

(1) 编译程序

通常编译程序的流程为如下所示:

581f030ad5ff426c08e91b08074ab26a.png
编译程序的流程——by hallucination

(2) 词法分析的用处和要点

词法分析的要点在于识别字符串并进行分类。由此可知,词法分析是编译程序的第一步,也是往下进行其他步骤的基础。在本次课程中识别的字符如下:

e96bb2bf30250e3ac3ffa549688ae555.png

1.2 功能模块

(1)预处理模块

该部分主要是完成对注释的处理和多余空格的处理,方便接下的处理。

959b041f6b63b3dde97f4d149b6ce663.png
其实就是一个读文件并处理文件的操作——by hallucination

(2)界符处理模块

该部分主要是完成对界符的处理和判断。

0ad7caef2caee9c5b459bcef7dd99547.png
涉及到状态转移,有点像自动机——by hallucination

(3)运算符的处理

该部分主要是完成对运算符的处理和判断。除调用函数换为is_operator()之外,处理流程与界符处理函数一致。

(4)字母开头的字符串处理

该部分主要是完成对字母开头的字符串的处理和判断。

5b43c4d47c0ba7820e03b0dedd834692.png

(5)数字字符串的处理

该部分的处理方式与字母的处理相类似,该字符串全是数字就识别为数字,否则识别为其他。

2. 详细代码

该部分主要介绍了进行词法分析的类的结构。

class 

三、测试/调试过程

1. 调试环境

Visual Studio 2103professional 的集成开发环境,图形界面主要是利用MFC来完成。

2. 调试过程

由于在MFC里把所有的操作函数和操作对象都定义成了Malex类,所以只需分别调试每个类函数即可。最后调用CPOE(ifstream)函数处理整个流程即可。

3. 使用流程

(1)双击打开运行程序出现如下界面。

c184dd45d741335b970a8d8e6375c702.png

(2)点击预处理按钮,选择预处理的文件。(注:此处为.cpp类型,可在测试函数文件夹下选)

da94b59bba75bbd0e69e7d3ae01ec4a9.png

(3)打开文件后点击词法分析即可。

a69666e7917e4c592b92e3250b438cab.png

四、结论

1、本次词法分析完成了51个符号的识别(不包括标识符),以及单行注释的预处理过程。

2、还包括了< >处理成界符还是运算符的不同情况下的处理。

3、经测试后本程序在上述条件下正确。

总结:该词法分析器能完成12个界符,19个运算符,20个保留字的识别。

五、参考资料

[1]陈火旺﹒《编译原理》(第三版)﹒国防工业出版社

[2]谭浩强.《C++程序设计》(第二版).北京:清华大学出版社,2014-4

[3]严蔚敏,吴伟民.《数据结构》(C语言版).北京:清华大学出版社,2015-5

[4]侯俊杰.《深入浅出MFC》(第二版).武汉.华中科技大学出版社.2002-9

[5]姚领田.《精通MFC程序设计》.北京.人民邮电出版社.2005

KristinKong/CompileTheory-LexicalAnalysis​github.com
081fcbec95f4f2cf2db5a2051066b058.png
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值