编译原理实验报告4.docx
《编译原理实验报告4.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告4.docx(21页珍藏版)》请在冰豆网上搜索。
编译原理实验报告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;jif(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;kif(Array[k].regular[0]==Array[i].regular[j])break;
if(k==length&&Array[i].regular[j]!
='ε')
{
for(m=0;mif(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;iif(VN[i]==temp1)break;
for(j=0;jif(VT[j]==temp2)break;
returnPTable[i][j];
}
intCheckVT(charVT[],chartemp)
{
inti;
intsize=strlen(VT);
for(i=0;iif(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;itemp[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;jcout<<"PTable["<cout<<"对应的规则编号:
";
for(j=0;jcin>>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;icout<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;
}
}