logo资料库

编译原理课程设计——基于LR(0)方法的语法分析程序.doc

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
编译原理课程设计
编译原理课程设计 一、设计要求 可根据自己实际情况,选择以下一项作为分析算法的输入: (1)直接输入根据己知文法构造的 LR(0)分析表。 (2)输入已知文法的项目集规范族和转换函数,由程序自动生成 LR(0) 分析表。 (3)输入已知文法,由程序自动生成 LR(0)分析表。 二、设计目的 设计、编制和调试一个具体的 LR(0)语法分析程序,加深对语法分析 的理解。 三、算法描述 直接输入根据已知文法构造的 LR(0)分析表。 文法如下: (0)S`->E (1)E->aA (2)E->bB (3)A->c (4)B->cB (5)B->d #include #include #include #define stack_size 20 #define stackincrement 10 int p=0,q=0,zh,sh,x; char Vn[3]={'E','A','B'}; char Vt[6]={'a','b','c','d','#'}; typedef struct { //非终结符 //终结符 char *bottom; char *top; int size; // char data[stack_size];
燕山大学里仁学院计算机课程设计 }stack; int Initstack(stack &s) { //初始化栈 s.bottom=(char *)malloc(stack_size*sizeof(char)); if(!s.bottom) exit(-1); s.top=s.bottom; s.size=stack_size; return(1); } int push(stack &s,char e) { //int i; if(s.top-s.bottom>=s.size){ //入栈 *)realloc(s.bottom,(stack_size+stackincrement)*sizeof(char)); s.bottom=(char if(!s.bottom) exit(-1); s.top=s.bottom+s.size; s.size+=stackincrement; } *s.top++=e; cout<=s.size){ //入栈 *)realloc(s.bottom,(stack_size+stackincrement)*sizeof(char)); s.bottom=(char if(!s.bottom) exit(-1); s.top=s.bottom+s.size; s.size+=stackincrement; 1
燕山大学里仁学院计算机课程设计 } *s.top++=e; cout<
燕山大学里仁学院计算机课程设计 } } int go(int m,int n,char a) { //goto 表 int i; int go[10][3]={{1,0,0},{0,0,0},{0,4,0},{0,0,6}, {0,0,0},{0,0,0},{0,0,0},{0,0,9},{0,0,0},{0,0,0} }; for(i=0; i>st[0]; while(st[i]!=';'){ i++; cin>>st[i]; } Initstack(s); Initstack(t); push(s, '#'); 3
燕山大学里仁学院计算机课程设计 push2(t,0); cout<<"\t"; while(ok==1){ ch=st[index]; index++; cout<0&&action(q,6,y)<10){ push(s,ch); push2(t,zh); // q=zh; } if(action(q,6,y)>10&&action(q,6,y)<20){ switch(zh) for(i=0;i<5;i++){pop(s,&y);pop2(t,&x);} { case 11: push(s,'S'); pop2(t,&e); push2(t,e); go(e,3,'S'); push2(t,sh); index--; break; //查询 GOTO 表 //替换后的数字 case 12: pop(s,&y);pop2(t,&x); push(s,'A'); pop2(t,&e); 4
燕山大学里仁学院计算机课程设计 push2(t,e); go(e,3,'A'); push2(t,sh); index--; break; case 13: pop(s,&y); pop(s,&y); pop2(t,&x); push(s,'A'); pop2(t,&x); pop2(t,&e); push2(t,e); go(e,3,'A'); push2(t,sh); index--; break; case 14: pop(s,&y);pop2(t,&x); push(s,'B'); pop2(t,&e); push2(t,e); go(e,3,'B'); push2(t,sh); index--; break; } } if(action(q,6,y)==20) {cout<<"分析成功"<
燕山大学里仁学院计算机课程设计 五、心得和体会 通过这次课程设计,使我对编译原理这门课程有了更深一步的了解,尤 其是基于 LR(0)方法的语法分析这部分知识。知道要提高自己的编程能力, 必须亲自去体验、去设计、编译、调试、运行。在失败和困难中学习知识, 知道自己哪里会了,哪里不会。但由于某些原因,没能做出功能更完整的程 序。 总之,通过这次课设使我学会了很多东西,之前有些不明白的地方都弄 明白了,还有很重要的一点就是让我看到了自己身上的不足,以后一定要认 真听老师讲的课! 6
分享到:
收藏