天津理工大学编译原理实验2语法分析.docx
- 文档编号:9397736
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:22
- 大小:93.01KB
天津理工大学编译原理实验2语法分析.docx
《天津理工大学编译原理实验2语法分析.docx》由会员分享,可在线阅读,更多相关《天津理工大学编译原理实验2语法分析.docx(22页珍藏版)》请在冰豆网上搜索。
天津理工大学编译原理实验2语法分析
实验报告
学院(系)名称:
计算机与通信工程学院
姓名
学号
专业
班级
实验项目
实验二:
语法分析
课程名称
编译原理
课程代码
实验时间
2016年4月21日第1、2节
2016年4月26日第3、4节
2016年4月28日第1、2节
实验地点
计算机软件实验室7-220
批改意见
成绩
教师签字:
实验内容:
可选择LL1分析法、算符优先分析法、LR分析法之一,实现如下表达式文法的语法分析器:
(1)E→E+T|E-T|T
(2)T→T*F|T/F|F
(3)F→P^F|P
(4)P→(E)|i
实验目的:
1.掌握语法分析的基本概念和基本方法;
2.正确理解LL1分析法、算符优先分析法、LR分析法的设计与使用方法。
实验要求:
1.按要求设计实现能识别上述文法所表示语言的语法分析器,并要求输出全部分析过程;
2.要求详细描述所选分析方法针对上述文法的分析表构造过程;
3.完成对所设计语法分析器的功能测试,并给出测试数据和实验结果;
4.为增加程序可读性,请在程序中进行适当注释说明;
5.整理上机步骤,总结经验和体会;
6.认真完成并按时提交实验报告。
【实验过程记录(源程序、测试用例、测试结果及心得体会等)】
使用的是LL
(1)分析法,其分析表的构造方法和构造过程如下:
实验源代码:
#include
#include
#definesize1024
usingnamespacestd;
intgetLength(charstr[size])
{
inti=0;
while(str[i]!
='\0')
i++;
returni;
}
intgetstringLength(stringstr)
{
inti=0;
while(str[i]!
='\0')
i++;
returni;
}
chargettop(charstack[size],inttop)
{
if(stack[top]!
='\0')
returnstack[top];
else
return'#';
}
voidpopstack(char*stack,int*pointer)
{
intp=*pointer;
cout<<"\tPopup"< "; stack[p]='\0'; (*pointer)--; } voidpushstack(char*stack,int*pointer,stringstr) { inti=0; intlength=getstringLength(str); cout<<"push"< for(i=length-1;i>=0;i--) { (*pointer)++; stack[(*pointer)]=str[i]; } } intgetcol(chartop) { switch(top) { case'+': return0; case'-': return1; case'*': return2; case'/': return3; case'^': return4; case')': return5; case'#': return6; case'(': return7; case'i': return8; default: cout<<"Error! Thischaracterstringisnotthisgrammer`ssentence."< return-1; } } voidshow(charstr[size],intindex) { intlength=getLength(str); if(index! =-1) cout<<"\t"; for(inti=index+1;i cout< } intmain() { charstr[size];//接受字符串的数组 charstack[size];//进行比对的栈 intpointer=-1;//指向栈顶的指针 intlength=0;//记录字符串长度 intindex=0;//记录输入字符串 chartop; inti,j;//i表示行,j表示列 stringproduction; boolmatch=false; stringtable[7][9]={//+-*/^)#(i /*E*/"error","error","error","error","error","error","error","TX","TX", /*X*/"+TX","-TX","error","error","error","empty","empty","error","error", /*T*/"error","error","error","error","error","error","error","FY","FY", /*Y*/"empty","empty","*FY","/FY","error","empty","empty","error","error", /*F*/"error","error","error","error","error","error","error","PZ","PZ", /*Z*/"empty","empty","empty","empty","^F","empty","empty","error","error", /*P*/"error","error","error","error","error","error","error","(E)","i"}; cout<<"Pleaseinputcharacterstring: "; cin>>str; length=getLength(str); str[length]='#'; str[length+1]='\0'; //cout< //cout< cout<<"符号栈\t当前符号\t输入串\t\t\t\t说明"< pointer++; stack[pointer]='#'; pointer++; stack[pointer]='E';//初始化栈,使栈底是#E while(str[index]! ='\0') { top=gettop(stack,pointer); switch(top) { case'E': i=0;//第1行 j=getcol(str[index]); production=table[i][j]; if(production=="error") { cout<<"Error! Thischaracterstringisnotthisgrammer`ssentence."< return0; } elseif(production=="empty") { cout<<"\n"; show(stack,-1); cout<<"\t"< show(str,index); popstack(stack,&pointer); } else//说明可以进行分解非终结符 { cout<<"\n"; show(stack,-1); cout<<"\t"< show(str,index); popstack(stack,&pointer); pushstack(stack,&pointer,production); } break; case'X': i=1;//第2行 j=getcol(str[index]); production=table[i][j]; if(production=="error") { cout<<"Error! Thischaracterstringisnotthisgrammer`ssentence."< return0; } elseif(production=="empty") { cout<<"\n"; show(stack,-1); cout<<"\t"< show(str,index); popstack(stack,&pointer); } else//说明可以进行分解非终结符 { cout<<"\n"; show(stack,-1); cout<<"\t"< show(str,index); popstack(stack,&pointer); pushstack(stack,&pointer,production); } break; case'T': i=2;//第3行 j=getcol(str[index]); production=table[i][j]; if(production=="error") { cout<<"Error! Thischaracterstringisnotthisgrammer`ssentence."< return0; } elseif(production=="empty") { cout<<"\n"; show(stack,-1); cout<<"\t"< show(str,index); popstack(stack,&pointer); } else//说明可以进行分解非终结符 { cout<<"\n"; show(stack,-1); cout<<"\t"< show(str,index); popstack(stack,&pointer); pushstack(stack,&pointer,production); } break; case'Y': i=3;//第4行 j=getcol(str[index]); production=table[i][j]; if(production=="error") { cout<<"Error! Thischaracterstringisnotthisgrammer`ssentence."< return0; } elseif(production=="empty") { cout<<"\n"; show(stack,-1); cout<<"\t"< show(str,index); popstack(stack,&pointer); } else//说明可以进行分解非终结符 { cout<<"\n"; show(stack,-1); cout<<"\t"< show(str,index); popstack(stack,&pointer); pushstack(stack,&pointer,production); } break; case'F': i=4;//第5行 j=getcol(str[index]); production=table[i][j]; if(production=="error") { cout<<"Error! Thischaracterstringisnotthisgrammer`ssentence."< return0; } elseif(production=="empty") { cout<<"\n"; show(stack,-1); cout<<"\t"< show(str,index); popstack(stack,&pointer); } else//说明可以进行分解非终结符 { cout<<"\n"; show(stack,-1); cout<<"\t"< show(str,index); popstack(stack,&pointer); pushstack(stack,&pointer,production); } break; case'Z': i=5;//第6行 j=getcol(str[index]); production=table[i][j]; if(production=="error") { cout<<"Error! Thischaracterstringisnotthisgrammer`ssentence."< return0; } elseif(production=="empty") { cout<<"\n"; show(stack,-1); cout<<"\t"< show(str,index); popstack(stack,&pointer); } else//说明可以进行分解非终结符 { cout<<"\n"; show(stack,-1); cout<<"\t"< show(str,index); popstack(stack,&pointer); pushstack(stack,&pointer,production); } break; case'P': i=6;//第7行 j=getcol(str[index]); production=table[i][j]; if(production=="error") { cout<<"Error! Thischaracterstringisnotthisgrammer`ssentence."< return0; } elseif(production=="empty") { cout<<"\n"; show(stack,-1); cout<<"\t"< show(str,index); popstack(stack,&pointer); } else//说明可以进行分解非终结符 { cout<<"\n"; show(stack,-1); cout<<"\t"< show(str,index); popstack(stack,&pointer); pushstack(stack,&pointer,production); } break; case'+': switch(str[index]) { case'+': cout<<"\n"; show(stack,-1); cout<<"\t"< show(str,index); cout<<"\tMatch+! ";//"Popup+andnextcharin."< popstack(stack,&pointer); match=true; break; default: cout<<"Error! Thischaracterstringisnotthisgrammer`ssentence."< return0; } break; case'-': switch(str[index]) { case'-': cout<<"\n"; show(stack,-1); cout<<"\t"< show(str,index); cout<<"\tMatch-! ";//Popup-andnextcharin."< popstack(stack,&pointer); match=true; break; default: cout<<"Error! Thischaracterstringisnotthisgrammer`ssentence."< return0; } break; case'*': switch(str[index]) { case'*': cout<<"\n"; show(stack,-1); cout<<"\t"< show(str,index); cout<<"\tMatch*! ";//Popup*andnextcharin."< popstack(stack,&pointer); match=true; break; default: cout<<"Error! Thischaracterstringisnotthisgrammer`ssentence."< return0; } break; case'/': switch(str[index]) { case'/': cout<<"\n"; show(stack,-1); cout<<"\t"< show(str,index); cout<<"\tMatch/! ";//Popup/andnextcharin."< popstack(stack,&pointer); match=true; break; default: cout<<"Error! Thischaracterstringisnotthisgrammer`ssentence."< return0; } break; case'(': switch(str[index]) { case'(': cout<<"\n"; show(stack,-1); cout<<"\t"< show(str,index); cout<<"\tMatch(! ";//Popup(andnextcharin."< popstack(stack,&pointer); match=true; break; default: cout<<"Error! Thischaracterstringisnotthisgrammer`ssentence."< return0; } break; case')': switch(str[index]) { case')': cout<<"\n"; show(stack,-1); cout<<"\t"< show(str,index); cout<<"\tMatch)! ";//Popup)and 如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。 copyright@ 2008-2022 冰点文档网站版权所有 经营许可证编号:鄂ICP备2022015515号-1