昆明理工大学 编译原理 实验二 语法分析器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
昆明理工大学信息工程与自动化学院学生实验报告
(2011 —2012 学年第 1 学期)
课程名称:编译原理开课实验室: 445 2011年 12 月 19日年级、专业、
班
计科093 学号200910405310 姓名孙浩川成绩
实验项目名称语法分析器指导教师严馨
教
师评语
该同学是否了解实验原理: 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以及VISUAL C++6.0软件
四、实验方法、步骤(或:程序代码或操作过程)
#include
#include
using namespace std;
char prog[80],token[8];
char ch;
int syn,p,m,n,sum,k=0;
char *key[6]={"main","int","char","if","else","while"};
void scaner();
void lrparser();
void yucu();
void statement();
void expression();
void term();
void factor();
void main()
{
p=0;
cout<<"语法分析"< cout<<"请输入字符串,以“@”结尾:"< do {ch = getchar(); prog[p++]=ch;} while(ch!='@'); p=0; scaner(); lrparser(); } void scaner() { 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;} } else if(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;} else if(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; }