《语法分析编译原理实验报告_昆明理工大学.doc》由会员分享,可在线阅读,更多相关《语法分析编译原理实验报告_昆明理工大学.doc(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、昆明理工大学信息工程与自动化学院学生实验报告( 2012 2013学年 第上学期 )课程名称:编译原理 开课实验室: 444 2012年 11 月 23 日专业、班级计科101班学号姓名成绩实验项目名称语法分析指导教师严馨教师评语该同学是否了解实验原理:A.了解B.基本了解C.不了解该同学的实验能力:A.强 B.中等 C.差 该同学的实验是否达到要求:A.达到B.基本达到C.未达到实验报告是否规范:A.规范B.基本规范C.不规范实验过程是否详细记录:A.详细B.一般 C.没有 教师签名: 年 月 日一、实验目的 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。
2、二、 实验要求利用C语言编制递归下降分析程序,并对简单语言进行语法分析。2.1 待分析的简单语言的语法用扩充的BNF表示如下:main() ; ; |ID=if(条件)while() +|- * |/ ID|NUM| () |=|=|!=2.2 实验要求说明输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。三、 语法分析程序的C语言程序源代码#include#includechar prog80,token8;char ch;int syn,p,m=0,n,sum,kk=0;char *rwtab6=function,if,then
3、,while,do,endfunc;void yucu();void expression();void statement();void factor();void term();void irparser();void scaner()for (n=0;n8;n+)tokenn=NULL;while(ch= | ch=n)ch=progp+;m=0;if(ch=a) | (ch=A)while(ch=a) | (ch=A) | (ch=0)tokenm+=ch;ch=progp+;syn=10;for(n=0;n6;n+)if(strcmp(token,rwtabn)=0)syn=n+1;
4、break;tokenm+=0;elseif(ch=0)sum=0;while(ch=0)sum=sum*10+ch-0;ch=progp+;syn=11;elseswitch(ch)case:m=0;tokenm+=ch;ch=progp+;if(ch=)syn=24;tokenm+=ch;elsesyn=23;p-;break;case= :m= 0;tokenm + =ch;ch=progp+;if(ch=) syn= 25;tokenm+= ch;elsesyn=18;ch=prog-p;break;case!:m=0; tokenm+= ch;ch=prog+p;if(ch=) sy
5、n=22;tokenm+= ch;else syn=-1;break;case+:syn=13; token0=ch;break;case-:syn=14; token0=ch;break;case*:syn=15; token0=ch;break;case/:syn=16; token0=ch;break;case;:syn=26; token0=ch;break;case(:syn=27; token0=ch;break;case):syn=28; token0=ch;break;case#:syn=0; token0=ch;break;default:syn=-1;/break;ch=p
6、rogp+; void irparser() if(syn=1)scaner();yucu();/*语句串分析*/if(syn=6) /*读到endfunc*/ scaner();if(syn=0&kk=0)/*程序分析识别完*/printf(success); elseif(kk!=1) /*没以endfunc结束*/printf(error!need endfunc);kk=1; else printf(error!needfunction); kk=1;void yucu() /*语句串分析*/ statement();/*调用语句分析函数*/ while(syn=26)/*一个语句识别
7、结束,继续识别*/ scaner(); statement(); return;void statement()/*语句分析函数*/ if(syn=10)scaner();if(syn=18) /如果是赋值语句scaner();expression(); /这个过程实现语法分析判断语句elseprintf(error!evaluate tag error);kk=1;else if(syn=6)return;elseif(syn=2) /如果是条件判断语句 就判断条件表达式的语法!scaner();if(syn=27) /判断括号匹配do scaner(); /进入括号内部进行表达式分析 ex
8、pression(); while(syn!=28); else printf(error! need another);kk=1; /()内判断完成 ! scaner(); /然后进行语句块分析! statement(); /到这里是实现判断if语句的语法分析/ 类似的往里添加 循环语句 ! elseif(syn=4) /如果是循环语句 就判断条件表达式的语法!scaner();/ch=progp+;if(syn=27) do scaner(); expression(); while(syn!=28); else printf(error! need another);kk=1; /()内
9、判断完成 ! scaner(); /然后进行语句块分析! statement(); /这里是实现判断while语句的语法分析elseprintf(error!the statement error!);kk=1;void expression()/*表达式分析函数*/ term(); while(syn=13|syn=14) scaner(); term();return; void term()/*项分析函数*/factor();while(syn=15|syn=16)scaner();factor();return;void factor()/*因子分析函数*/ if(syn=10|syn
10、=11)scaner();else/*看是否是表达式*/expression();if(syn=27) scaner();expression();if(syn=28) scaner();else printf(error! need another);kk=1; else printf(error! expression error!);void main()p=0;printf(n 请输入待分析的字符串:n);doch=getchar();progp+=ch; while(ch!=#);p=0;ch=progp+;scaner();irparser(); 四、 程序测试结果五、总结在这次实验中,我获得了很大的收获,让自己对语法分析程序的功能有了更进一步认识。虽然在程序的设计和编写过程中出现了一些错误,但是经过同学的帮助和指导,顺利的将程序中存在的错误顺利解决,从而顺利完成了本程序的设计和编译。从一开始对程序的陌生,到后来逐步了解程序的流程,当我耐心的一步一步理解程序思想,一次次的更改测试用例,一遍遍的调试,最终终于得到了预期的答案。这次实验使我对理论的语法分析递归下降的理解更加具体清晰,受益匪浅。同时,自己对语法分析的流程有了深刻的了解,使得语法分析递归向下思想更加具体化。 注:教师必须按照上述各项内容严格要求,认真批改和评定学生成绩。