1、编译原理课程实验报告示例1完成日期:2007-6-20指导老师:蒋宗礼04070010 张悦编译原理实验报告04070010 张悦2词法的正规式描述标识符:|(|)*(|_|.) (|)*十 进 制 数 : (0|(1|2|3|4|5|6|7|8|9) (0|1|2|3|4|5|6|7|8|9)*)( |.)(0|1|2|3|4|5|6|7|8|9)五系统实现(一)词法分析器的实现四系统设计完成整个系统,实现本个实验的要求,需要两个比较大的模块:词法分析器 和语法分析器。词法分析器的功能是将输入的程序串分解成一个一个独立的单词,并且记录 下每个单词的类型以及数值。这里词法分析器的实现有两种方法
2、:调用一次词法 分析器,返回一个词的类型以及数值,以此类推;还有一种方法是条用一次词法 分析器将程序串的所有单词都分解出来并保存到一个地方(比如线形表)以便将 来使用。我采用的是前者,因为这样只需要对整个程序访问一遍语法分析器的功能是将已经分解好的单词按照一定的规范(产生式)组合起 来,由此来确定输入程序的意思。我的设计是“语法分析器调用词法分析器”, 当语法分析其分析进行不下去的时候调用词法分析器获取一个单词,继续进行分 析。而语义功能是镶嵌在语法分析其当中的,当语法分析器分析出用什么产生式 的时候作相应的语义处理。3 编写测试程序,反复调用函数scan( ),输出单词种别和属性。4 改写文
3、法,构造语法分析程序,要求按照最左派生的顺序输出派生的产 生式序列;5 改写语法分析程序,构造三地址代码生成程序。6 处理的源程序存放在文件中,它可以包含多个语句;从键盘读入数据,分析出一个单词。返回单词种别(用整数表示), 返回单词属性(不同的属性可以放在不同的全局变量中)。1)2)3)三. 实验要求1 编制正规式以及正规文法,画出状态图;2 根据状态图,设计词法分析函数int scan( ),完成以下功能:二. 实验内容1编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法 分析程序。2用二维预约分析表,编制一个能够进行语法分析并生成派生的产生式序 列的编译程序。3用递归子程序法
4、,编制一个能够进行语法分析并生成三地址代码的微型 编译程序。一. 实验目的基本掌握计算机语言的词法分析程序的开发方法。以及掌握计算机语言的语 法分析程序设计与属性文法应用的实现方法。锻炼自己的编程能力和逻辑思维能 力,体会计算机编译器的奥妙之处04070010 张悦3、状态图:-a|b|c|d|e|f|g|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z-0|1|2|3|4|5|6|7|8|9- (|)|- (|_|.)- (|.)- (0|1|2|3|4|5|6|7)
5、|- (0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f) |将状态合起来,得:(0)-(1)|0(4)|(12)|(17) (1)-(1)|. (2)(2)-(3) (3)-(3)(4)-.(2)|(5)|0(13)|x(8)|X(8) (5)-(5)|.(6)(6)-(7) (7)-(7)(8)-(9)|(9)|0(14) (9)-(9)|(9)|.(10) (10)-(11)|(11) (11)-(11)|(11)(12)-(12)|(12)|(12)|.(15)|_(15) (13)-.(6)(14)-.(10)(15)-(16)|(16)|(16) (16)-(16)|
6、(16)|(16)母字、改变后的正规文法- - 0 - 0x -+| - |* |/ | |= |( | ) |;-if| then| else |while |do(0|1|2|3|4|5|6|7|8|9)*八进制数:0(0|(1|2|3|4|5|6|7) (0|1|2|3|4|5|6|7)*) (|.)(0|1|2|3|4|5|6|7) (0|1|2|3|4|5|6|7)*十六进制数:0x(0(|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f) (0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*) (|.)(0|1|2|3|4|5|6|7|8|9|a|b|c|
7、d|e|f) (0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*运算符和分隔符:+ - * / = ( ) ;关键字:if then else while do04070010 张悦09091.2309070719.567.07170040.13x|X0f0f字母81f9.100f1112分隔符014.|_字母或数字1516字母或数字17字母或数字4strcpy(node-type,#);strcpy(node-value,_);return false; /表示文件结束if(temp = #)读取一个字符到 temp;node = new CNode;while(1)/返回
8、的节点/当前状态号int state = 0;int si = 0; /对于控制 s 的下标/保留字符串char s100;、算法(伪码):bool MyScan(FILE* fp,CNode* &node)char temp; /当前读取的字符、数据结构:char* arrBao5 = if,then,else,do,while;/保留字表typedef structchar typeTYPE_MAX;char valueVALUE_MAX;CNode;/词法分析的节点,保留分析出的 token 的种类和值04070010 张悦5;添 加 当 前 字 符state=14;state=9;添
9、加 当 前 字 符if(temp 为十六进制数)continue;if(temp 为 0)else 出错处理; return false;case 8: /状态 8return true;保存为 INT8;if(temp 为分隔符)添加当前字符; continue;添加当前字符; continue;else 出错处理; return false;case 6: /状态 6if(temp 为 07) state=7;else 出错处理; return false;case 7: /状态 7if(temp 为 07) state=7;return true;保存为 INT8;if(temp 为分隔
10、符)if(temp 为 07) state=5;state=6;添加当前字符; continue;添加当前字符; continue;if(temp 为小数点)else 出错处理; return false;case 5: /状态 5return true;保存为 INT10;state=8;if(temp 为 x 或 X)if(temp 为分隔符)state=5;state=13;if(temp 为 17)if(temp 为 0)state=2;添加当前字符; continue;添加当前字符; continue; 添加当前字符; continue; 添加当前字符; continue;if(te
11、mp 为小数点)else 出错处理; return false;case 4: /状态 4return true;保存为 REAL10;if(temp 为分隔符)添加当前字符; continue;添加当前字符; continue;else 出错处理; return false;case 2: /状态 2if(temp 为数字) state=3;else 出错处理; return false;case 3: /状态 3if(temp 为数字) state=3;保存为 INT10; return true;state=2;if(temp 为小数点)if(temp 为分隔符)添加当前字符; cont
12、inue;添加当前字符; continue;else 出错处理; return false;case 1: /状态 1if(temp 为数字) state=4;和制表符/忽略多个空格和回车if(temp 为空格或回车或 tab) continue;return true;保存相应的分隔符到 node;state=4;state=1;state=12;添加当前字符; continue;添加当前字符; continue;添加当前字符; continue;switch(state)case 0: /状态 0 if(temp 为 0) if(temp 为 1 到 9) if(temp 为字母) if(
13、temp 为分隔符)04070010 张悦6添加当前字符 ;state=16;if(temp 为数字或者字母)case 16:/状态 16else 出错处理; return false;return true;else 保存为 IDN;if(temp 为分隔符)if(为保留字) 保存为保留字; return true;continue;state=16;添加当前字符 ;if(temp 为数字或者字母)/状态 15case 15:else 出错处理; return false;保存为 INT16; return true;if(temp 为分隔符)添加当前字符; continue;if(temp 为.) state=10;case 14:/状态 14else 出错处理; return false;return true;保存为 INT8
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1