CSUFT 编译原理实验二LL(1)文法分析
2016-06-22 11:46
567 查看
#include <cstdio> #include <cstring> #include <iostream> #include <stack> #include <queue> #include <map> #include <algorithm> #include <vector> using namespace std; char A[20];/*分析栈*/ char B[20];/*剩余串*/ char v1[20]= {'i','+','*','(',')','#'}; /*终结符 */ char v2[20]= {'E','G','T','S','F'}; /*非终结符 */ int j=0,b=0,top=0,l;/*L为输入串长度 */ char x,ch; int k=1; int m,n; int flag=0,finish=0; typedef struct type/*产生式类型定义 */ { char origin;/*大写字符 */ char array[5];/*产生式右边字符 */ int length;/*字符个数 */ } type; type e,t,g,g1,s,s1,f,f1,cha;/*结构体变量 */ type C[10][10];/*预测分析表 */ void init() { e.origin='E'; strcpy(e.array,"TG"); t.origin='T'; strcpy(t.array,"FS"); g.origin='G'; strcpy(g.array,"+TG"); g1.origin='G'; g1.array[0]='^'; s.origin='S'; strcpy(s.array,"*FS"); s1.origin='S'; s1.array[0]='^'; f.origin='F'; strcpy(f.array,"(E)"); f1.origin='F'; f1.array[0]='i'; for(int m=0; m<=4; m++) /*初始化分析表*/ for(int n=0; n<=5; n++) C[m] .origin='N';/*全部赋为空*/ /*填充分析表*/ C[0][0]=e; C[0][3]=e; C[1][1]=g; C[1][4]=g1; C[1][5]=g1; C[2][0]=t; C[2][3]=t; C[3][1]=s1; C[3][2]=s; C[3][4]=C[3][5]=s1; C[4][0]=f1; C[4][3]=f; } void print()/*输出分析栈 */ { int a;/*指针*/ for(a=0; a<=top+1; a++) printf("%c",A[a]); printf("\t\t"); } void print1()/*输出剩余串*/ { int j; for(j=0; j<b; j++) /*输出对齐符*/ printf(" "); for(j=b; j<=l; j++) printf("%c",B[j]); printf("\t\t\t"); } int main() { init(); //测试样例反例 //i+i(i+i)# //i()# //正确样例 //i+i*i# do/*读入分析串*/ { scanf("%c",&ch); if ((ch!='i') &&(ch!='+') &&(ch!='*')&&(ch!='(')&&(ch!=')')&&(ch!='#')) { printf("输入串中有非法字符\n"); exit(1); } B[j]=ch; j++; }while(ch!='#'); l=j;/*分析串长度*/ ch=B[0];/*当前分析字符*/ A[top]='#'; A[++top]='E';/*'#','E'进栈*/ printf("步骤\t\t分析栈 \t\t剩余字符 \t\t所用产生式 \n"); do{ flag = 0; if(finish) break; x=A[top--];/*x为当前栈顶字符*/ printf("%d",k++); printf("\t\t"); for( j=0; j<=5; j++) /*判断是否为终结符*/ { if(x==v1[j]) { flag=1; break; } } if(flag==1)/*如果是终结符*/ { if(x=='#') { finish=1;/*结束标记*/ printf("acc!\n");/*接受 */ getchar(); getchar(); exit(1); } if(x==ch) { print(); print1(); printf("%c匹配\n",ch); ch=B[++b];/*下一个输入字符*/ flag=0;/*恢复标记*/ } /*else //出错处理 { print(); print1(); printf("%c出错\n",ch);//输出出错终结符 exit(1); }*/ } else/*非终结符处理*/ { for(j=0; j<=4; j++) if(x==v2[j]) { m=j;/*行号*/ break; } for(j=0; j<=5; j++) if(ch==v1[j]) { n=j;/*列号*/ break; } cha=C[m] ; if(cha.origin!='N')/*判断是否为空*/ { print(); print1(); printf("%c->",cha.origin);/*输出产生式*/ int len = strlen(cha.array); //长度是array的长度 for(j=0; j<len; j++) printf("%c",cha.array[j]); printf("\n"); for(j=(len-1); j>=0; j--) /*产生式逆序入栈*/ A[++top]=cha.array[j]; if(A[top]=='^')/*为空则不进栈*/ top--; } else //出错处理 调整顺序 { print(); print1(); printf("%c出错\n",ch);//输出出错终结符 exit(1); } } }while(top!=-1); //当分析栈不为空 return 0; }
View Code
送人玫瑰手留余香。。。。
相关文章推荐
- C#复习⑥
- JavaScript高级应用(二)(转)
- spring security demo站点
- 如何将PDF文件转换成word文档格式
- Javascript:前端利器 之 JSDuck
- Spring框架中ModelAndView、Model、ModelMap的区别
- 监控之_nrpe
- 分布式系统介绍
- Android 图片的缓存机制分析
- hiveQL详解
- 日期(BO带格式)
- iOS 设置行间距
- 磁盘分区知识总结
- 深度学习中的数学与技巧(0):优化方法总结比较(sgd/momentum/Nesterov/adagrad/adadelta)
- Product of Array Except Self
- Java常见异常
- Swfit 学习tableview
- 那些容易被忽略的Python编程方式
- wdcp安装
- 解决ListView的OnItemClickListener无效问题