实验目的

通过实现PL/0语言(一种示例小语言)的词法分析器,理解词法分析过程,掌握程序各部分之间的接口安排。

分析与设计

程序的输入直接使用经过预处理之后的程序,读取文件到数组buffer。(预处理程序在上一篇文章)

遍历buffer的每一行,对每一行进行提取子串,判断子串是否是关键字、标识符、常数、算符或者界符

对于关键字和标识符:将所有关键字存放于一个数组keyWords当中,当识别出一个由字母组成的字符串时,遍历keyWords数组,判断是否是关键字,如果不是就判定字符串为标识符。(关键字的种别设为A0-A10共十一个,标识符设为ID)

对于常数:将识别出来的由常数构成的字符串判定为常数(种别设为CONST)

对于算符和界符:没读取一个字符,先判断是否是算符或者界符(种别设为B0-B13,共十四个)

部分状态转换图

识别单词的关键代码

//对每一行进行词法分析  for(int i=0;i<n;i++){int flag=0; //标识开始位置 for(int j=0;j<buffer[i].length();j++){//判断单个字符是否为算符或者界符 if(buffer[i][j]=='+') cout<<"(B0,-)"<<endl;else if(buffer[i][j]=='-') cout<<"(B1,-)"<<endl;else if(buffer[i][j]=='*') cout<<"(B2,-)"<<endl;else if(buffer[i][j]=='/') cout<<"(B3,-)"<<endl;else if(buffer[i][j]=='=') cout<<"(B4,-)"<<endl;else if(buffer[i][j]=='#') cout<<"(B5,-)"<<endl;else if(buffer[i][j]=='<') cout<<"(B6,-)"<<endl;else if(buffer[i][j]=='>') cout<<"(B7,-)"<<endl;else if(buffer[i][j]==':'){cout<<"(B8,-)"<<endl;j++; //跳过下一个字符 }else if(buffer[i][j]=='(') cout<<"(B9,-)"<<endl;else if(buffer[i][j]==')') cout<<"(B10,-)"<<endl;else if(buffer[i][j]==',') cout<<"(B11,-)"<<endl;else if(buffer[i][j]=='.') cout<<"(B12,-)"<<endl;else if(buffer[i][j]==';') cout<<"(B13,-)"<<endl;if(IsLetter(buffer[i][j]) && flag==0){flag=1; string str="";//存放识别出的子串str+=buffer[i][j];j++;while(IsLetter(buffer[i][j])){str+=buffer[i][j];j++;}//判断识别出来的子串是否是关键字if(Reserve(str)==-1) cout<<"(ID,"<<str<<")"<<endl;else cout<<"(A"<<Reserve(str)<<",-)"<<endl;flag=0; //将flag置为0,识别下一个子串 j--; //指针后退一个 } if(IsDigit(buffer[i][j]) && flag==0){flag=1;string str="";str+=buffer[i][j];j++;while(IsDigit(buffer[i][j])){str+=buffer[i][j];j++;}cout<<"(CONST,"<<str<<")"<<endl;flag=0;j--;} } }//zww

词法分析器的运行结果

编译原理实验一PL/0词法分析器c++相关推荐

  1. 编译原理-实验四-LR(0)语法分析程序的设计

    一.实验目的 了解LR(0)语法分析算法的基本思想,掌握LR(0)语法分析程序的构造方法. 二.实验内容 根据LR(0)语法分析算法的基本思想,设计一个对给定文法进行LR(0)语法分析的程序,并用C. ...

  2. 编译原理三级项目PL/0的研究与改进

    PL/0的研究与改进 1.扩充else语句 if-then-else语句的EBNF范式描述 <条件语句>:=if<条件>then<语句>[else <语句&g ...

  3. 编译原理 实验四 LR(0)分析法(LR0分析表的自动生成)

    写在前面 由于代码较长,csdn对文章总长度有字数限制,想只看完整代码的请移步另一篇博客. https://blog.csdn.net/qq_46640863/article/details/1257 ...

  4. html解析器编译原理,编译原理实验报告词法分析器(内含源代码).docx

    编译原理实验报告词法分析器(内含源代码) 编译原理实验(一) --词法分析器 实验描述 运行环境:vc++2008 对某特定语言A ,构造其词法规则. 该语言的单词符号包括: 1该程序能识别的单词符号 ...

  5. c语言词法分析器实验原理,词法分析器的设计与实现 编译原理实验报告.doc

    词法分析器的设计与实现 编译原理实验报告 中北大学软件学院 实 验 报 告 专 业 软件工程 课程名称 编译原理 学 号 姓 名 辅导教师 张静 成绩 实验日期2015.5.19实验时间14:00~1 ...

  6. 编译原理实验(三)——LR(0)语法分析

    编译原理实验(三)--LR(0)语法分析 实验要求 参考程序 实验结果 程序输入说明 截图 实验要求 根据LR(0)分析法编写一个语法分析程序 直接输入根据已知文法构造的分析表M;对于输入的文法和符号 ...

  7. 编译原理实验:词法分析

    编译原理实验:词法分析 1. 实验题目:词法分析 实验目的 实验内容 实验要求 输入输出 2. 设计思想 3.算法流程 4. 源程序 5. 调试数据 1. 实验题目:词法分析 实验目的 根据PL/0语 ...

  8. 编译原理实验c语言cfg文法,编译原理

    地址在符号表中引入指针previous,来连接上一个符号的首地址运行时存储空间组织活动记录用于管理函数变量的信息栈式存储过程进入和返回通过变更top和sp指针,实现活动记录的栈式处理静态链实现局部变量 ...

  9. 编译原理实验二:赋值语句的语法分析程序设计

    编译原理实验二:赋值语句的语法分析程序设计 1.1实验内容 目的: 在前面实验的基础上,通过设计.编制.调试一个典型的赋值语句的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查,进一步掌握 ...

最新文章

  1. intent的startActivityForResult()方法
  2. python适合做后端开发吗-pythonWeb后端开发好呢?还是从事网络爬虫比较好呢?
  3. 开发工具之pycharm 快捷键说明
  4. Java获取当前时间,并转化为String类型
  5. Maximum XOR Sum 系列问题
  6. 八种基本排序方式(插入排序,希尔排序,选择排序,冒泡排序,快速排序,堆排序,归并排序,基数排序)代码模板以及时间复杂度
  7. oracle长连接超时设置
  8. 避开使用XAML的性能陷阱
  9. matlab中怎么画五维图,使用MatLab绘制散点图的方法
  10. MyEclipse6.5的反编译插件的安装
  11. 中国制造业加速拥抱云计算 产业规模达1500亿
  12. UITableView分割线
  13. 【前端安全】JavaScript防http劫持与XSS (转)
  14. css3 圣诞红包雨效果
  15. office, pdf, cad 等在线预览
  16. VOS中客户在设置服务器防火墙时需要打开哪些 VOS 应用端口
  17. 阿里,昨天被主管告知3.25了,感觉自己好失败...
  18. java圈子_从JAVA入了这个圈子,有多少老司机和他一样?
  19. 一维卷积的意义和二维卷积(图像处理)的简单理解
  20. chalk5.0.0不支持require()导入问题

热门文章

  1. PHY6252 GPIO控制
  2. 张勇将专职阿里云 蔡崇信成阿里集团新掌舵人
  3. js对象:从万物皆对象说起
  4. 解决Strut2下载名称显示中文乱码的问题
  5. php rename函数_php使用rename()函数移动文件
  6. 东莞最好的割双眼皮医院
  7. 读《蔡康永的说话之道》-表现自己,体现别人
  8. 再见时不要轻易说さようなら
  9. 用C#语言实现记事本(Windows程序设计作业3)
  10. 用C语言判断键盘输入了多少字符