文档详情

简单C语言编译器(编译原理).doc

发布:2019-01-05约3.03万字共25页下载文档
文本预览下载声明
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); } //===============================================================
显示全部
相似文档