编译原理实验报告《LL(1)语法分析器构造》(推荐文档) 联系客服

发布时间 : 星期六 文章编译原理实验报告《LL(1)语法分析器构造》(推荐文档)更新完毕开始阅读4f0191bb53d380eb6294dd88d0d233d4b04e3f44

x=stack[i];stack.erase(i,1);i--;//取栈顶符号x,并从栈顶退出 //cout<

if(u.find(x)!=string::npos)//x是终结符的情况 {

if(x==a) {

s.erase(0,1);a=s[0];//栈顶符号与当前输入符号匹配,则输入下一个符号 cout<<\ \\n\未使用产生式,输出空 } else {

cout<<\

cout<

}

if(x=='#') {

if(a=='#') {flag=1;cout<<\成功\\n\栈顶和余留输入串都为#,匹配成功 else {

cout<<\

cout<

if(U.find(x)!=string::npos)//x是非终结符的情况 {

p=U.find(x); q=u.find(a); if(a=='#') q=t; temp=table[p][q];

cout<

r=9;

while(temp[r]==' ') r--; while(r>3) {

if(temp[r]!='^') {

stack.append(1,temp[r]);//将X::=x1x2...的规则右部各符号压栈 i++; }

9

r--;

} } else {

cout<<\

cout<

}

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<<\该文法有\个终结符:\\n\ for(i=0;i

cout<<\ 左递归检测与消除\\n\\n\ if(eliminate_1(G,P,U,GG))

10

{

preprocess(GG,PP,UU,uu,nn,tt,kk);

cout<<\该文法存在左递归!\\n\\n消除左递归后的文法:\\n\\n\ for(i=0;i

cout<<\新文法有\个非终结符:\\n\ for(i=0;i

cout<<\新文法有\个终结符:\\n\ for(i=0;i

//cout<<\新文法有\个产生式:\\n\ //for(i=0;i

{cout<<\该文法不存在左递归\\n\

GG=G;PP=P;UU=U;uu=u;nn=n;tt=t;kk=k; }

cout<<\ 求解FIRST集\\n\\n\ int *empty=ifempty(PP,UU,kk,nn);

string* first=FIRST_X(PP,UU,uu,empty,kk,nn); for(i=0;i

cout<<\ \

cout<<\ 求解FOLLOW集\\n\\n\ for(i=0;i

cout<<\ \

cout<<\ 构造文法分析表\\n\\n\ table=create_table(PP,UU,uu,nn,tt,kk,first); cout<<\ \

for(i=0;i

cout<

cout<<\ 分析符号串\\n\\n\ string s;

11

cout<<\请输入要分析的符号串\\n\ cin>>s;

analyse(table,UU,uu,tt,s); return 0; }

3、程序演示结果 (1)输入文法

(2)消除左递归

(3)求解FIRST和FOLLOW集

12