编译原理实验报告4.docx

上传人:b****5 文档编号:11739752 上传时间:2023-03-31 格式:DOCX 页数:21 大小:98.43KB
下载 相关 举报
编译原理实验报告4.docx_第1页
第1页 / 共21页
编译原理实验报告4.docx_第2页
第2页 / 共21页
编译原理实验报告4.docx_第3页
第3页 / 共21页
编译原理实验报告4.docx_第4页
第4页 / 共21页
编译原理实验报告4.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

编译原理实验报告4.docx

《编译原理实验报告4.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告4.docx(21页珍藏版)》请在冰豆网上搜索。

编译原理实验报告4.docx

编译原理实验报告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;

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1