- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
《编译原理》实验报告
专业班级:计093班
学号:
姓名:
指导老师:王森玉
实验内容:
1.求出每个非终结符的FIRST集合
2.求出每个产生式右部的FIRST集合
3.求出每个非终结符的Follow集合
实验环境:
VisualStudio2010
实验目的:
让同学们掌握FIRST集合和FOLLOW集合的求法
实验演示:
因为不知道怎么用电脑输出’ε’符号,我在代码里用’@’来表示‘ε’.以‘$’来结束输入
测试数据1:
S-aH
H-aMd|d
M-Ab|@
A-aM|e
输出结果:
测试数据2:
S-AB
S-bC
A-@
A-b
B-@
B-aD
C-AD
C-b
D-aS
D-c
输出结果:
测试数据3:
E-TX
X-+TX|@
T-FY
Y-*FY|@
F-i|(E)
输出结果:
容错处理:
由于出错情况比较多,我们随便测试一组错误。
测试数据:
S-ABA-@B-@
输出结果:
实验感想:
经过这几次的实验,不仅让我们更加深刻的知道了first集合和follow集合的计算步骤和方法,还很好的培养了我们动手能力。虽然这两个集合用笔算的方法很简单,但是要让计算机来演算就不是那么容易了,这需要设计合理的数据结构和算法才能正确地求出结果。当然在设计算法的时候难免会出现错误,这就需要我们这些程序员们仔细的去调试,发现错误并改正。本以为这次的实验代码不会很长,但是实际写好了却有好几百行,可能是我的算法不够好吧。总的来讲这次的实验没有遇到太大的问题,因为课上老师很认真的给我们讲解了它们的求法,笔推也做了好几次练习,让我们理清了思路。
实验代码:
#includestdio.h
#includestring.h
#defineMAX50
charcss[MAX][MAX];//保存所有的产生式
intcount=0;
intcnt=0;
structL{//保存所有的终结符
charch;
intflag;//1:能推出ε,0:不能,初值:-1
intnum;
charfirst[MAX];
ints;//first的长度
charfollow[MAX];
intl;//follow的长度
}l[MAX];
//对输入的格式进行控制,并校验输入是否符合格式
inthandle(chara[])
{
intlen,i=0,j,k;
len=strlen(a);
while(a[i]!=10)
{
if(a[i]==$)
return2;
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);
return0;
}
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;
}
}
return0;
}
//从键盘获得输入
intinput()
{
chara[MAX*MAX];
intv;
printf(输入产生式
文档评论(0)