编译原理课程设计
一、设计要求
可根据自己实际情况,选择以下一项作为分析算法的输入:
(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