编译原理实验报告《LL(1)语法分析器构造》

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

相关文档
最新文档