您好,欢迎访问三七文档
信息与电气工程学院编译原理及实践实验名称词法分析实验学生姓名左凌霄学生学号150210318专业班级计算机15-3(CDIO试点班)指导教师周向宁二○一六年十一月九日目录1.问题描述及需求分析.....................................11.1问题描述...........................................11.2需求分析...........................................12.总体设计...............................................12.1实验目的...........................................12.2自动机状态转换图....................................13.详细设计...............................................23.1样例source.tny文件.................................23.2实验原理...........................................24.系统测试及结果.........................................34.1测试用例的设计......................................34.2测试结果记录和分析..................................35.实验心得总结...........................................4参考文献:...............................................4附录源程序.............................................5评分表..................................................1011.问题描述及需求分析1.1问题描述要求在在程序中输入:source.tny文件,最后实现输出:token[40]、tokenstring[40][30]。以下样例程序已经能够识别:变量、数、赋值号、分号。要求修改代码使其能够识别:变量、数、赋值号、分号、加号、减号、乘号、除号。通过使用TINY语言实现词法分析中运算符号(+-*/)的识别。1.2需求分析通过修改代码使得自动机能够更多的实现运算符号的识别功能,使用TINY语言调试一个程序,加深同学对词法分析的认识以及理解。另外,同时增强编写和调试程序的能力。2.总体设计2.1实验目的为了让学生更加清楚了解词法分析的过程,通过动手实践,使学生对构造编译系统的基本理论、编译程序的基本结构有更为深入的理解和掌握;使学生掌握编译程序设计的基本方法和步骤;能够设计实现编译系统的重要环节。同时增强编写和调试程序的能力。2.2自动机状态转换图图一:状态转换图23.详细设计3.1样例source.tny文件图片二:样例文件3.2实验原理typedefenum{LPAREN,RPAREN,SEMI,ASSIGN,NUM,ID,DOLLAR,PLUS,MINUS,TIMESOVER}tokentype;/*记号*/typedefenum{START,INASSIGN,INCOMMENT,INNUM,INID,INSEMI,INDOLLAR,DONE,INADD,INMINUS,INTIME,INDIVIDE}statetype;/*状态*/tokentypetoken[40];/*存记号*/chartokenstring[40][30];/*存记号串*/intwordindex=0;/*以上两个数组的索引*/intback=0;/*0不回退字符,1回退字符*/intc;/*存获得的字符*/intgetnextchar();/*获得下一个字符,并忽略无效的字符*/intgettoken();/*获得下一个记号*/switch(state)/*识别state是什么,进行选择*/if(c=='$')/*遇见‘$’停止*/其中词法分析作成一个子程序,由另一个主程序调用,每次调用返回一个单词,输出标识符、常数、运算符号等由主程序来完成。x12:=100;y34:=200;z56:=x12$34.系统测试及结果4.1测试用例的设计图片三:测试文件4.2测试结果记录和分析图片四:测试结果45.实验心得总结在实验中发现词法分析是最基本的东西,这是对一个程序进行编译的第一步,你可以看到机器这么把你写的高级语言一步一步分解,然后转换为自己的语言并执行。在整个完成实验的过程中遇到许多问题。第一没有把需要编译的文件放在同一目录下,导致系统找不到source.tny文件;第二是在编写source.tny时没有注意到中英文的转化,在“$”字符打成了英文,然后就不运行了。这一个简单的词法分析的实现过程中我的编程能力得到了提高,知道要更加规范的书写代码,以及给代码添加注释,也让我意识到编译是一个严谨的过程。参考文献:1.编译原理及实践机械工程出版社2.中国大学幕课网5附录源程序#includestdio.h#includectype.hFILE*source;/*源程序文件句柄*/typedefenum{LPAREN,RPAREN,SEMI,ASSIGN,NUM,ID,DOLLAR,PLUS,MINUS,TIMES,OVER}tokentype;/*记号*/typedefenum{START,INASSIGN,INCOMMENT,INNUM,INID,INSEMI,INDOLLAR,DONE,INADD,INMINUS,INTIME,INDIVIDE}statetype;/*状态*/tokentypetoken[40];/*存记号*/chartokenstring[40][30];/*存记号串*/intwordindex=0;/*以上两个数组的索引*/intback=0;/*0不回退字符,1回退字符*/intc;/*存获得的字符*/intgetnextchar();/*获得下一个字符*/intgettoken();/*获得下一个记号*/main(){inti;source=fopen(.\\source.tny,r);while(gettoken()!=0)/*循环判断*/{wordindex++;}for(i=0;i=wordindex;i++)printf(word:%s\n,tokenstring[i]);fclose(source);}intgetnextchar(){intc=fgetc(source);if((c=='\n')||(c=='\t')||(c==''))/*忽略无效字符*/c=fgetc(source);6returnc;}intgettoken(){inttokenStringIndex=0;intsave;statetypestate=START;/*state:声明*/while(state!=DONE)/*当state不是终结符,这里是循环选择结构*/{if(back==0)/*如果不回退字符*/c=getnextchar();/*将获取的下一个字符给c*/save=1;switch(state)/*识别state是什么,进行选择*/{caseSTART:/*...START...*/if(isdigit(c))/*digit:数字*/state=INNUM;elseif(isalpha(c))/*alpha:字母*/state=INID;elseif(c==':'){state=INASSIGN;back=0;}elseif(c==';')state=INSEMI;elseif(c=='+')state=INADD;/*加上*/elseif(c=='-')state=INMINUS;/*减去*/elseif(c=='*')state=INTIME;/*乘以*/elseif(c=='/')state=INDIVIDE;/*除以*/elseif(c=='$'){state=INDOLLAR;back=1;/*回退一个字符*/}break;caseINASSIGN:/*...INASSIGN...*/7state=DONE;if(c=='=')token[wordindex]=ASSIGN;break;caseINSEMI:/*...INSEMI...*/back=0;save=0;state=DONE;token[wordindex]=SEMI;break;caseINADD:/*...INADD..加上.*/back=0;save=0;state=DONE;token[wordindex]=PLUS;break;caseINMINUS:/*...INMINUS..减去.*/back=0;save=0;state=DONE;token[wordindex]=MINUS;break;caseINTIME:/*...INTIME..乘以.*/back=0;save=0;state=DONE;token[wordindex]=TIMES;break;caseINDIVIDE:/*...INDIVIDE..除以.*/back=0;save=0;state=DONE;token[wordindex]=OVER;break;caseINDOLLAR:/*...INDOLLAR...*/state=DONE;token[wordindex]=DOLLAR;8save=0;break;caseINNUM:/*...INNUM...*/if(!isdigit(c)){back=1;/*回退一个字符*/save=0;state=DONE;token[wordindex]=NUM;}break;caseINID:/*...INID...*/if((!isalpha(c))&&(!isdigit(c))){back=1;/*回退一个字符*/save=0;state=DONE;token[wordindex]=ID;}break;}if(save==1)tokenstring[wordindex][tokenStringIndex++]=(char)c;if(state==DONE){tokenstring[wordindex][tokenStringIndex]='\0';}}if(c=='$')/*遇见‘$’停止*/return0;elsereturn1;}910评分表项目设计评语项目设计成绩指导教师(签字)年月日注:此表必须在同一页面。
本文标题:词法分析实验报告
链接地址:https://www.777doc.com/doc-4147818 .html