词法分析程序+语法语义分析四元式生成+实验报告

上传人:F****n 文档编号:100180841 上传时间:2019-09-22 格式:DOCX 页数:38 大小:238.53KB
返回 下载 相关 举报
词法分析程序+语法语义分析四元式生成+实验报告_第1页
第1页 / 共38页
词法分析程序+语法语义分析四元式生成+实验报告_第2页
第2页 / 共38页
词法分析程序+语法语义分析四元式生成+实验报告_第3页
第3页 / 共38页
词法分析程序+语法语义分析四元式生成+实验报告_第4页
第4页 / 共38页
词法分析程序+语法语义分析四元式生成+实验报告_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《词法分析程序+语法语义分析四元式生成+实验报告》由会员分享,可在线阅读,更多相关《词法分析程序+语法语义分析四元式生成+实验报告(38页珍藏版)》请在金锄头文库上搜索。

1、编译原理实验报告本文档集合了编译原理大作业的实验报告加代码实验主要内容为用C+实现了词法分析程序;语法语义以及四元式生成程序代码见附录,复制进VS后程序绝对可编译执行。文档代码为原创,谨慎使用(姚砺的大作业)实 验 设 计 一一、实验名称 词 法 分 析 程 序二、实验目的(1)设计一个词法分析程序,每调用一次就从源程序文件中顺序识别出一个单词符号,并返回该单词符号的内部编码、单词符号自身、行列位置信息。(2)要能处理单行注释。 三、实验内容及要求单词种类与识别规则(1) 标识符:首字符为字母或下划线,其后由字母、数字或下划线组成、长度不超过255个字符;(2) 整数:由1到8个数字组成。(3

2、) 小数:数字串1 . 数字串2,其中:数字串1由1-8个数字符组成; 数字串2由0-8个数字符组成,即:数字串2可以为空。(4) 字符串:由一对“”括起来的符号串,长度不超过255个字符;(5) 保留字:if、else、while、do、integer、float、string、input、output、and、or、function、end、def、as、begin(6) 数学运算符: 、*、/、= (7) 比较运算符: 、=、=(8) 逻辑运算符: and、or(9) 分隔符: 、(、)、;、, 四、实验环境操作系统:Win7/其他编译工具:VC+6.0/CFree /VS2012五、设

3、计 1设计大体思路将读取的文件采用一遍扫描的方法,即从左到右只扫描一次源程序,将读取的数据存放在一个二维数组里。然后通过扫描函数scan,再从数组中一行一行的读取数据,每调用其依次返回一个单词的类型,同时单词本身以及行列号存放在全局变量中。而说词法分析作为语法分析的一个子程序,故在编写词法分析程序时,将会反复调用scan函数来获取一个个单词信息。3设计流程图4函数设计/*词法分析函数*/int scan( string s ,int line ) 框架:初始化工作是空格直接跳过,知直到读取到一个字符if( 是字母 )查表判断是否为关键字判断是否为逻辑运算符and或orElse则为标识符else

4、 if( 是否为数字 ) 判断是整数Else是小数Else其余情况判断是否为运算符,字符串等else if( getchar=/ )if( contentlinei+1=/)/向前看一个,确定是否为行注释;如果是,则游标指向行末,跳过行注释if( contentlinei+1=/*)如果向前看一个发现时块注释则一直向前扫描直到出现“*/”停止,略过块注释如果都不是则Else判断为除号,返回运算符类型2对其中部分实现的说明(1)数字识别while( contentlinei=0 & contentlinei=0 & contentlinei=65 & contentlinei=91 & cont

5、entlinei=0 & contentlinei=9 ) /判断是否为数字或者字母或者下划线text += contentlinei;i+;for( j=0; j=13 ; j+ )if( text=keyj )/查表判断是否为保留字return 5;检查到读取的字符为字母时,进行查表判断,找到即说明为关键字(3) 空格,注释,行号的处理if( mode=0 )if( icontentk.length() ) i+;/如果为行注释 直接跳到下一行elseif( mode=-1 )/如果为块注释 找回行号k=templine; 六、程序源代码见源代码文件。七、实验数据、结果测试数据见文件八、总

6、结之前的每周作业曾经写过一个词法分析程序,所以这次写词法分析程序没什么太多困难。在读取源文件时,最初的想法是一行一行的读取,读一次就存一行,这样可以节省空间资源,提高效率。但是仔细一想考虑到块注释分布在不同的行中,而且这样对行列的操作十分麻烦,而且许多地方涉及到要向前看,(比如判断注释与/除号运算符时),最后只好一次全部读完,存在一个二维数组中。再用scan函数来处理。这样一来行列的处理就自由多了。第二点,在写scan函数的时候,最初的想法是每调用一次,返回一个单词,然后在语法分析时不断调用它。但是仅仅返回单词是不够的,于是打算返回一个结构体,把单词信息行列号什么的全部存进去,这个在后来的语法

7、语义分析中可以看到,这里任然采用的是返回一个单词类型。单词本身,和行列号作为全局变量保存。然后只要按照流程图一步一步判断,慢慢写就行了,没有太多难度,唯一要注意的是单词位置行列的计算一定要细心。这个是要穿插在整个词法分析的全部地方的。所有涉及到读入一个字符的地方都需要考虑到如何修改行列变量。尤其是本程序拓展了块注释,要注意行列变化。实 验 设 计 二注:由于语义分析和四元式生成都是在语法分析的基础上拓展得到的,这一章实验报告囊括了语法,语义和四元式。一、实验名称 语 法 语 义 以 及 四 元 式 分 析 程 序二、实验目的设计一个语 法 语 义 以 及 生 成 四 元 式 的 分 析 程 序

8、 三、实验内容及要求设计要求:构造相应文法的语法分析程序,应能指出源程序中出现的错误。为语法分析程序中添加类型检查功能,包括: 变量重复定义; 变量未定义就使用; 变量未赋值就引用;将语法正确的源程序翻译成四元式。文法见附录四、实验环境操作系统:Win7/其他编译工具:VC+6.0/CFree /VS2012五、设计 1.语法分析设计(1) 相关数据机构 struct Tokenstring value;/值int mode;/类型int row;/行int col;/列token;说明:这本应是词法分析时的结构,但是scan函数返回的是但单一值,于是又设计了Token函数,对scan函数进行

9、扩充,每个单词的信息均保存一次在结构体中,方便错误报告函数进行处理。(2)各个非终结符函数形式/*/*语法语义 各产生式 函数*/void chengxu();void hanshukuai();void hanshu();void yujukuai();void yuju();void bianliangdingyiyuju();void shujuleixing();void shuruyuju();void shuchuyuju();void fuzhiyuju();void fenzhiyuju();void xunhuanyuju();void biaodashi();void xi

10、ang();void yinzi();void buerbiaodashi();void guanxibiaodashi();void guanxi();其他函数:void error();void warning();每个函数具体作用在代码中都有注释说明(3)语法分析整体设计思路采用递归下降的方法,为每个非终结符设计一个函数,在函数中对此处可能出现的语法错误进行处理。处理也语法错误的思路主要分两种:1. 查找关键字由于进行语法分析时检查到错误不可能就此停下,要一次性尽量找到所有的错误,而且测试数据的语法错误形式千奇百怪,这就要求发现错误之后如何找到继续进行分析的位置。这里对于一些不常见的错误

11、采取查找关键字的方法,一旦出现错误在相应函数中查找下一个出现的关键字的位置,然后继续分析。2. 跳过错误单词,直接分析下一个单词由于查找关键字方法会跳过许多代码,从而有可能造成一些信息不必要的遗漏。尤其是对于漏分号这种错误,与是这里采取,直接当前错误,默认后续单词可能就是正确单词,继续分析。但是这个方法在一些地方并不适用,可能会导致一连串的错误出现,于是在使用时要考虑好取舍。编译错误处理函数:void error( Token token,char *msg) /编译错误处理函数cout 编译错误:; printf( %s,msg); cout endl 错误位置:第 token.row 行,第 token.col token.value;cout endl;cout endl;errornum+;每出现错误时,通过传递错误信息参数以及单词信息,调用编译错误处理函数进行实时报错。(3)测试数据和结果见后文语义分析部分(4) 语法分析部分的小总结原本打算试试自底向上归约方法设计的,结果想了想发现实在麻烦,老师给的文法又挺庞杂的,创建

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号