编译原理实验报告《LL(1)语法分析器构造》
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《LL(1)分析器的构造》实验报告
一、实验名称
LL(1)分析器的构造
二、实验目的
设计、编制、调试一个LL(1)语法分析器,利用语法分析器对符号串的识别,加深对语法分析原理的理解。
三、实验内容和要求
设计并实现一个LL(1)语法分析器,实现对算术文法:
G[E]:E->E+T|T
T->T*F|F
F->(E)|i
所定义的符号串进行识别,例如符号串i+i*i为文法所定义的句子,符号串ii+++*i+不是文法所定义的句子。
实验要求:
1、检测左递归,如果有则进行消除;
2、求解FIRST集和FOLLOW集;
3、构建LL(1)分析表;
4、构建LL分析程序,对于用户输入的句子,能够利用所构造的分析程序进行分析,并显示出分析过程。
四、主要仪器设备
硬件:微型计算机。
软件: Code blocks(也可以是其它集成开发环境)。
五、实验过程描述
1、程序主要框架
程序中编写了以下函数,各个函数实现的作用如下:
void input_grammer(string *G);.Xn的FIRST集
string** create_table(string *P,string U,string u,int n,int t,int k,string* first);ppend(1,a) U=u=" ";mpty();n++)
{ U[n]=G[n][0];
}ength();j++)
{
if(G[i][j])==string::npos&&(G[i][j])==string::npos)
if(G[i][j]!='|'&&G[i][j]!='^')
ength();j++)
{
P[k][0]=U[i];P[k][1]=':';P[k][2]=':';P[k][3]='=';
/* if(G[i][j]=='(')
{ j++;flag=1;
for(temp=j;G[i][temp]!=')';temp++);
C=G[i][temp+1];
ppend(1,U[i]);GG[m].append("::=");
if('|')!=string::npos) GG[m].append("("+beta+")");
else GG[m].append(beta);
while(C)!=string::npos){C++;}
GG[m].append(1,C);
m++;
GG[m].append(1,C);GG[m].append("::=");
if('|')!=string::npos) GG[m].append("("+arfa+")");
else GG[m].append(arfa);
GG[m].append(1,C);GG[m].append("|^");
m++;
C++;
}ind('^')==string::npos) first[r].append(1,'^');ind(a)==string::npos)ppend(1,a);
break;.Yk
{
s=(P[i][j]);
ind(a)==string::npos)ppend(1,a);
}
}
if(!empty[s]) break;ind('^')==string::npos)
first[r].append(1,'^');.Yk都能推导到空,则加入空符号
}
}
}
return first;
}
string FIRST(string U,string u,string* first,string s).Xn的FIRST集
{
int i,j,r;
char a;
string fir;
for(i=0;i<();i++)
{
if(s[i]=='^') (1,'^');
if(s[i])!=string::npos&&(s[i])==string::npos){ (1,s[i]);break;}ind('^')==string::npos) break;.的规则右部各符号压栈
i++;
}
r--;
}
}
else
{
cout<<"error\n";
cout< break; } } step++; } if(flag) cout< } int main() { int i,j; string *G=new string[50];//文法G string *P=new string[50];//产生式集合P string U,u;//文法G非终结符集合U,终结符集合u int n,t,k;//非终结符、终结符个数,产生式数 string *GG=new string[50];//消除左递归后的文法GG string *PP=new string[50];//文法GG的产生式集合PP string UU,uu;//文法GG非终结符集合U,终结符集合u int nn,tt,kk;//消除左递归后的非终结符、终结符个数,产生式数 string** table;//分析表 cout<<" 欢迎使用LL(1)语法分析器!\n\n\n"; cout<<"请输入文法(同一左部的规则在同一行输入,例如:E::=E+T|T;用^表示空串)\n"; input_grammer(G); preprocess(G,P,U,u,n,t,k); cout<<"\n该文法有"< for(i=0;i cout< cout<<"该文法有"< for(i=0;i cout<<"\n\n 左递归检测与消除\n\n"; if(eliminate_1(G,P,U,GG))