资源描述:
《(需打印的)编译原理实验报告》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、《编译原理》实验报告2012—2013学年第一学期班级姓名学号张春梅指导教师实验一词法分析器的设计(4学时〉一、实验目的和要求加深対状态转换图的实现及词法分析器的理解。熟悉词法分析器的主要算法及实现过程。要求学生掌握词法分析器的设计过程,并实现词法分析。二、实验基本内容给出一个简单语言的词法规则,画出状态转换图,并依据状态转换图编制出词法分析程序,该程序的数据输入是一段C代码,单词符号autobreak输出数据为单词的二元式。现给出词法规则如下:种别码内码12casecharconstcontinuedef
2、aultdofloatforif34567891011intlongreturnstructswitchvoidwhile<<=>>=»MM1=•12131415161718303132333435)+*/**3637383940414244;45!46~47&&48II49{50}51标识符60常数70二进制形式三'问题描述及基本算法提示1.状态转换图的实现让每个结点对应一小段程序。需引进一组全局变量和过程、函数(1)ch字符变量,存放最新读进的源程序字符。(2)strToken字符数组,存放构成单词符号
3、的字符串。(3)GetChar子程序过程,将下一个输入字符读到ch屮,搜索指示器前移一个字符位置。(4)GetBC子程序过程,检查ch中字符是否为空白。若是,则调用GetChar直至ch中进入一个非空白字符。(5)Concat子程序过程,将ch中的字符连接到strToken之后。例如,假定strToken原來的值为“AB”,而ch中存放着C,经调用Concat后,strToken的值就变为”ABC”。(6)IsLetter和IsDigit布尔函数过程,它们分别判断ch中的字符是否为字母和数字。(7)Rese
4、rve整型函数过程,对strToken中的字符找保留字表,若它是一个保留字,则返回它的编码,否则返回0值。(8)Retract子程序过程,将搜索指示器回调一个字符位置,将ch置为空白字符。(9)Insertld整型函数过程,将strToken中的标识符插入符号表,返回符号表指针。(10)InsertConst整型函数过程,将strToken屮的常数插入常数表,返回常数表指针。2.词法分析器构造基本算法intk=0,i=0,code;charstiToken[20]='"';/*置strToken为空串勺wh
5、ile(a[i]!=, ,){GetChar();GetBC();if(IsLetter()){k=0;while(IsLetter()orIsDigitO){Concat();GetChar();1Retract();code:=Reserve();if(code=0)输出二元式:<70,字符数组strToken>;else输出二元式:vcode,字符数组strToken>;elseif(IsDigit()){k二0;while(IsDigit()){Concat();GetChar();}Retrac
6、t();输出二元式:<70,字符数组strToken对应的整型常数的内码二进制形式〉;}elseif(ch=<'){GetChar();if(ch二'二')输出二元式<31,<=>;else{RetractO;输出二元式<30,<>;}}elseif(ch='>'){GetChar();if(ch二'二')输出二元式<33,>二>;else{RetractO;输出二元式v32,>>;)}elseif(ch='二'){GetChar();if(ch二'二')输出二元式<34,==>;else(Retract(
7、);输出二元式<43,=>;}}elseif(ch二T){GetChar();if(ch二'二')输出二元式v35,!=>;else{RetractO;输出二元式<46,!>;)}elseif(ch='*‘){GetChar();if(ch二'*')输出二元式v42,**>;else{RetractO;输出二元式v<40,*>;}else讦(ch=elseif(ch=elseif(ch=+)elseif(ch=宀)elseif(ch=:7')else讦(ch==V)elseif(ch=输出二元式v36,(>
8、;输出二元式v37,)>;输出二元式<3&+>输岀二元式v39,・>;输出二元式v41,/>;输出二元式v44,,>;输出二元式v45,;>:elseif(ch=7)输出二元式v47,〜〉;elseif(ch=<)输出二元式v50,{>;else讦(ch"}J输出二元式<51,)>;elseif(ch='&')(GetChar();if(ch=,&,)输岀二元式<48,&&>;else{Retract();输出二