安徽工业大学编译原理实验报告

2019-04-21 10:11

编译原理实验报告

姓名:叶玉虎 班级:计122班 指导老师:王森玉 实验日期:2015/5/11

实验内容:

1.求出每个非终结符的FIRST集合 2.求出每个产生式右部的FIRST集合 3.求出每个非终结符的Follow集合 实验环境:

Visual Studio2010 实验目的:

让同学们掌握FIRST集合和FOLLOW集合的求法

实验代码:

#include #include #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;i

//求出含有的非终结符的个数,并把各终结符保存起来 for(i=0;i

{ l[j].num++; flag=1; break; } else flag=0; } if((!cnt)||(!flag)) { l[cnt].ch=a[i][0]; l[cnt].flag=-1; l[cnt].num=1; l[cnt].s=0; l[cnt].l=0; cnt++; flag=1; continue; } }

c=count; while(c) { for(i=0;i


安徽工业大学编译原理实验报告.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《甲午中日战争》教学设计与课后反思

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: