编译原理实验报告LL(1)分析法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程编译原理实验名称实验二 LL(1)分析法

实验目的

1.掌握LL(1)分析法的基本原理;

2.掌握LL(1)分析表的构造方法;

3.掌握LL(1)驱动程序的构造方法。

一.实验内容及要求

根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析LL(1)分析法的理解。

对下列文法,用LL(1)分析法对任意输入的符号串进行分析:

(1)E->TG

(2)G->+TG

(3)G->ε

(4)T->FS

(5)S->*FS

(6)S->ε

(7)F->(E)

(8)F->i

程序输入一以#结束的符号串(包括+*()i#),如:i+i*i#。输出过程如下:

步骤分析栈剩余输入串所用产生式

1 E i+i*i# E->TG

... ... ... ...

二.实验过程及结果

代码如下:

#include

#include "edge.h"

using namespace std;

edge::edge()

{

cin>>left>>right;

rlen=right.length();

if(NODE.find(left)>NODE.length())

NODE+=left;

}

string edge::getlf()

{

return left;

}

string edge::getrg()

{

return right;

}

string edge::getfirst()

{

return first;

}

string edge::getfollow()

{

return follow;

}

string edge::getselect()

{

return select;

}

string edge::getro()

{

string str;

str+=right[0];

return str;

}

int edge::getrlen()

{

return right.length();

}

void edge::newfirst(string w)

{

int i;

for(i=0;i

if(first.find(w[i])>first.length())

first+=w[i];

}

void edge::newfollow(string w)

{

int i;

for(i=0;i

if(follow.find(w[i])>follow.length()&&w[i]!='@')

follow+=w[i];

}

void edge::newselect(string w)

{

int i;

for(i=0;i

if(select.find(w[i])>select.length()&&w[i]!='@')

select+=w[i];

}

void edge::delfirst()

{

int i=first.find('@');

first.erase(i,1);

}

int SUM;

string NODE,ENODE;

//计算first

void first(edge ni,edge *n,int x)

{

int i,j;

for(j=0;j

{

if(ni.getlf()==n[j].getlf())

{

if(NODE.find(n[j].getro())

{

for(i=0;i

if(n[i].getlf()==n[j].getro())

first(n[i],n,x);

}

else

n[x].newfirst(n[j].getro());

}

}

}

//计算follow

void follow(edge ni,edge *n,int x)

{

int i,j,k,s;

string str;

for(i=0;i

{

s=NODE.find(ni.getrg()[i]);

if(s-1) //是非终结符

if(i

for(j=0;j

if(n[j].getlf().find(ni.getrg()[i])==0)

{

if(NODE.find(ni.getrg()[i+1])

{

for(k=0;k

if(n[k].getlf().find(ni.getrg()[i+1])==0)

{

n[j].newfollow(n[k].getfirst());

if(n[k].getfirst().find("@")

n[j].newfollow(ni.getfollow());

}

}

else

{

str.erase();

str+=ni.getrg()[i+1];

n[j].newfollow(str);

}

}

}

}

//计算select

void select(edge &ni,edge *n)

{

int i,j;

if(ENODE.find(ni.getro())

{

ni.newselect(ni.getro());

if(ni.getro()=="@")

ni.newselect(ni.getfollow());

}

else

for(i=0;i

{

相关文档
最新文档