编译原理实验报告4Word文档下载推荐.docx
- 文档编号:4997165
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:21
- 大小:98.43KB
编译原理实验报告4Word文档下载推荐.docx
《编译原理实验报告4Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告4Word文档下载推荐.docx(21页珍藏版)》请在冰点文库上搜索。
=(Z)7:
=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:
DD:
=(Z)D:
请输入要识别的符号串:
i+i*i
步骤栈输入输出
0#Zi+i*i#Z:
1#ABi+i*i#B:
2#ACDi+i*i#D:
3#ACii+i*i#
4#AC+i*i#C:
5#A+i*i#A:
=+BA
6#AB++i*i#
7#ABi*i#B:
8#ACDi*i#D:
9#ACii*i#
10#AC*i#C:
=*DC
11#ACD**i#
12#ACDi#D:
13#ACii#
14#AC#C:
15#A#A:
16##Success!
该符号串是该文法的句子!
输入要识别的符号串:
ii
0#Zii#Z:
1#ABii#B:
2#ACDii#D:
3#ACiii#
4#ACi#Failure!
该符号串不是该文法的句子!
实验心得:
本次实验主要练习了预测分析技术,通过对给定的文法及其预测分析表,对输入的符号串进行识别,并给出符号串的识别过程,包括各步骤的栈内容,输入和输出。
相比于之前的实验,本次的实验具有一定的难度,在实验的过程中,要耐心的调试,确保实验的顺利完成。
参考程序
#include<
iostream.h>
String.h>
assert.h>
iomanip.h>
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()
IsEmpty());
returnelements[top--];
GetTop()
returnelements[top];
display()
elements[top+1]='
\0'
;
cout<
<
elements;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
voidFindVN(charVN[],RegularityArray[],intlength)
inti,j,size=0;
for(i=0;
i<
length;
i++)
{
for(j=0;
j<
size;
j++)
if(VN[j]==Array[i].regular[0])break;
if(j==size)
VN[size]=Array[i].regular[0];
size++;
VN[size]='
}
voidFindVT(charVT[],RegularityArray[],intlength)
inti,j,k,m,size=0;
for(j=4;
strlen(Array[i].regular);
for(k=0;
k<
k++)
if(Array[k].regular[0]==Array[i].regular[j])break;
if(k==length&
&
Array[i].regular[j]!
='
ε'
)
{
for(m=0;
m<
m++)
if(VT[m]==Array[i].regular[j])break;
if(m==size)
{
VT[size]=Array[i].regular[j];
size++;
VT[size]='
}
}
VT[size]='
#'
VT[size+1]='
intFindRegularity(intPTable[][20],charVN[],charVT[],chartemp1,chartemp2)
inti,j;
intsize1=strlen(VN);
intsize2=strlen(VT);
size1;
if(VN[i]==temp1)break;
size2;
if(VT[j]==temp2)break;
returnPTable[i][j];
intCheckVT(charVT[],chartemp)
inti;
intsize=strlen(VT);
if(VT[i]==temp)return1;
return0;
voidDisplay(RegularityArray[],intlength)
setiosflags(ios:
left);
"
setw(12)<
Array[i].regular;
if((i+1)%3==0)cout<
endl;
voidDisplayString(charTD[],intindex)
chartemp[20];
intsize=strlen(TD);
for(i=index,j=0;
i++,j++)
temp[j]=TD[i];
temp[j]='
temp;
voidInputRegularity(RegularityArray[],int&
length,charVN[],charVT[])
请输入文法规则的数目:
cin>
>
请输入编号为"
的规则:
FindVN(VN,Array,length);
FindVT(VT,Array,length);
voidInputPredictTable(RegularityArray[],intlength,intPTable[][20],charVN[],charVT[])
请输入预测分析表!
Display(Array,length);
cout<
依次输入"
for(j=0;
cout<
PTable["
VN[i]<
"
VT[j]<
]"
cin>
PTable[i][j];
voidShowRegularity(RegularityArray[],intlength)
voidShowPredictTable(RegularityArray[],intPTable[][20],charVN[],charVT[])
resetiosflags(ios:
right);
setw(3)<
"
setw(10)<
VT[i];
setw(6)<
VN[i];
if(PTable[i][j]>
=0)
cout<
Array[PTable[i][j]].regular;
else
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]);
TD;
i=strlen(TD);
TD[i]='
TD[i+1]='
setw(5)<
步骤"
setw(4)<
栈"
输入"
setw(10);
输出"
while
(1)
{
count;
setw(6);
stack.display();
DisplayString(TD,index);
if(stack.GetTop()=='
TD[index]=='
Success!
break;
else
if(CheckVT(VT,stack.GetTop()))
if(stack.GetTop()!
=TD[index])
{
Failure!
break;
}
stack.Pop();
index++;
else
i=FindRegularity(PTable,VN,VT,stack.GetTop(),TD[index]);
if(i==-1)
if(Array[i].regular[4]!
for(intj=strlen(Array[i].regular)-1;
j>
=4;
j--)
stack.Push(Array[i].regular[j]);
count++;
voidmain()
RegularityArray[20];
//定义数组存放文法规则
charVN[20];
//定义数组存放非终结符号
charVT[20];
//定义数组存放终结符号
intPTable[20][20];
//定义二维数组存放预测分析表
intlength=0;
Stackstack(20);
//创建栈用于识别符号串
intsel;
intsign1=0,sign2=0;
aaa:
//显示用户界面
-----输入文法规则请按------->
1"
-----输入预测分析表请按----->
2"
-----查看文法规则请按------->
3"
-----查看预测分析表请按----->
4"
-----识别输入符号串请按----->
5"
-----退出程序请按----------->
6"
do
cin>
sel;
}while(sel!
=1&
sel!
=2&
=3&
=4&
=5&
=6);
switch(sel)
case1:
//输入文法规则
sign1=1;
InputRegularity(Array,length,VN,VT);
case2:
//输入预测分析表
if(sign1==0)
请先输入文法规则!
sign2=1;
InputPredictTable(Array,length,PTable,VN,VT);
case3:
//查看文法规则
if(sign1==0)
elseif(sign1==1&
sign2==0)
请先输入预测分析表!
ShowRegularity(Array,length);
case4:
//查看预测分析表
ShowPredictTable(Array,PTable,VN,VT);
case5:
//识别用户输入的符号串
RecogniseString(Array,length,PTable,VN,VT,stack);
case6:
break;
if(sel!
=6)
gotoaaa;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 报告