{
if(st[i][m+1]=='\\0'||st[i][m+1]=='|') {
if(zhongjie(st[i][m])) {
last[i][n]=st[i][m]; n++; } else {
if(zhongjie(st[i][m-1])) {
last[i][n]=st[i][m-1]; n++; }
if(st[i][m]!=c) {
lastvt(st[i][m]); for(j=0;j if(st[j][0]==st[i][m]) break; } for(k=0;k int t; for(t=0;t if(last[i][t]==last[j][k+1]) break; } if(t==n) { last[i][n]=last[j][k+1]; n++; } } } } } m++; }while(st[i][m]!='\\0'); last[i][n]='\\0'; last[i][0]=--n; 10 lflag[i]=1; } } int deal() //对输入串的分析 { int i,j; int x,y; int z; //输入串的长度 k=1; s[k]='#'; //栈置初值 for(i=0;input[i]!='\\0';i++); //计算输入串的长度 z=i--; i=0; while((a=input[i])!='\\0') { if(zhongjie(s[k])) j=k; else j=k-1; x=xiabiao(s[j]); y=xiabiao(a); if(data[x][y]=='>') { out(1,k,s); printf(\ out(i+1,z,input); printf(\归约\\n\ do { q=s[j]; if(zhongjie(s[j-1])) j=j-1; else j=j-2; x=xiabiao(s[j]); y=xiabiao(q); }while(data[x][y]!='<'); int m,n,N; for(m=j+1;m<=k;m++) { for(N=0;N for(n=1;string[N][n]!='\\0';n++) { if(!zhongjie(s[m])&&!zhongjie(string[N][n])) { 11 if(zhongjie(s[m+1])&&zhongjie(string[N][n+1]) &&s[m+1]==string[N][n+1]) { s[j+1]=string[N][0]; break; } } else if(zhongjie(s[m])) if(s[m]==string[N][n]) { s[j+1]=string[N][0]; break; } } } k=j+1; if(k==2&&a=='#') { out(1,k,s); printf(\ out(i+1,z,input); printf(\结束\\n\ printf(\输入串符合文法的定义!\\n\ return 1; } } else if(data[x][y]=='<'||data[x][y]=='=') { out(1,k,s); printf(\ out(i+1,z,input); printf(\移进\\n\ k++; s[k]=a; i++; } else { printf(\ return 0; } } 12 输入串符合文法的定义 //移进 // printf(\return 0; } void out(int j,int k,char *s) { int n=0; int i; for(i=j;i<=k;i++) { printf(\ n++; } for(;n<15;n++) { printf(\} } int xiabiao(char c) { int i; for(i=0;lable[i]!='\\0';i++) { if(c==lable[i]) return i; } return -1; } int zhongjie(char c) { int i; for(i=0;lable[i]!='\\0';i++) { if(c==lable[i]) return 1; } return 0; } 四.程序测试 //求字符c在算符优先关系表中的下标//判断字符c是否是终结符 13 当输入文法首字母不是终结符的情况时,程序提示不是算符文法 图4-1 判断不是算符文法测试 当输入文法分析串没有“#”结束时,分析失败 图4-2 分析失败测试 14