1、 实验1、2要求独立完成。实验3、实验4的实现代码(VC+工程)均已调试成功,打包在目录中(lab3,lab4)。希望认真学习的同学多看看。由于时间关系,许多地方还没来得及做好,本手册的内容可能比较繁琐。欢迎大家提出问题和意见。时间比较紧的同学也请关注每个实验末尾的实验报告要求。期末实验占10分。 实验1 词法分析1.1. 目的 构造词法分析器,熟悉编译程序词法分析过程。掌握 LEX 自动生成工具的使用。1.2. 内容 从本实验开始,用C语言实现一个编译系统。词法分析是其第一步。采用Lex工具自动生成大大简化了其中的内容。因此本实验的重心并不在如何操作,而是在于怎样编写Lex源程序。而要编写L
2、ex源程序,首先要定义源语言,即该编译系统所实现的语言。这里作为例子,我们以C+为基础,采用其部分单词,因此不妨将我们定义的这种语言称之为Mini C+。1.3. 知识 Lex是一个词法分析器的自动构造工具。相关资料较多。1.4. 步骤1、 在编写LEX源程序前,首先要定义一种高级语言。找出其中所有单词。并进行编码。高级语言可以是已经存在的一种语言,如,C,Pascal,Basic。也可以是自己构造的一种语言。当然,考虑到后续实现的难度,可以简化许多内容。如不考虑数组,不考虑For循环等。将定义好的单词编码用一个表表达出来。如我们这里的Mini C+的单词定义如下: 保留字 内部编码 运算符号
3、 其他符号内部编码if 1 + 8 ( 19 else 2 - 9 ) 20 while 3 * 10 ;21 cout 4 / 11 22 cin 5 * 12 23 (输入) 6 = 13 = 24 binCL lexyy.c 如:VC安装在D:”Program Files”下。则命令为: D:Program FilesMicrosoft Visual StudioVC98BinCL lexyy.c(3) 使用TC命令行工具。 binTCC lexyy.cTC20binTCC lexyy.c6、 写一段该语言测试代码进行测试。如:While (i2)CoutA + - MB * / C *
4、“(“ “)” /此括号非彼括号,故用引号括起来。 $num /经过词法分析,数字被认为是终结符。 非终结符定义符号定义算术表达式消除左递归的算术子表达式优先级为3的子项消除左递归且优先级为3的子项优先级为2的子项消除左递归且优先级为2的子项优先级为1的子项优先级的编号越小,其运算(归约)的次序先。2.3.2. 基于LEX自动构造器地词法分析程序的重构(任选) 对于大型编译系统而言,往往存在多遍扫描的可能性。将词法分析程序构造成独立的过程有很大的好处。 但对于我们这个小型的文本计算器而言。将词法分析构造成依附于语法分析的子过程可能更加合理。因此我们需要对词法分析程序进行重构。 本实验只要求实现表达式的求值。因此,只需要使用原来集合的部分单词。 对词法分析程序进行重构,使之成为语法分析程序的子程序。通过全局变量的方式加工数据,输入表达式串,输出编码及属性序列,分别存放在两个全局的整型数组中。 因此需要作如下变更:(1) 单词的编码在语法分析和词法分析中都需要,因而同一集中在一个头文件token.h中。以后,无论是词法、语法、语义分析,均用这套编码。 以下是部分语句:#ifndef TOKEN/* 终结符定义 */#define $add 20 /* + */#d