资源描述:
《程序设计语言与编译实验.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、南华大学计算机科学与技术学院实验报告(2012~2013学年度第二学期)课程名称程序设计语言与编译实验名称编写词法分析器与算符优先分析表姓名Xx学号Xx专业软件工程班级11软卓01班地点八教教师Xx2013年6月目录实验一编写词法分析器11.实验目的及要求11.1实验目的11.2实验要求12.实验步骤12.1设定单词符号的编码12.2状态转换图22.3采用的部分函数23.实验内容33.1流程图33.2程序源代码34.实验结果95.实验总结分析9实验二编写算符优先分析表111.实验目的及要求111.1实验目的111.2实验要求112.实验步骤112.1设定表达式
2、与需分析句子112.2求FirstVT集和LastVT集112.3根据FirstVT和LastVT集构造算符优先表113.实验内容113.1流程图113.2程序源代码114.实验结果205.实验总结分析20实验一编写词法分析器1.实验目的及要求1.1实验目的编译程序是一个十分复杂的加工处理程序,它将便于人们阅读但不能直接在计算机上执行的源代码程序翻译成语义上等价且可以在计算机上执行的目标程序。为此,一般将整个编译程序划分为5个处理阶段,它们是词法分析、语法分析、中间代码生成(语义分析)、代码优化和目标代码生成。1.2实验要求花一周时间明确语言的词法规则,根据具
3、体情况,由同学们自己选取C语言的一个适当大小的子集,写出基本保留字、标识符、常数、运算符、分隔符和程序例。初步编制好程序。上机调试,发现错误,再修改完善。第二次上机调试通过。2.实验步骤2.1设定单词符号的编码单词符号类别编码助记符标识符1$SYMBOL常数整型2$CONSTANTint3$INTif4$IFelse5$ELSEwhile6$WHILEfor7$FORread8$READwrite9$WRITE+10$ADD-11$SUB*12$MUL/13$DIV<14$L<=15$LE>16$G>=17$GE!=18$NE==19$E=20$ASSIGN(
4、21$LPAR)22$RPAR,23$COM;24$SEM表1单词符号的编码2.2状态转换图2字母非字母与数字1字母与数字0空白4数字非数字3数字+6;58:非=7=9(10,11)12其它1714<非=1315>16=图1一个简单词法分析器的状态转换图2.3采用的部分函数(1)character()用来得到最新读入的字符。(2)token_flag()字符的匹配函数,返回字符串(关键字)的类别编码。(2)token_symbol()字符的匹配函数,返回字符串(标志符)的类别编码。(4)getchar()读入一个字符的函数。(5)concat()连接字符串的函
5、数,两个参数,将后一个参数的内容添加到第一个参数的末尾,并返回第一个参数。(6)letter()判断当前字符是否为字母。(7)digit()判断当前字符是否为数字。(8)handle()程序的主要处理输入的函数,包括判断当前输入字符的内容,并实现字符处理,保存到文件。3.实验内容3.1流程图词法分析语法分析语义分析代码优化代码生成单词序列语法单位中间代码高效中间代码汇编汇编代码目标代码高级语言源程序表格管理出错处理图2编译工作流程图3.2程序源代码#include#include#includeusingn
6、amespacestd;stringflag[]={"-1","-1","-1","int","if","else","while","for","read","write","+","-","*","/","<","<=",">",">=","!=","==","=","(",")",",",";"};stringbetter[]={"-1","$SYMBOL","$CONSTANT","$INT","$IF","$ELSE","$WHILE","$FOR","$READ","$WRITE","$ADD","$SUM","$MUL","$DIV","$L",
7、"$LE","$G","$GE","$NE","$E","$ASSIGN","$LPAR","$RPAR","$COM","$SEM"};stringsymbol[]={"using","include","namespace","std","cin","cout","return","a","b","endl","main"};//其他关键字,属于标志符类别stringmain_string;//输入的字符转变为字符串intnum;//输入的字符串转变为数字intline_num=1;//文件行的计数intcount=0;//对连续运算符的标记intsign
8、=0;//对连续运算符的计次booll