欢迎来到天天文库
浏览记录
ID:40735432
大小:239.00 KB
页数:25页
时间:2019-08-06
《南邮编译原理报告实验二资料》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、实验报告(2015/2016学年第二学期)课程名称编译原理实验名称语法分析器的构造实验时间2016年5月26日指导单位计算机软件教学中心指导教师黄海平学生姓名班级学号学院(系)计算机学院、软件学院专业计算机科学与技术-25-实验报告实验名称语法分析器的构造指导教师黄海平实验类型验证实验学时4实验时间2016.5.26一、实验目的和要求实验目的:设计、编制、调试一个LL(1)语法分析器,利用语法分析器对符号串的识别,加深对语法分析原理的理解。实验要求:1、检测左递归,如果有则进行消除;2、求解FIRST集和FOLLOW集;3、构建LL(1)分析表;4、构建LL分析程序,对于用户输入
2、的句子,能够利用所构造的分析程序进行分析,并显示出分析过程。以上实验要求可分两个同学完成。例如构建分析表一个同学完成、构建分析程序并分析符号串另一个同学完成。二、实验环境(实验设备)硬件:计算机软件:VisualC++6.0-25-一、实验原理及内容实验内容:设计并实现一个LL(1)语法分析器,实现对算术文法G[E]:E->E+T
3、TT->T*F
4、FF->(E)
5、i所定义的符号串进行识别,例如符号串abc+age+80为文法所定义的句子,符号串(abc-80(*s5)不是文法所定义的句子。实验代码:#include#include#include<
6、iostream>usingnamespacestd;voidinput_grammer(string*G)//输入文法G,n个非终结符{inti=0;//计数charch='y';while(ch=='y'){cin>>G[i++];cout<<"继续输入?(y/n)";cin>>ch;}-25-}voidpreprocess(string*G,string*P,string&U,string&u,int&n,int&t,int&k)//将文法G预处理产生式集合P,非终结符、终结符集合U、u,{inti,j,r,temp;//计数charC;//记录规则中()后的符号int
7、flag;//检测到()n=t=k=0;for(i=0;i<50;i++)P[i]="";//字符串如果不初始化,在使用P[i][j]=a时将不能改变,可以用P[i].append(1,a)U=u="";//字符串如果不初始化,无法使用U[i]=a赋值,可以用U.append(1,a)for(n=0;!G[n].empty();n++){U[n]=G[n][0];}//非终结符集合,n为非终结符个数for(i=0;i8、j])==string::npos)if(G[i][j]!='9、'&&G[i][j]!='^')//if(G[i][j]!='('&&G[i][j]!=')'&&G[i][j]!='10、'&&G[i][j]!='^')-25-u[t++]=G[i][j];}}//终结符集合,t为终结符个数for(i=0;i11、i][temp]!=')';temp++);C=G[i][temp+1];//C记录()后跟的字符,将C添加到()中所有字符串后面}if(G[i][j]==')'){j++;flag=0;}*/if(G[i][j]=='12、'){//if(flag==1)P[k][r++]=C;k++;j++;P[k][0]=U[i];P[k][1]=':';P[k][2]=':';P[k][3]='=';-25-r=4;P[k][r++]=G[i][j];}else{P[k][r++]=G[i][j];}}k++;}//获得产生式集合P,k为产生式个数}inteliminate_1(string13、*G,string*P,stringU,string*GG)//消除文法G1中所有直接左递归得到文法G2,要能够消除含有多个左递归的情况){stringarfa,beta;//所有形如A::=Aα14、β中的α、β连接起来形成的字符串arfa、betainti,j,temp,m=0;//计数intflag=0;//flag=1表示文法有左递归intflagg=0;//flagg=1表示某条规则有左递归charC='A';//由于消除左递归新增的非终结符,从A开始增加,只要不在原来问法
8、j])==string::npos)if(G[i][j]!='
9、'&&G[i][j]!='^')//if(G[i][j]!='('&&G[i][j]!=')'&&G[i][j]!='
10、'&&G[i][j]!='^')-25-u[t++]=G[i][j];}}//终结符集合,t为终结符个数for(i=0;i11、i][temp]!=')';temp++);C=G[i][temp+1];//C记录()后跟的字符,将C添加到()中所有字符串后面}if(G[i][j]==')'){j++;flag=0;}*/if(G[i][j]=='12、'){//if(flag==1)P[k][r++]=C;k++;j++;P[k][0]=U[i];P[k][1]=':';P[k][2]=':';P[k][3]='=';-25-r=4;P[k][r++]=G[i][j];}else{P[k][r++]=G[i][j];}}k++;}//获得产生式集合P,k为产生式个数}inteliminate_1(string13、*G,string*P,stringU,string*GG)//消除文法G1中所有直接左递归得到文法G2,要能够消除含有多个左递归的情况){stringarfa,beta;//所有形如A::=Aα14、β中的α、β连接起来形成的字符串arfa、betainti,j,temp,m=0;//计数intflag=0;//flag=1表示文法有左递归intflagg=0;//flagg=1表示某条规则有左递归charC='A';//由于消除左递归新增的非终结符,从A开始增加,只要不在原来问法
11、i][temp]!=')';temp++);C=G[i][temp+1];//C记录()后跟的字符,将C添加到()中所有字符串后面}if(G[i][j]==')'){j++;flag=0;}*/if(G[i][j]=='
12、'){//if(flag==1)P[k][r++]=C;k++;j++;P[k][0]=U[i];P[k][1]=':';P[k][2]=':';P[k][3]='=';-25-r=4;P[k][r++]=G[i][j];}else{P[k][r++]=G[i][j];}}k++;}//获得产生式集合P,k为产生式个数}inteliminate_1(string
13、*G,string*P,stringU,string*GG)//消除文法G1中所有直接左递归得到文法G2,要能够消除含有多个左递归的情况){stringarfa,beta;//所有形如A::=Aα
14、β中的α、β连接起来形成的字符串arfa、betainti,j,temp,m=0;//计数intflag=0;//flag=1表示文法有左递归intflagg=0;//flagg=1表示某条规则有左递归charC='A';//由于消除左递归新增的非终结符,从A开始增加,只要不在原来问法
此文档下载收益归作者所有