昆明理工大学编译原理实验二语法分析器.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编程语言实现简单的语法分析程序,设计,编制并调试一个语法分析程序,加深对语法分析原理的理解。
但由于自己编程能力弱,做的不是太好,主要是通过查资料和同学的帮助完成的。
编译原理这门课的知识比较逻辑化和抽象华,要学懂这门课比较困难,因此,在今后学习中,我要更加努力,熟读课本,以求熟悉并掌握该门课的知识要点。
注:
教师必须按照上述各项内容严格要求,认真批改和评定学生成绩。