文档库 最新最全的文档下载
当前位置:文档库 › 编译原理预测分析程序的设计与实现实验报告

编译原理预测分析程序的设计与实现实验报告

3.1目的和要求

1、掌握LL(1)语法分析的基本原理和方法。

2、掌握相应数据结构的设计方法。

3.2实验环境

Windows 7 + DEVC++6.0

3.3实验准备

首先将下列算术表达式文法

E-->E+T|T

T-->T*F|F

F-->(E)|i

改写文法为LL(1)文法;构造LL(1)预测分析表。

解:1)该文法为左递归文法,设非终结符A,B;

E=〉TA

A=〉+TA|ε

T=>FB

B=>*FB|ε

F=>(E)|i

2)计算FIRST,FELLOW,SELECT集:

因为A,B,F的的两个产生式的选择集都没有交集,所以,该文法为LL(1)文法。、

3)构造预测分析表

4)给出i+i的预测分析过程。

7 #AT+ +i# +匹配成功,出栈

8 #AT i# FB逆序替换T

9 #ABF i# i替换F

10 #ABi i# i匹配成功,出栈

11 #AB # B出栈

12 #A # A出栈

13 # # acc

3.4实验内容及步骤

1、根据预测分析表编写预测分析程序yuce。

2、编译成功后,提示输入符号串,用回车键查看输出的结果。

3、比较自己分析的结果和屏幕上的输出结果。

3.5实验小结

1、得到的经验。

2、遇到的主要问题。

3、改进方案。

自拟LL1文法G[A]:

E=>aAE

E=>b

A=>bA

A=>ε

1)计算FIRST,FOLLOW,SELECT集。

2)构造预测分析表。

E=>aAE

=>abAcE

=>abcb

3) 给出abcb的预测分析过程。

3)改进代码,其中用e代替ε

using namespace std;

int main(){

string sheet[2][5]={{"aAE","b","","",""}, //预测分析表

{"","bAc","e","","e"}};

vector S;//分析栈

vector Stc;//用户输入栈

vector SOS;//空栈

string STC;//用于获取用户输入的字符串

int YourChoice;

do{

cout<

S=SOS; //每次执行用空的SOS初始化分析栈

S.push_back('#');//将#放到分析栈中

S.push_back('E');//将E放到分析栈中

STC=""; //将STC设置为空

cout<<"请输入您要分析的字符串:";

cin>>STC;

STC.resize(STC.size()+1);

STC[STC.size()-1]='#';//将输入串最后一位设置为#

Stc=SOS; //Stc是将STC+#倒序压入的用户输入栈

for(int x=STC.size()-1;x>=0;--x)

Stc.push_back(STC[x]);

string YY="EA";

string XX="abce#";

while(!(S[S.size()-1]=='#'&&Stc[Stc.size()-1]=='#'))

{

int i=0,j=0;

////////////////////查表找到相应规则//////////////////// for(i=0;i<2;++i)

if(YY[i]==S[S.size()-1])

break;

for(j=0;j<5;++j)

if(XX[j]==Stc[Stc.size()-1])

break;

if(i>=5||j>=6) //如果查找超出表

{

cout<<"出错啦!"<

break;

}

else if(sheet[i][j]=="") {

cout<<"出错啦!"<

break;

}else{

///////////////分析栈里的压栈与弹栈////////////////////

S.pop_back();

for(int k=sheet[i][j].size()-1;k>=0;--k)

S.push_back(sheet[i][j][k]);

if(S[S.size()-1]==Stc[Stc.size()-1]) //一般规则

{

S.pop_back();

Stc.pop_back();

}

else if(S[S.size()-1]=='e') //含空串的规则

{

S.pop_back();

if(S[S.size()-1]!='#'&&Stc[Stc.size()-1]!='#'&&S[S.size()-1]==Stc[Stc.size()-1]) {

S.pop_back();

Stc.pop_back();}}}}

if(S[S.size()-1]=='#'&&Stc[Stc.size()-1]=='#')

cout<<"分析成功!"<

cout<<"继续分析";

}while(cin>>YourChoice&&YourChoice==0);

return 0; }

相关文档
相关文档 最新文档