- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理实验报告
姓名:叶玉虎
班级:计122班
指导老师:王森玉
实验日期:2015/5/11
实验内容:
1.求出每个非终结符的FIRST集合
2.求出每个产生式右部的FIRST集合
3.求出每个非终结符的Follow集合
实验环境:
Visual Studio2010
实验目的:
让同学们掌握FIRST集合和FOLLOW集合的求法
实验代码:
#includestdio.h
#includestring.h
#define MAX 50
char css[MAX][MAX];//保存所有的产生式
int count=0;
int cnt=0;
struct L{//保存所有的终结符
char ch;
int flag;//1:能推出ε,0:不能,初值:-1
int num;
char first[MAX];
int s;//first的长度
char follow[MAX];
int l;//follow的长度
}l[MAX];
//对输入的格式进行控制,并校验输入是否符合格式
int handle(char a[])
{
int len,i=0,j,k;
len=strlen(a);
while(a[i]!=10)
{
if(a[i]==$)
return 2;
if(( ==a[i])||(9==a[i]))
{
i++;
continue;
}
if((a[i]=A)(a[i]=Z))
{
if((a[i+1]!=-)||(a[i+2]!=))
{
printf(产生式格式错误\n);
return -1;
}
else
{
j=i;
k=0;
while((a[j]!= )(a[j]!=9)(a[j]!=$)(a[j]!=10))
{
if(a[j]==|)
{
css[count][k]=\0;
count++;
if((a[j+1]== )||(a[j]==9)||(a[j]==$)||(a[j]==10))
{
printf(产生式格式错误\n);
return 0;
}
css[count][0]=a[i];
css[count][1]=a[i+1];
css[count][2]=a[i+2];
k=3;
j++;
continue;
}
css[count][k]=a[j];
k++;
j++;
}
css[count][k]=\0;
i=j;
count++;
}
}
else
{
printf(产生式格式错误\n);
return -1;
}
}
return 0;
}
//从键盘获得输入
int input()
{
char a[MAX*MAX];
int v;
printf(输入产生式,产生式之间以空格回车或Tab键分隔,并以$键结束.\n);
printf(用@表示虚拟符号ε,终结符用大写字母表示,其他字符表示非终结符\n);
while(1)
{
fgets(a,MAX*MAX,stdin);
v=handle(a);
if(v==-1)
return -1;
if(v==2)
return 0;
}
}
//求出能推出ε的非终结符
void seekEmpty()
{
int i,j,k,t;
int flag=0,flag2=0;
int len,c;
char a[MAX][MAX],ch;
for(i=0;icount;i++)
{
strcpy(a[i],css[i]);
}
//求出含有的非终结符的个数,并把各终结符保存起来
for(i=0;icount;i++)
{
for(j=0;jcnt;j++)
{
if(l[j].ch==a[i][0])
{
l[j].num++;
flag=1;
break;
}
else
flag=0;
}
if((!cnt)||(!flag))
{
l[cnt].ch=a[i][0];
l[cnt].flag=-1;
文档评论(0)