实验目的

通过实现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. UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别
  2. PaddleOCR——C++服务端部署Visual Studio 2019 环境下CMake 编译错误【无法打开输入文件paddle_fluid.lib】解决方案
  3. 【CSS实现Loading遮罩】点击按钮,弹出一个DIV层窗口
  4. 《剑指offer》数组中重复的数字
  5. SAP CRM BCSet activation debug
  6. Nginx基本功能及其原理
  7. 在 里面_适合县城里面加盟的鞋店推荐
  8. C++ new 的三种面貌
  9. Python标准库--time模块的详解
  10. 2021陆川高考成绩查询,陆川中考成绩查询2021
  11. 干货:完全基于情感词典的文本情感分析
  12. 面试官:你背了几道面试题就敢说熟悉Java源码?对不起,我们不招连源码都不会看的人
  13. 用u盘装linux系统的操作全程图解,笔者教你用u盘装系统的操作全程图解
  14. 深入浅出的讲解傅里叶变换(真正的通俗易懂)
  15. Python多项逻辑回归用LogisticRegression识别英文字母数据集letter-recognition.data
  16. 简普科技Q3财报解读:业绩超过预期之后的更多确定性
  17. 车牌归属地 API数据接口
  18. TF-IDF算法及实现
  19. (vector)堆积木
  20. chrome顶部变黑_黑暗模式来了!最新版Chrome浏览器让你的网页通通变黑(内附设置教程)...

热门文章

  1. 完美解决 Git-Failed to connect to github.com port 443问题
  2. macos 系统固件 路径_Mac OSX 系统目录结构
  3. 常用留学查校渠道汇总
  4. echarts 3D地球实现自动旋转
  5. Okhttp上传文件实现
  6. arcgis浮雕效果
  7. 【Python笔记】倾向评分匹配(Propensity Score Matching)实战
  8. 16进制字符串与JPG图片互转
  9. C++中一些细微的比较
  10. 推荐系统算法原理:向量空间和欧几里得距离的应用