编译原理实验报告4.docx
- 文档编号:3731145
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:19
- 大小:96.47KB
编译原理实验报告4.docx
《编译原理实验报告4.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告4.docx(19页珍藏版)》请在冰豆网上搜索。
编译原理实验报告4
实验报告
课程名称:
编译原理
实验名称:
实验四语法分析
(一)——预测分析技术
学生姓名:
杨甜甜班级计算机134学号13416725
学院(系):
信息数理学院指导教师:
张英丽
实验时间:
2016年5月10日实验成绩:
实验四语法分析
(一)——预测分析技术
实验目的:
对给定的文法及其预测分析表,对输入的符号串进行识别,并给出符号串的识别过程,包括各步骤的栈内容,输入和输出。
实验要求:
首先应该详细掌握预测分析技术的原理,方法详细的分析步骤。
其次要了解数据结构中栈部分的内容,包括栈的特点及在预测分析中的使用情况,预测分析其实可以看成是对两个基本的栈的操作,因此,对栈的有关知识要求比较熟悉。
在实验前可复习数据结构中栈的内容,这样可使本实验比较顺利的进行。
下面以例说明最后所应实现的功能
输入文法规则
0:
Z:
:
=BA1:
A:
:
=+BA2:
A:
:
=ε
3:
B:
:
=DC4:
C:
:
=*DC5:
C:
:
=ε
6:
D:
:
=(Z)7:
D:
:
=i
输入预测分析表!
0:
Z:
:
=BA1:
A:
:
=+BA2:
A:
:
=ε
3:
B:
:
=DC4:
C:
:
=*DC5:
C:
:
=ε
6:
D:
:
=(Z)7:
D:
:
=i
依次输入PTable[Z,+]PTable[Z,*]PTable[Z,(]PTable[Z,)]PTable[Z,i]PTable[Z,#]
对应的规则编号:
-1-10-10-1
依次输入PTable[A,+]PTable[A,*]PTable[A,(]PTable[A,)]PTable[A,i]PTable[A,#]
对应的规则编号:
1-1-12-12
依次输入PTable[B,+]PTable[B,*]PTable[B,(]PTable[B,)]PTable[B,i]PTable[B,#]
对应的规则编号:
-1-13-13-1
依次输入PTable[C,+]PTable[C,*]PTable[C,(]PTable[C,)]PTable[C,i]PTable[C,#]
对应的规则编号:
54-15-15
依次输入PTable[D,+]PTable[D,*]PTable[D,(]PTable[D,)]PTable[D,i]PTable[D,#]
对应的规则编号:
-1-16-17-1
+*()i#
ZZ:
:
=BAZ:
:
=BA
AA:
:
=+BAA:
:
=εA:
:
=ε
BB:
:
=DCB:
:
=DC
CC:
:
=εC:
:
=*DCC:
:
=εC:
:
=ε
DD:
:
=(Z)D:
:
=i
请输入要识别的符号串:
i+i*i
步骤栈输入输出
0#Zi+i*i#Z:
:
=BA
1#ABi+i*i#B:
:
=DC
2#ACDi+i*i#D:
:
=i
3#ACii+i*i#
4#AC+i*i#C:
:
=ε
5#A+i*i#A:
:
=+BA
6#AB++i*i#
7#ABi*i#B:
:
=DC
8#ACDi*i#D:
:
=i
9#ACii*i#
10#AC*i#C:
:
=*DC
11#ACD**i#
12#ACDi#D:
:
=i
13#ACii#
14#AC#C:
:
=ε
15#A#A:
:
=ε
16##Success!
该符号串是该文法的句子!
输入要识别的符号串:
ii
步骤栈输入输出
0#Zii#Z:
:
=BA
1#ABii#B:
:
=DC
2#ACDii#D:
:
=i
3#ACiii#
4#ACi#Failure!
该符号串不是该文法的句子!
实验心得:
本次实验主要练习了预测分析技术,通过对给定的文法及其预测分析表,对输入的符号串进行识别,并给出符号串的识别过程,包括各步骤的栈内容,输入和输出。
相比于之前的实验,本次的实验具有一定的难度,在实验的过程中,要耐心的调试,确保实验的顺利完成。
参考程序
#include
#include
#include
#include
structRegularity//存放文法规则的数组结构
{
charregular[20];
};
classStack//定义一个栈类
{
public:
Stack(int=10);
~Stack(){delete[]elements;}
voidPush(constchar&item);
charPop();
charGetTop();
voidMakeEmpty(){top=-1;}
intIsEmpty()const{returntop==-1;}
intIsFull()const{returntop==maxSize-1;}
voiddisplay();
private:
inttop;
char*elements;
intmaxSize;
};
Stack:
:
Stack(ints):
top(-1),maxSize(s)
{
elements=newchar[maxSize];
assert(elements!
=0);
}
voidStack:
:
Push(constchar&item)
{
assert(!
IsFull());
elements[++top]=item;
}
charStack:
:
Pop()
{
assert(!
IsEmpty());
returnelements[top--];
}
charStack:
:
GetTop()
{
assert(!
IsEmpty());
returnelements[top];
}
voidStack:
:
display()
{
elements[top+1]='\0';
cout< } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// voidFindVN(charVN[],RegularityArray[],intlength) { inti,j,size=0; for(i=0;i { for(j=0;j if(VN[j]==Array[i].regular[0])break; if(j==size) { VN[size]=Array[i].regular[0]; size++; VN[size]='\0'; } } } voidFindVT(charVT[],RegularityArray[],intlength) { inti,j,k,m,size=0; for(i=0;i { for(j=4;j { for(k=0;k if(Array[k].regular[0]==Array[i].regular[j])break; if(k==length&&Array[i].regular[j]! ='ε') { for(m=0;m if(VT[m]==Array[i].regular[j])break; if(m==size) { VT[size]=Array[i].regular[j]; size++; VT[size]='\0'; } } } } VT[size]='#'; VT[size+1]='\0'; } intFindRegularity(intPTable[][20],charVN[],charVT[],chartemp1,chartemp2) { inti,j; intsize1=strlen(VN); intsize2=strlen(VT); for(i=0;i if(VN[i]==temp1)break; for(j=0;j if(VT[j]==temp2)break; returnPTable[i][j]; } intCheckVT(charVT[],chartemp) { inti; intsize=strlen(VT); for(i=0;i if(VT[i]==temp)return1; return0; } voidDisplay(RegularityArray[],intlength) { cout< : left); inti; for(i=0;i { cout< "; cout< if((i+1)%3==0)cout< } cout< } voidDisplayString(charTD[],intindex) { inti,j; chartemp[20]; intsize=strlen(TD); for(i=index,j=0;i temp[j]=TD[i]; temp[j]='\0'; cout< } voidInputRegularity(RegularityArray[],int&length,charVN[],charVT[]) { inti; cout<<"请输入文法规则的数目: "; cin>>length; for(i=0;i { cout<<"请输入编号为"< "; cin>>Array[i].regular; } FindVN(VN,Array,length); FindVT(VT,Array,length); } voidInputPredictTable(RegularityArray[],intlength,intPTable[][20],charVN[],charVT[]) { inti,j; intsize1=strlen(VN); intsize2=strlen(VT); cout<<"请输入预测分析表! "< Display(Array,length); for(i=0;i { cout<<"依次输入"; for(j=0;j cout<<"PTable["< cout<<"对应的规则编号: "; for(j=0;j cin>>PTable[i][j]; } } voidShowRegularity(RegularityArray[],intlength) { Display(Array,length); } voidShowPredictTable(RegularityArray[],intPTable[][20],charVN[],charVT[]) { inti,j; intsize1=strlen(VN); intsize2=strlen(VT); cout< : left); cout< : right); cout< for(i=0;i cout< cout< for(i=0;i { cout< for(j=0;j { if(PTable[i][j]>=0) cout< else cout< } cout< } } voidRecogniseString(RegularityArray[],intlength,intPTable[][20],charVN[],charVT[],Stack&stack) { inti,index=0,count=0; charTD[20]; stack.MakeEmpty(); stack.Push('#'); stack.Push(Array[0].regular[0]); Display(Array,length); cout<<"请输入要识别的符号串: "; cin>>TD; i=strlen(TD); TD[i]='#'; TD[i+1]='\0'; cout< : left); cout< cout< cout< cout< : left); cout< : right); cout< cout< : right); cout< : left); cout< cout< while (1) { cout< cout< cout< stack.display(); cout< : left); cout< : right); cout< DisplayString(TD,index); cout< : right); cout< : left); if(stack.GetTop()=='#'&&TD[index]=='#') { cout< cout< "; cout< cout<<"该符号串是该文法的句子! "< break; } else { if(CheckVT(VT,stack.GetTop())) { if(stack.GetTop()! =TD[index]) { cout< cout< "; cout< cout<<"该符号串不是该文法的句子! "< break; } else { stack.Pop(); index++; cout< } } else { i=FindRegularity(PTable,VN,VT,stack.GetTop(),TD[index]); if(i==-1) { cout< cout< "; cout< cout<<"该符号串不是该文法的句子! "< break; } else { cout< cout< stack.Pop(); if(Array[i].regular[4]! ='ε') { for(intj=strlen(Array[i].regular)-1;j>=4;j--) stack.Push(Array[i].regular[j]); } } } } count++; cout< } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// voidmain() { RegularityArray[20];//定义数组存放文法规则 charVN[20];//定义数组存放非终结符号 charVT[20];//定义数组存放终结符号 intPTable[20][20];//定义二维数组存放预测分析表 intlength=0; Stackstack(20);//创建栈用于识别符号串 intsel; intsign1=0,sign2=0; aaa: //显示用户界面 cout<<"-----输入文法规则请按------->1"< cout<<"-----输入预测分析表请按----->2"< cout<<"-----查看文法规则请按------->3"< cout<<"-----查看预测分析表请按----->4"< cout<<"-----识别输入符号串请按----->5"< cout<<"-----退出程序请按----------->6"< do { cin>>sel; }while(sel! =1&&sel! =2&&sel! =3&&sel! =4&&sel! =5&&sel! =6); switch(sel) { case1: //输入文法规则 sign1=1; InputRegularity(Array,length,VN,VT); break; case2: //输入预测分析表 if(sign1==0) cout<<"请先输入文法规则! "< else { sign2=1; InputPredictTable(Array,length,PTable,VN,VT); } break; case3: //查看文法规则 if(sign1==0) cout<<"请先输入文法规则! "< elseif(sign1==1&&sign2==0) cout<<"请先输入预测分析表! "< else ShowRegularity(Array,length); break; case4: //查看预测分析表 if(sign1==0) cout<<"请先输入文法规则! "< elseif(sign1==1&&sign2==0) cout<<"请先输入预测分析表! "< else ShowPredictTable(Array,PTable,VN,VT); break; case5: //识别用户输入的符号串 if(sign1==0) cout<<"请先输入文法规则! "< elseif(sign1==1&&sign2==0) cout<<"请先输入预测分析表! "< else RecogniseString(Array,length,PTable,VN,VT,stack); break; case6: break; } if(sel! =6) { cout< gotoaaa; } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 报告