编译原理实验一:单词的词法分析程序设计

(注:这是我第一次尝试写博客,也是为了对自己的学习生活的一种记录,写的如果有不好的地方请大家帮忙提出来,我会坚持写下去哒!)

1.1实验内容

目的:

  • 通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

要求:

  • 选择常用高级程序设计语言(如 PL/0语言)的源程序作为词法分析对象。
  • 根据教学要求和学生具体情况,从PL/0语言中选取它的一个适当大小的子集,可以选取一类典型单词,也可以尽可能使各种类型的单词都能兼顾到。其基本要求是:设计出给定程序设计语言的词法规则,以文本文件形式输入源程序,并对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词;并把其转换成属性字输出到文件中。

1.2实验分析

(刚接触这个实验的时候我觉得是很抽象的东西,可能当时对编译原理的学习也不是很精,但写完之后我发现,这对编译原理的学习还是很有好处的)

经过思考我们可以知道,高级程序设计语言的单词分为如下五类:关键字、标识符、运算符、无符号数、界限符。而本次实验的要求——构造词法分析程序,其主要就是对上述五类单词的识别,说的更详细一点呢,就是该程序要对源程序的一个个字符进行分析,识别出该字符或字符串是属于哪一类的单词,并将结果以二元式的形式输出,以便后续的语法分析等工作。

(好像也没有什么好说的了,那就放两张流程图叭)

总体流程图:

无符号数设计流程图:

(好了下面就展示一下代码啦,不过在验收的时候发现自己的代码有不足的地方,刚开始的时候思路没想好,导致在进行词法分析的过程中,刚开始对源程序进行预处理的时候,我把所有的空格都去除了,虽然这样在这个小实验中还是能够完成所需要的功能的,但是是一种不好的想法,大家在这部分可以自己思考完善)

1.3实验代码

关键字、界限符、运算符的定义

void Adefine(){//关键字keyword["begin"] = "begin";keyword["call"] = "call";keyword["const"] = "const";keyword["do"] = "do";keyword["end"] = "end";keyword["if"] = "if"; keyword["odd"] = "odd";keyword["procedure"] = "procedure";keyword["read"] = "read";keyword["var"] = "var";keyword["while"] = "while";keyword["write"] = "write";keyword["then"] = "then";//运算符keyword["+"] = "plus";keyword["-"] = "minus";keyword["*"] = "mul";keyword["/"] = "div";keyword["="] = "eql";keyword["<>"] = "neq";keyword["<"] = "less";keyword[">"] = "greater";keyword["<="] = "leq";keyword[">="] = "geq";keyword[":="] = "becomes";//界限符keyword["("] = "lparen";keyword[")"] = "rparen";keyword["["] = "lmiddlebracket";keyword["]"] = "rmiddlebracket";keyword[","] = "comma";keyword[";"] = "semicolon";keyword["."] = "period";
}

常数的识别

         int p = 0, j = 0, e = 1;word = str[i++];while (isdigit(str[i])) {word += str[i++];}if (str[i] == '.') {word += str[i++];if (isdigit(str[i])) {word += str[i++];while (isdigit(str[i])) {word += str[i++];}if (str[i] == 'e') {word += str[i++];if (str[i] == '-'||((str[i]!='-')&&(str[i]!='+'))) {word += str[i++];if (isdigit(str[i])) {word += str[i++];while (isdigit(str[i])) {word += str[i++];}Anode[m].name = "number";Anode[m++].word1 = word;}else {cout << "error!输入的常数部分错误!e后面应为正数或负数!请检查!   " << endl;break;}}else {word += str[i++];}}else {Anode[m].name = "number";Anode[m++].word1 = word;}}else {cout << "error!输入的常数部分错误!小数点符号后面应为数字!请检查!" << endl;break;}}else if (str[i] == 'e') {word += str[i++];if (str[i] == '-' || ((str[i] != '-') && (str[i] != '+'))) {word += str[i++];if (isdigit(str[i])) {word += str[i++];while (isdigit(str[i])) {word += str[i++];}Anode[m].name = "number";Anode[m++].word1 = word;}else {cout << "error!输入的常数部分错误!e后面应为正数或负数!请检查!" << endl;break;}}else {word += str[i++];}}else if (isalpha(str[i])) {cout << word<<str[i]<<"标识符错误!" << endl;break;}else {Anode[m].name = "number";Anode[m++].word1 = word;}i--;

对标识符的识别

         word = str[i];i++;while (isalpha(str[i]) || isdigit(str[i])) {word += str[i];i++;}iter = keyword.find(word);//判断是否为关键字if (iter != keyword.end()) {Anode[m].name = keyword[word];Anode[m].word1 = word;m++;}//否则为标识符else {Anode[m].name = "ident";Anode[m].word1 = word;m++;}i--;

这里仅仅给出的是部分的代码,欢迎大家指出问题和不足,我们一起进步。

编译原理实验一:单词的词法分析程序设计相关推荐

  1. 编译原理实验三【中间代码生成程序设计】

    基本要求: ①掌握中间代码生成的基本方法. ②掌握语法制导翻译模式. ③完成算术表达式的中间代码生成程序. 重点及难点:掌握语法制导翻译模式的核心思想和工作原理,在此基础上完成基于算数表达式的中间代码 ...

  2. 编译原理实验一 词法分析程序设计与实现

    一.实验目的 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符流形式的源程序转化为一个由各类单词构成的序列的词法分析方法. 二.基本实验内容与要求 假定一种高级程序 ...

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

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

  4. 编译原理实验三 语义分析程序设计与实现

    一.实验目的 在实现词法.语法分析程序的基础上,编写相应的语义子程序,进行语义处理,加深对语法制导翻译原理的理解,进一步掌握将语法分析所识别的语法范畴变换为某种中间代码(四元式)的语义分析方法,并完成 ...

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

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

  6. 词法分析程序的设计(编译原理实验一)

    词法分析程序的设计(编译原理实验一) 一.实验内容 ​ 编制一个能够分析三种整数.标识符.主要运算符和主要关键字的词法分析程序. 二.实验要求 编写程序,识别如下单词符号 标识符 <字母> ...

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

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

  8. [编译原理]DO-WHILE循环语句的翻译程序设计(LR(1)方法、输出四元式)C++实现

    题目: DO-WHILE循环语句的翻译程序设计(LR(1)方法.输出四元式) 1 课设任务概述 初始条件: ​ 理论:完成编译原理,数据结构.高级编程语言.汇编语言等相关课程的学习,基于计算机专业知识 ...

  9. 实验一  简单词法分析程序设计

    实验一 简单词法分析程序设计   一.实验目的 了解词法分析程序的基本构造原理,掌握词法分析程序的手工构造方法. 二.实验内容 1.了解编译程序的词法分析过程. 2.根据PASCAL语言的说明语句形式 ...

  10. 编译原理实验:自上而下语法分析

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

最新文章

  1. Linux tcpdump命令详解与Wireshark
  2. npm-debug.log文件出现原因
  3. Debian,Ubuntu下安装zsh和oh-my-zsh
  4. arduino i2c 如何写16位寄存器_树莓派3B开发Go语言(二)寄存器版本GPIO
  5. Spring Boot Cache之缓存
  6. 【AI视野·今日CV 计算机视觉论文速览 第188期】Wed, 23 Dec 2020
  7. 关于ASP.NET给产品分类,分页,详情页生成静态页面
  8. 【国产MCU移植】看看有没有你需要的,一起来查漏补缺吧!(附已报名的硬件)...
  9. 双极性电压测量电路 负电压测量电路 正负电压测量电路 运放OP07运用 加法器 电压跟随器
  10. 数字逻辑练习题(二)
  11. 【Linux】rm -rf 删除命令
  12. 【趣味实践】Stable Diffusion绘制中秋美景
  13. VC++ 操作Word(使用微软office控件)
  14. exsi 无法打开虚拟机 执行此操作的权限被拒绝[解决]
  15. [转]在数学的海洋中飘荡
  16. 新手上路——树莓派3B+换源
  17. centos 磁盘重新分区操作实践
  18. js 判断是否为 Android IOS IPAD IPHONE 等移动设备访问
  19. 移动支付模式再添新军:指纹支付
  20. Apple M1芯片版Mac系统重装教程

热门文章

  1. 淘宝用户行为数据分析
  2. 对union的遍历运算
  3. 无人车之美——论无人车辆系统的软件架构
  4. Netron 可视化Pytorh模型架构
  5. 苹果笔记本怎么找文件夹_教你如何在苹果电脑上查看隐藏文件夹
  6. Django - 安装wagtail
  7. 学习进度总结----蔡强130201201
  8. 喜提JDK的BUG一枚!多线程的情况下请谨慎使用这个类的stream遍历。
  9. “单细胞”中研究APC/CCDH1失活调控细胞周期起始的分子机制
  10. 一级域名 二级域名,三级域名概念 -- linux内核