昆明理工大学编译原理实验二语法分析器.docx
- 文档编号:4381764
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:10
- 大小:66.61KB
昆明理工大学编译原理实验二语法分析器.docx
《昆明理工大学编译原理实验二语法分析器.docx》由会员分享,可在线阅读,更多相关《昆明理工大学编译原理实验二语法分析器.docx(10页珍藏版)》请在冰豆网上搜索。
昆明理工大学编译原理实验二语法分析器
昆明理工大学信息工程与自动化学院学生实验报告
(2011—2012学年第1学期)
课程名称:
编译原理开课实验室:
4452011年12月19日
年级、专业、班
学号
成绩
实验项目名称
语法分析器
指导教师
严馨
教师评语
该同学是否了解实验原理:
A.了解□B.基本了解□C.不了解□
该同学的实验能力:
A.强□B.中等□C.差□
该同学的实验是否达到要求:
A.达到□B.基本达到□C.未达到□
实验报告是否规范:
A.规范□B.基本规范□C.不规范□
实验过程是否详细记录:
A.详细□B.一般□C.没有□
教师签名:
年月日
一、实验目的及内容
实验目的:
编制一个语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析。
实验内容:
在上机
(一)词法分析的基础上,采用递归子程序法或其他适合的语法分析方法,实现其语法分析程序。
要求编译后能检查出语法错误。
已知待分析的C语言子集的语法,用EBNF表示如下:
<程序>→main()<语句块>
<语句块>→‘{’<语句串>‘}’
<语句串>→<语句>{;<语句>};
<语句>→<赋值语句>|<条件语句>|<循环语句>
<赋值语句>→ID=<表达式>
<条件语句>→if‘(‘条件’)’<语句块>
<循环语句>→while’(‘<条件>’)‘<语句块>
<条件>→<表达式><关系运算符><表达式>
<表达式>→<项>{+<项>|-<项>}
<项>→<因子>{*<因子>|/<因子>}
<因子>→ID|NUM|‘(’<表达式>‘)’
<关系运算符>→<|<=|>|>=|==|!
=
二、实验原理及基本技术路线图(方框原理图或程序流程图)
三、所用仪器、材料(设备名称、型号、规格等或使用软件)
1台PC以及VISUALC++6.0软件
四、实验方法、步骤(或:
程序代码或操作过程)
#include
#include
usingnamespacestd;
charprog[80],token[8];
charch;
intsyn,p,m,n,sum,k=0;
char*key[6]={"main","int","char","if","else","while"};
voidscaner();
voidlrparser();
voidyucu();
voidstatement();
voidexpression();
voidterm();
voidfactor();
voidmain()
{
p=0;
cout<<"语法分析"< cout<<"请输入字符串,以“@”结尾: "< do{ch=getchar();prog[p++]=ch;} while(ch! ='@'); p=0; scaner(); lrparser(); } voidscaner() { sum=m=0; for(n=0;n<8;n++)token[n]=NULL; ch=prog[p++]; while(ch=='')ch=prog[p++]; if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9')) {token[m++]=ch;ch=prog[p++];} token[m++]='\0'; p--; syn=10; for(n=0;n<6;n++) if(strcmp(token,key[n])==0) {syn=n+1;break;} } elseif(ch>='0'&&ch<='9') { while(ch>='0'&&ch<='9') { sum=sum*10+ch-'0'; ch=prog[p++]; } p--; syn=20; } else switch(ch) { case'<': m=0;token[m++]=ch; ch=prog[p++]; if(ch=='<'){syn=33;token[m++]=ch;} elseif(ch=='='){syn=35;token[m++]=ch;} break; case'>': m=0;token[m++]=ch; ch=prog[p++]; if(ch=='='){syn=34;token[m++]=ch;} else{syn=32;p--;} break; case'=': token[m++]=ch; ch=prog[p++]; if(ch=='=') {syn=36; token[m++]=ch; } else {syn=21; p--; } break; case': ': m=0;token[m++]=ch; ch=prog[p++]; if(ch=='='){syn=18;token[m++]=ch;} else{syn=17;p--;} break; case'+': syn=22;token[0]=ch;break; case'-': syn=23;token[0]=ch;break; case'*': syn=24;token[0]=ch;break; case'/': syn=25;token[0]=ch;break; case';': syn=31;token[0]=ch;break; case'(': syn=26;token[0]=ch;break; case')': syn=27;token[0]=ch;break; case'@': syn=0;token[0]=ch;break; default: syn=-1; } } voidlrparser() { if(syn==1) { scaner(); yucu(); if(syn=6) { scaner(); if(syn==0&&(k==0)) cout<<"\nsuccess\n"< } else { if(k! =1) cout<<"\nwhileerror\n"< k=1; } } else { cout<<"\nmainerror\n"< k=1; } return; } voidyucu() { statement(); while(syn==31) { scaner(); statement(); } return; } voidstatement() { if(syn==10) { scaner(); if(syn==18) { scaner(); expression(); } else { cout<<"\nscentenceerror\n"< k=1; } } return; } voidexpression() { term(); while(syn==22||syn==23) { scaner(); term(); } return; } voidterm() { factor(); while(syn==24||syn==25) { scaner(); factor(); } return; } voidfactor() { if(syn==10||syn==20) scaner(); elseif(syn==26) { scaner(); expression(); if(syn==27) scaner(); else { cout<<"(error"< k=1; } } else { cout<<"expressionerror"< k=1; } return; } 5、实验过程原始记录(测试数据、图表、计算等) 六、实验结果、分析和结论(误差分析与数据处理、成果总结等。 其中,绘制曲线图时必须用计算纸或程序运行结果、改进、收获) 这次上机实验主要是能够采用C编程语言实现简单的语法分析程序,设计,编制并调试一个语法分析程序,加深对语法分析原理的理解。 但由于自己编程能力弱,做的不是太好,主要是通过查资料和同学的帮助完成的。 编译原理这门课的知识比较逻辑化和抽象华,要学懂这门课比较困难,因此,在今后学习中,我要更加努力,熟读课本,以求熟悉并掌握该门课的知识要点。 注: 教师必须按照上述各项内容严格要求,认真批改和评定学生成绩。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 昆明 理工大学 编译 原理 实验 语法 分析器
![提示](https://static.bdocx.com/images/bang_tan.gif)