简单C语言编译器(编译原理).doc
文本预览下载声明
WORD格式可编辑
专业技术分享
#includestdio.h
#includeiostream.h
#includestdlib.h
#includefstream.h
#includestring.h
#includemath.h
#includeiomanip.h
#includemalloc.h
#define NULL 0
struct Stack // 栈结构体: 序号、内容、连接下一结点指针
{
int num;
char name;
struct Stack *next;
};
struct Guiyue// 规则集结构体:序号、规则长度、符号、连接下一结点指针
{
int num;
int count;
char name;
struct Guiyue *next;
};
struct Relation // 分析表结构体:状态序号、对应符号列、操作类型的对应序号、操作类型、连接下一结点指针
{
int line_States ;
char rank_Letter;
int relationship;
char name;
struct Relation *next;
};
struct Sign // 符号表结构体: 自变量名、标识类型、连接下一结点指针
{
char name[20];
char kind;
struct Sign *next;
};
struct Word // 单词表结构体: 单词名字、标识类型、状态、序号、行号、连接符号表指针、连接下一结点指针
{
char name[20];
char mark_name;
int state;
int num;
int line;
struct Sign *link;
struct Word *next;
};
FILE *fp1;//文件指针
int row=1,line[10000],Lin[300],w_num;//字符行变量、字符行、单词所在行、字符数
char buffer[10000];//字符串缓冲区
Stack *MarkPush(Stack *ip,char mark,int I_i)//压栈
{
Stack *s;
s=(Stack *)malloc(sizeof(Stack));
s-name=mark;
s-num=I_i;
s-next=ip;
ip=s;
return ip;
}
void MarkPop(Stack *ip)//出栈
{
Stack *q;
char name;
name=ip-name;
q=ip-next;
if(ip-next!=NULL)
{
ip-name=ip-next-name;
ip-num=ip-next-num;
ip-next=ip-next-next;
free(q);
}
}
int judge(char ch)// 接收ch判断字符,变量flag返回字符类别
{
int flag;
if(ch==!||ch==$||ch==||ch==*||ch==(||ch==)||ch==-||ch==_||
ch==+||ch===||ch==|||ch=={||ch==}||ch==[||ch==]||ch==;||
ch==:||ch==||ch==||ch==,||ch==||ch==.||ch==/||ch==\)
flag=1;
else if(0=chch=9)
flag=2;
else if((a=chch=z)||(A=chch=Z))
flag=3;
else if(ch== )
flag=4;
else if(ch==\n)
flag=5;
else if(ch==?)
flag=6;
else if(feof(fp1))
flag=7;//结束
else
flag=0; //illegal character
return(flag);
}
//===============================================================
显示全部