编译原理实验报告LL(1)分析法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 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 {