计——基于LR(0)方法的语法分析程序.doc_第1页
计——基于LR(0)方法的语法分析程序.doc_第2页
计——基于LR(0)方法的语法分析程序.doc_第3页
计——基于LR(0)方法的语法分析程序.doc_第4页
计——基于LR(0)方法的语法分析程序.doc_第5页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

燕山大学里仁学院计算机课程设计编译原理课程设计一、设计要求可根据自己实际情况,选择以下一项作为分析算法的输入:(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 10int p=0,q=0,zh,sh,x;char Vn3=E,A,B; /非终结符char Vt6=a,b,c,d,#; /终结符typedef struct char *bottom; char *top; int size;/char datastack_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) s.bottom=(char *)realloc(s.bottom,(stack_size+stackincrement)*sizeof(char); if(!s.bottom) exit(-1); s.top=s.bottom+s.size; s.size+=stackincrement; *s.top+=e; coute进s栈; / s.datax=e; / /x+;/输出所有元素/ for(i=0;ix;i+)cout=s.size) s.bottom=(char *)realloc(s.bottom,(stack_size+stackincrement)*sizeof(char); if(!s.bottom) exit(-1); s.top=s.bottom+s.size; s.size+=stackincrement; *s.top+=e; coute进t栈; return(1);int pop(stack &s,char *e) /出栈 if(s.top=s.bottom) return(0); *e=*-s.top; cout*e出s栈 ; return(1);int pop2(stack &s,int *e) /出栈 if(s.top=s.bottom) return(0); *e=*-s.top; cout*e出t栈 ; return(1);int action(int m,int n,char a) /ACTION表 int i; int act105=2,3,0,0,0,0,0,0,0,20, 0,0,5,0,0,0,0,7,8,0,11,11,11,11,11, 13,13,13,13,13,12,12,12,12,12,0,0,7,0,0, 15,15,15,15,15,14,14,14,14,14 ; for(i=0; in; i+) if(a=Vti) break; if(i=n&a!=Vtn-1)return(0); else zh=actmi; /if(zh=0)cout出错endl; /else return(zh); return(zh); int go(int m,int n,char a) /goto表int i;int go103=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; in; i+) if(a=Vni) break; if(i=n&a!=Vnn-1)return(0); else sh=gomi; /if(sh=0)cout出错; /else return(sh); return(sh); void main() char ch,y; int x,v,e,u,ok=1; int i=0,index=0,k; char st20; stack s; stack t; cout 输入要分析的字符串(end by ;):st0; while(sti!=;) i+; cinsti; Initstack(s); Initstack(t); push(s,#); push2(t,0); coutt; while(ok=1) ch=stindex; index+; coutendlch分析; if(ch=;) ok=0;break; y=ch; couty=yt; /y是终结符 pop2(t,&q); /这两句主要是为了得到当前的q值 push2(t,q); coutq=qt; /q是09的数字 u=action(q,6,y); coutu=u0&action(q,6,y)10&action(q,6,y)20) switch(zh) case 11: for(i=0;i5;i+)pop(s,&y);pop2(t,&x); push(s,S); pop2(t,&e); push2(t,e); go(e,3,S); /查询GOTO表 push2(t,sh); /替换后的数字 index-; break; case 12: pop(s,&y);pop2(t,&x); push(s,A); pop2(t,&e); push2(t,e); go(e,3,A); push2(t,sh); index-; break; case 13: pop(s,&y); pop(s,&y); pop2(t,&x); pop2(t,&x); push(s,A); 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分析成功endl;ok=0;else if(u=0)cout出错endl;break; 四、程序结构 先设计直接输入LR(0)分析表,即ACTION和GOTO表。最后主程序中输入要分析的字符串,利用直接输入的分析表对字符串进行分析。五、心得和体会通过这次课程设计,使我对编译原理这门课程有了更深一步的了解,尤其是基于LR(0)方法的语法分析这部分知识。知

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论