1、编译原理课程设计1 / 17目录一、 实验题目 .3二、 实验目的 .3三、 实验要求 .4四、 实验步骤 .4基本设计思路 .4流程框图 .5算法设计 .6函数相关说明 .6输入与输出 .8程序运行结果 .9五、 实验方案设计实现 .9六、 实验程序亮点描述 .10七、 实验程序使用说明 .10八、 实验心得体会 .10九、 源程序清单 .10编译原理课程设计2 / 17一、 实验题目设计、编制、调试一个识别一简单语言单词的词法分析程序。程序能够识别基本字、标识符、无符号整数、浮点数、运算符和界符) 。单词符号及种别表如下:单词符号 种别编码begin 1if 2then 3while 4d
2、o 5end 6l(l|d)* 10dd* 11+ 13- 14* 15/ 16: 17:= 182123= 24= 25; 26( 27) 28# 0二、 实验目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。编译原理课程设计3 / 17三、 实验要求词法分析程序需具备词法分析的功能:输入:所给文法的源程序字符串。 (字符串以“#”号结束)输出:二元组(syn,token 或 sum)构成的序列。其中:syn 为单词种别码;token 为存放的单词自身字符串;sum 为整型常数。例如:对源程序 begin x:=9: if x9 then x:=2*x+1/3; end #的源
3、文件,经过词法分析后输出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)四、 实验步骤基本设计思路 基本字作为一类特殊的标识符来处理:识别出标识符,差基本字表,给出相应种别码。基本字表置初值:char *rwtab6=“begin“,“if“,“then“,“while“,“do“,“end“;(字符指针的数组) 识别无符号整数是将数字串转换为无符号整数。我们在 getchar()的时候是把数字当做字符从外部输出读取的。将数字串 345#转换为整数:(3*10+4)*10+5=345 送到 sum 中 程序主要由 2 个函数组成,主函数 main()和
4、扫描子函数 scanner()。扫描程序每次读取1 个独立意义的单词符号,并判断单词类型。主程序做相应处理后做控制台输出。编译原理课程设计4 / 17流程框图图 1 主程序图 2 扫描子程序编译原理课程设计5 / 17算法设计词法分析程序所用的较为重要的全局变量和需调用的函数如下:1) ch 字符变量,存放当前读进的源程序字符。2) token8字符数组,存放构成单词符号的字符串。3) prog80字符数组,存放所有用户输入的字符。4) syn 整数,存放当前单词的种别码。5) sum 双精度浮点型变量,存放无符号整数,或者浮点数。6) isDecimal 整数,是否为浮点数。isDecima
5、l 为 1,则为浮点数。7) decimal 双精度浮点型变量 (double),浮点数的小数部分。8) isExp 整数,是否为指数形式表示的浮点数(即是否存在符号 E 或者 e) 。isExp 为 1,则为指数形式。9) index 整数,指数形式的幂。10) isNegative 整数,是否为负数幂。isNegative 为 1,则为负数幂,如 123E-2。11) scanner()扫描子程序。12) getchar()从控制台读取一个字符数据。13) double pow(double x,double y),计算 x 的 y 次幂。14) int strcmp(char *str1
6、,char #str2),字符串比较。函数相关说明1. 接收用户输入:getchar()和 dowhile 循环的组合doch=getchar();progp+=ch;while(ch!=#); /输入以号键结束2. 输出到控制台:dowhile 循环中,扫描出单词后(扫描程序还会判断种别码 syn)输出。doscanner(); /扫描,单词switch(syn)case 11:if(isDecimal=0)printf(“(%2d,%8d)n“,syn,(int)sum);break;else if(isExp=1)printf(“(%2d,%10.5e)n“,syn,sum);编译原理课
7、程设计6 / 17isExp=0;isDecimal=0;break;else if(isDecimal=1)printf(“(%2d,%8.4f)n“,syn,sum);isDecimal=0;break;case -1:printf(“input errorn“);break;default:printf(“(%2d,%8s)n“,syn,token);while(syn!=0);3. 浮点数的识别,先识别数字,再识别 . ,再识别数字,再识别 E 或 e,再识别 - ,再识别数字。else if(ch=0)ch=progp+;if(isNegative)sum=sum*pow(0.1,i
8、ndex);elsesum=sum*pow(10,index);p-;syn=11;输入与输出词法分析程序需具备词法分析的功能:输入:所给文法的源程序字符串。 (字符串以“#”号结束)输出:二元组(syn,token 或 sum)构成的序列。其中:syn 为单词种别码;token 为存放的单词自身字符串;sum 为整型常数。编译原理课程设计8 / 17程序运行结果五、 实验方案设计实现用 C 语言实现。编译原理课程设计9 / 17六、 实验程序亮点描述浮点数处理部分:巧妙利用 double pow(double x,double y)函数,简化了浮点数处理部分。如果是简单浮点数,如 1.23,
9、出现“.”符号,置 isDeminal 为 1,用%f 输出。如果稍微复杂一点,指数形式,但是正数幂,如 1.23E2,出现“E ”符号,置 isExp 为 1,用%e 输出。如果更复杂一点,指数形式,但是负数幂,如 1.23E-2,出现“-”号,置 isNegative为 1,仍然用%e 输出。如果是有符号数(有符号整数或者有符号浮点数) ,在识别出“+”或者“-”之后,再读后边一个字符,如果是数字,那么转至识别数字的代码段,并在末尾将 sum 进行相应处理。如果后边字符不是数字,证明“+”或者“-”是加减号,而非正负号。七、 实验程序使用说明用户输入待识别字符串(并以“#”结尾,表示字符串
10、输入结束) ,回车后程序自动输出词法分析结果。八、 实验心得体会词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本试验的完成,更加加深了对词法分析原理的理解。 最初是按照老师课堂上的 C 语言实现这个思路进行的,但是后来老师要求将识别数字拓展到浮点数(即实数) 。由于本人 C 语言功底不够扎实,最后只得再回过头去看了一下C 语言的语法,不过最后还是通过自己的力量把东西给做出来了。很有成就感!编译原理课程设计10 / 17参考文献1 张素琴,吕映芝等.编译原理M.第 2 版.北京:清华大学出版社,2005.22 王雷,刘志成等.编译原理课程设计M.北京:电子工业出版社,20023 何炎祥等.编译程序构造M.武汉:武汉大学出版社,19884 Holub A.Compiler Design in CM.Prentice-Hall,1990