武汉理工大学《编译原理》课程设计说明书
char queue[MAX]; int sp,front;
int M[10][14]={ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,-1,-1,-1}, {1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 3, 2,-1}, {4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {5,-1,-1,-1,-1,-1,-1,-1,5,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,6,7,-1,-1,-1,-1,-1, 8, 8, 8}, {9,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,12,12,10,11,-1,-1,-1,12,12,12}, {14,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,-1,-1}, {-1,15,16,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, }; //预测分析表 int f=0; int count=0; int c=0;
char arr_i[MAX]; //字符管理 char var[MAX]; //表格管理
int td[MAX]; //输出产生式序列 int t=0; int opd=-1; int opr=-1; int id=0;
//int ptr[MAX]; int d=0;
char arr[MAX][5]; //存放待输出的三地址 //char keyword[2][11]={\
int len(char str[]) { int i=0; while(str[i]!='\\0')i++; return i; }
int index(char ch,char str[]) { int i=0; while(str[i]!='\\0') { if(ch!=str[i])i++; else break; } if(str[i]=='\\0')return -1; return i;
21
武汉理工大学《编译原理》课程设计说明书
}
//出错管理选项 void err(int n) { if(n==1) cout<<\字符不匹配\ else if(n==2) cout<<\字符没有出现在产生式终结符集VT中\ else if(n==3) cout<<\没有找到合适的候选产生式来做进一步推导\ else cout<<\该句子是文法语言的句子!\}
//打印此法分析结果 void print() { cout<<\ if(count<10)cout<<'0'; cout< //语义分析程序 void semantic() { if(VT[opr]=='=') //{\判断}; { arr[d][1]=arr_i[opd]; arr[d][0]='='; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++; } else if(VT[opr]=='>') //{\判断}; { arr[d][1]=arr_i[opd]; 22 武汉理工大学《编译原理》课程设计说明书 arr[d][0]='>'; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++; } else if(VT[opr]=='<') //{\判断}; { arr[d][1]=arr_i[opd]; arr[d][0]='<'; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++; } else if(VT[opr]=='+') { arr[d][1]=arr_i[opd]; arr[d][0]='+'; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++; } else if(VT[opr]=='-') { arr[d][1]=arr_i[opd]; arr[d][0]='-'; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++; } else if(VT[opr]=='*') { arr[d][1]=arr_i[opd]; arr[d][0]='*'; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++; } else if(VT[opr]=='/') { arr[d][1]=arr_i[opd]; //{\判断}; //{\判断}; //{\判断}; //{\判断};23 武汉理工大学《编译原理》课程设计说明书 arr[d][0]='/'; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++; } else if(opr==-2) //{其他字符判断}; { arr[d][1]=id-1; arr[d][0]=' '; arr[d][2]=arr_i[opd]; arr[d][3]=' '; arr[d][4]=' '; } else if(VT[opr]!='<'&&VT[opr]!='>'&&VT[opr]!='+'&&VT[opr]!='-'&&VT[opr]!='*'&&VT[opr]!='/')//{\结束符判断}; arr[d][1]=id-1; { d++; } } //语法分析程序 void syntax() { int n; count++; print(); X=stack[sp]; a=queue[front]; if(X=='#'&&a=='#')f=4; if(X<'A'||X>'Z') //{判断字符集不是大写字母集合} { if(X==a) { sp--; front++; if(a!='i') //{\是特征字母} { if(a!='f'&&a!='t'&&a!='e'&&a!=';'&&a!='#') { opr=index(a,VT); semantic(); } 24 武汉理工大学《编译原理》课程设计说明书 else if(a==';'||a=='e'||a=='t'||a=='#') { opr=-2; semantic(); } cout<<'\\t'<<'\\''<=0;i--) { stack[++sp]=p[n][i]; cout< if(f==0)syntax(); else 25