前言:这是我学习编译原理,课程实验的内容,课程早已结束,现整理发表。

一、实验任务

  1. 阅读已有编译器的经典词法分析源程序;
  2. 用C或JAVA语言编写一门语言的词法分析器。

二、实验内容

  1. 阅读已有编译器的经典词法分析源程序。
    选择一个编译器,如:TINY或PL/0,其它编译器也可(需自备源代码)。阅读词法分析源程序,理解词法分析程序的构造方法——状态图代码化。尤其要求对相关函数与重要变量的作用与功能进行稍微详细的描述。若能加上学习心得则更好。

  2. 根据该语言的关键词和识别的词法单元以及注释等,确定关键字表,画出所有词法单元和注释对应的DFA图。

  3. 仿照前面学习的词法分析器,编写选定语言的词法分析器。

  4. 准备2~3个测试用例,要求包含正例和反例,测试编译结果。


三、词法分析

tiny词法解析

  • tiny的记号
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wJ6ecD1t-1652207597408)(//img-blog.csdn.net/20180320191736472)]

可以看出,tiny语言的记号很少,毕竟只是简单的语言。但一开始时想——这些怎么存的,又是怎么判断的,我一开始也是很懵逼的,记得我当时也是花了一下午看了tiny的词法分析源码和实验给的文档,才弄懂该怎么写,然后回到宿舍一晚上就在tiny的基础上改写完了。<( ̄︶ ̄)>

简单的说,记号就是一个语言的分类,当你读取字符串的时候,你总得识别出这一段字符串是什么,是什么类型的,所以你按某个规则读完玩一段字符,你就该判断这段字符是什么,是否有错,怎么归类,而记号就是你用来归类的标准。

  • 状态转换

然后既然有了类型,那怎么判断类型呢?用DFA转换图。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rWtjvRsv-1652207597410)(//img-blog.csdn.net/20180320192847106)]

这个转换如很简单,START 开始状态,INNUM 数字,INID 字符串,+-*/=<(); 特殊符号,DONE 状态,从开始状态根据又一次 读取第一个字符,根据读取的字符转换状态,进入某个状态后,当读取的下一个字符不符合当前状态的类型,就不读取字符,而读取完的这段字符串,当是某个类型。判断完这段字符串,又一次 重复操作,直到读取所有字符。

把需要判断的状态都加上时,就成了tiny的词法分析转换图。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3IaU0Sti-1652207597410)(//img-blog.csdn.net/20180320194322525)]


四、程序设计

我写的词法分析其实就是在tiny基础上稍加修改而已,词法设计这部分大致相同。

记号

保留字:
cin while then cout end
特殊字符:
= + - * / ( ) ; >> <<
注释:
{这是注释}

转换表
参照上面

代码解析

  • 宏定义最大匹配字符变量的长度为40
    保留字为5个
#define MAXTOKENLEN 40
#define MAXRESERVED 5
  • 定义一个枚举类型,用于表示dfa的状态集
typedef enum { //DFA状态集START,INCOMMENT,INNUM,INID,ININ,INOUT,DONE
} stateType;
  • 定义个枚举类型,表示根据输入的字符串匹配到的字符串类型。
typedef enum { //用于匹配的类型,判断输入/* 异常状态 */ENDFILE,ERROR,/* 保留字 */CIN,COUT,WHILE,THEN,END,/* DFA状态 */ID,NUM,/* 特殊符号 */IN,OUT,EQ,PLUS,MINUS,TIMES,OVER,LPAREN,RPAREN,SEMI
} tokenType;
  • 定义一个结构体,用于根据匹配到的保留字输出保留字。
static struct //保留字结构体,用于输出
{const char *str;tokenType tok;
} reservedWords[MAXRESERVED] = {{"cin", CIN},{"while", WHILE},{"then", THEN},{"cout", COUT},{"end", END}};
  • 定义一个返回值为bool类型的函数,判断输入字符是否为字母。
bool isLetter(char c) //是否为字符
{if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')){return true;}else{return false;}
}
  • 判断匹配的字符串是否为保留字。
static tokenType reservedLookup(char *s)
{for (int i = 0; i < MAXRESERVED; i++)if (!strcmp(s, reservedWords[i].str))return reservedWords[i].tok;return ID;
}
  • 根据匹配到的字符类型输出字符串。
void printToken(tokenType token, const char tokenString[]); //输出函数
  • 匹配字符串的函数。
void getToken(string ss); // 词法分析

五、实验测试

  • 输入
{sdfs
adf}
cin  >>{sdfsadf} x;
{sdfsadf}
cin>>y;
while (cin>>z) then{sdfsadf}
x=x z y;
cout << x;
end;
  • 输出
1:{sdfs
2:adf}
3:cin  >>{sdfsadf} x;3: reserved word:cin3: >>3: ID, name= x3: ;
4:{sdfsadf}
5:cin>>y;5: reserved word:cin5: >>5: ID, name= y5: ;
6:while (cin>>z) then{sdfsadf}6: reserved word:while6: (6: reserved word:cin6: >>6: ID, name= z6: )6: reserved word:then
7:x=x z y;7: ID, name= x7: =7: ID, name= x7: ID, name= z7: ID, name= y7: ;
8:cout << x;8: reserved word:cout8: <<8: ID, name= x8: ;
9:end;9: reserved word:end9: ;

六、实验总结

实际上刚写这篇博客的时候我有点虚,因为不怎么记得tiny的语法分析怎么回事了,只能硬着头皮有看了下实验文档,然后才慢慢回想起来。然后就是你们看到的博客了。

当时我确实是花了下午2,3个小时看这实验的文档的,看实验文档,看tiny源代码,慢慢理解究竟是怎样的,然后规划自己要改成什么样的,实验内容那部分我删改了些,有部分内容要求是我们确定了我们的语言后,就鼓励我们自己定义一门语言,我当时就是想写们专门计算数学的语言,也就才有了这样的输入。

然后事实上,并不好写,尤其是要写整个前端的情况下,越发的力不从心,我后面的实验深刻理解到了这一点,然后没有坚持写出自己的语言,事实上也没有一个同学写出自己的语言的整个前端,不是tiny就是pl改的。

还有,我也是在这里入了枚举和结构体的坑,然后有次实验代码疯狂用了结构体,搞得结构很复杂,总之,如果你们还看我后面实验的的代码,你就知道什么叫做丧心病狂了。。。


七、资料下载

具体代码见mathLex

编译原理——词法分析程序相关推荐

  1. 编译原理----词法分析程序----python语言版

    对python的应用还是不熟练,很多实用的方法没掌握,下面的程序本来是用C写的,为了练习一下python,又用python改写的,很粗糙,有bug,不过能运行出结果,嘿嘿,以后学好了python再来优 ...

  2. 编译原理 词法分析 算符优先分析法

    编译原理 词法分析 算符优先分析法 实验目的 加深对语法分析器工作工程的理解,加强对算符优先分析法实现语法分析程序的掌握:能够采用一种编程语言实现简单的语法分析程序:能够使用自己辨析的分析程序对简单的 ...

  3. 编译原理词法分析程序设计

    编译原理词法分析程序设计 1.   课程设计目的: 结合讲授内容,设计与实现一个简单词法分析器,通过设计编制调试一个具体的词法分析程序,加深对词法分析程序的功能及实现方法的理解.并掌握在对程序设计语言 ...

  4. java实现词法分析_编译原理(词法分析) Java 实现

    编译原理(词法分析) Java 实现 编译原理(词法分析) Java 实现 1. 项目目录 2. 需要解释的源代码 PROGRAM SOURCE; /*定义变量*/ VAR X, Y, Z:INTEG ...

  5. c++实现编译原理词法分析实验(含代码)

    c++实现编译原理词法分析实验(含代码) 一.实验目的: 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解.并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法. ...

  6. 编译原理词法分析实验

    目录 实验内容描述 实验设计 输入输出形式 样例输入和样例输出 实验设计原理(步骤) 主要函数和辅助函数 核心代码截图 实验结果 可以找我代做,包满分.QQ1975728171可以写完整实验报告 实验 ...

  7. 编译原理---词法分析

    词法分析的原理 词法分析是编译程序进行编译时第一个要进行的任务,主要是对源程序进行编译预处理之后,对整个源程序进行分解,分解成一个个单词,这些单词有且只有五类,分别时标识符.关键字(保留字).常数.运 ...

  8. 编译原理——词法分析

    根据上课内容顺序写的博客,并不是按照书的目录来的 使用龙书以及编译程序设计原理(第二版)金成植.金英编著 老师的PPT是英文的,我自己随便翻的,不一定对 文章目录 词法分析(scanning) 概述 ...

  9. 编译原理——词法分析(1)

    在我们学习词法分析时,就会思考如何构造一个词法分析器? 一个词法分析器可以通过手工构造:也可以通过以下方式自动生成一个词法分析器:向一个词法分析器生成工具描述出词素的模式,然后将这些模式编译为具有动词 ...

  10. 编译原理——语法分析程序的设计

    实验目的 通过设计.编制.调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析中预测分析方法. 实验内容 设计一个文法的预测分析程序,判断特定 ...

最新文章

  1. Nacos 1.0.0 GA,架构、功能与 API 设计全面重构
  2. 未发现数据源名称_在Power BI中管理数据源Analysis Services
  3. 【Pytorch神经网络基础理论篇】 07 线性回归 + 基础优化算法
  4. 虚拟光驱的开发者斟酌了很久
  5. Goland的常用快捷键
  6. 小子注入,怎么使用呢?
  7. AllenNLP框架学习笔记(模型篇之保存与加载)
  8. 医院建筑综合布线方案特点
  9. 计算机屏幕显示故障,计算机显示器常见故障的原因和解决方法
  10. HEVC(H.265)与AVC(H.264)的区别与联系
  11. wint_t和wchar_t区别putwchar()iswalpha()iswcntrl()iswdigit()iswpunct()
  12. 如何通过AWS VPC Peering云服务,解决公共云的局限性?
  13. 一个有效管理者的11 面镜子(ZT)
  14. 惠普喷墨打印机卡纸了
  15. 块存储、文件存储和对象存储三者的区别
  16. 均值已知检验方差_χ2检验教案:独立性检验的z统计量
  17. 用计算机时按错了按什么键恢复出厂设置,电脑开机按什么键进入一键还原 选择高级—将系统恢复到过去某...
  18. Unity 动作包的使用方法
  19. 【String-easy】657. Robot Return to Origin 机器人能否回到原点
  20. 集合框架,JDK8新特性

热门文章

  1. java写入到excel表格乱码怎么办,数据库导出excel表格是乱码-java导出excel表格乱码!...
  2. C#调用默认浏览器打开网页的几种方法
  3. MySQL 清除表空间碎片
  4. K Simple question (第十届山东理工大学ACM网络编程擂台赛 正式赛)
  5. 六大机构好评的Teradata 究竟有哪些过人之处?
  6. RAID 技术全解 – RAID0、RAID1、RAID5、RAID10
  7. 档案查询系统php,档案信息管理系统 v2.0
  8. 二元隐函数求二阶偏导_多元函数隐函数微分 二阶偏导的求法
  9. python 分析单细胞数据教程 scanpy---初探
  10. Python小程序(1)--汇率换算器