简单C语言编译器(编译原理)_第1页
简单C语言编译器(编译原理)_第2页
简单C语言编译器(编译原理)_第3页
简单C语言编译器(编译原理)_第4页
简单C语言编译器(编译原理)_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

精品文库#include#include#include#include#include#include#include#include#define NULL 0struct 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 name20;char kind;struct Sign *next; struct Word / 单词表结构体: 单词名字、标识类型、状态、序号、行号、连接符号表指针、连接下一结点指针char name20;char mark_name;int state;int num;int line;struct Sign *link;struct Word *next;FILE *fp1;/文件指针int row=1,line10000,Lin300,w_num;/字符行变量、字符行、单词所在行、字符数char buffer10000;/字符串缓冲区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=) flag=1;else if(0=ch&ch=9) flag=2;else if(a=ch&ch=z)|(A=ch&ch=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 characterreturn(flag);/=/ 词法分析函数: void scan()/ 数据传递: 形参fp接收指向文本文件头的文件指针;/ 全局变量buffer与line对应保存源文件字符及其行号,char_num保存字符总数。void scan()char ch;int flag,j=0,i=-1;while(!feof(fp1)ch=fgetc(fp1);flag=judge(ch);printf(%c,ch);/显示打开的文件 if(flag=1|flag=2|flag=3) i+;bufferi=ch;linei=row; else if(flag=4) i+;bufferi=?;linei=row; else if(flag=5) i+;bufferi=;row+;else if(flag=7) continue; else coutn请注意,第row 行的ch是非法字符!endl; w_num=i;/*确定单词所在的行*/int one,two,k=0;for(i=0;ikind=0;s_first-name0=0;news=head=ft=(struct Word *)malloc(sizeof(struct Word);ft-link=s_first;ft-next=NULL;/=分割单词功能=int i=0,k,flag,jud=0;for(k=0;knamei=bufferk; news-name+i=0; else /2 i=0; ft=news; if(news-name0=33&news-name0next=news; news-next=NULL; if(flag=1)/3 if(bufferk=/&bufferk+1=/) jud=1; else if(bufferk=/&bufferk+1=*) jud=2; else/4 news-namei=bufferk; if(bufferk=&bufferk+1=)|(bufferk=&bufferk+1=&)| (bufferk=|&bufferk+1=|)|(bufferk=&bufferk+1=)| (bufferk=namei=bufferk; news-name1+i=0; ft=news; news=(struct Word *)malloc(sizeof(struct Word); ft-next=news; news-next=NULL; /4 /3/2/1else if(jud=1)if(bufferk=) jud=0; else ;else if(jud=2)if(bufferk=*&bufferk+1=/) jud=0; k=k+1; else ; if(news-name0name0125) ft-next=NULL; /*单词转换成标识符*/ft=head;while(ft)if(strcmp(ft-name,main)=0)ft-mark_name=m;else if(strcmp(ft-name,void)=0)ft-mark_name=v;else if(strcmp(ft-name,while)=0)ft-mark_name=w;else if(strcmp(ft-name,if)=0)ft-mark_name=f;else if(strcmp(ft-name,else)=0)ft-mark_name=e;else if(strcmp(ft-name,int)=0)ft-mark_name=a;else if(strcmp(ft-name,float)=0)ft-mark_name=b;else if(strcmp(ft-name,double)=0)ft-mark_name=d;else if(strcmp(ft-name,char)=0)ft-mark_name=c;else if(ft-name0=0&ft-name0mark_name=n;else if(ft-name0=+|ft-name0=-|ft-name0=*|ft-name0=/ |ft-name0=|ft-name0=name0= |ft-name0=,|ft-name0=;|ft-name0=(|ft-name0=) |ft-name0=|ft-name0=)ft-mark_name=ft-name0;else if(strcmp(ft-name,&)=0)ft-mark_name=&;else if(strcmp(ft-name,|)=0)ft-mark_name=|;else if(strcmp(ft-name,!=)=0)ft-mark_name=;else if(strcmp(ft-name,=)=0)ft-mark_name=#;else ft-mark_name=i;ft=ft-next;/*初始化单词表的序号和行号*/i=0;ft=head;while(ft)ft-num=i;ft-line=Lini;i+;ft=ft-next;/*初始化符号表*/ft=head;char word_type;while(ft)/1if(ft-mark_name=a|ft-mark_name=b|ft-mark_name=c|ft-mark_name=d)/2p=ft-next;word_type=ft-mark_name;while(p-mark_name!=;)if(p-mark_name!=,)s_look=(struct Sign *)malloc(sizeof(struct Sign);s_look-kind=word_type;strcpy(s_look-name,p-name);s_first-next=s_look;s_first=s_look;s_look-next=NULL;p=p-next;ft=p;/2ft=ft-next;/1return(head);/=/正确性检测函数: FindWordDeclare(Word *head) / 数据传递: *head:单词表的头指针. / 备注: 查找保留字是否被声名和符号是否对称. void FindWordDeclare(Word *head)struct Sign *s_first;struct Word *find,*w_name1000,*word_fu100;struct Stack *ip,*q;int i,cal=0,ca=0,end;find=head;coutendl=显 示 检 查 结 果=mark_name=i)w_namecal=find;cal+;if(find-next!=NULL) if(find-mark_name=find-next-mark_name)&(find-mark_name!=)& (find-mark_name!=)&(find-mark_name!=()&(find-mark_name!=) cout第 line 行, mark_name 存在字符重复错误 !mark_name=i&find-next-mark_name=)|(find-mark_name=,&find-next-mark_name=)| (find-mark_name=,&find-next-mark_name=;)|(find-mark_name=;&find-next-mark_name=,)| (find-mark_name=(&find-next-mark_name=,)|(find-mark_name=,&find-next-mark_name=()| (find-mark_name=)&find-next-mark_name=;)|(find-mark_name=)&find-next-mark_name=,)| (find-mark_name=)&find-next-mark_name=) cout第 line 行,name 处存在符号连接错误 !mark_name=a|find-mark_name=b|find-mark_name=c|find-mark_name=d)& (find-next-mark_name=|find-next-mark_name=|find-next-mark_name=,| find-next-mark_name=;|find-next-mark_name=(|find-next-mark_name=)|find-next-mark_name=+|find-next-mark_name=-|find-next-mark_name=*|find-next-mark_name=/|find-next-mark_name=&|find-next-mark_name=|find-next-mark_name=next-mark_name=|find-next-mark_name=!|find-next-mark_name=|find-next-mark_name=n) cout第 line 行, mark_name 存在自变量声明搭配错误 !mark_name=(|find-mark_name=)|find-mark_name=|find-mark_name=) word_fuca=find; ca+;if(find-name0=0&find-name0name1=a&find-name1=z) cout第 line 行, name 存在变量声明错误 !next;int j=0;for(i=0;ilink; end=1; while(s_first&end) if(strcmp(s_first-name,w_namei-name)=0) end=0; else s_first=s_first-next; if(end=1&i!=cal-1) cout错误 ! 第 line 行,变量 name 没有被声明 !name=$;for(i=0;imark_name=()|(word_fui-mark_name=) ip=MarkPush(ip,word_fui-mark_name,i); else if(ip-name=(&word_fui-mark_name=)|(ip-name=&word_fui-mark_name=) MarkPop(ip); else cout错误 ! 第 line 行,“ name ” 存在符号匹配错误 ! name!=$) cout错误 ! 第 line 行,“ name ” 存在符号匹配错误 !endl; coutn=nendl;/=/初始化分析表函数: Relation *FirstRelation()/ 数据传递: r_head返回分析表的头指针 Relation *FirstRelation()Relation *r_head,*r_find,*r_new;r_head=NULL;/状态int sr13=2,1,100,3,4,5,6,12,15,16,17,18,10,11,7,9,13,14,8,19,12,4,15,16,17,18,10,11,20,9,13,14,8,21,22,23,24,6,26,25,8,9,10,11,1,3,12,15,16,17,18,10,11,28,14,27,33,34,32,29,30,31,33,34,32,35,30,31,42,41,43,36,37,38,39,40,44,7,13,13,2,2,2,2,2,2,2,2,5,47,46,18,48,18,20,20,20,33,34,32,49,30,31,27,27,51,52,54,53,27,50,47,59,60,83,29,61,29,29,31,31,62,31,31,33,33,63,33,33,33,35,35,35,35,35,35,42,41,43,64,37,38,39,40,37,37,37,37,37,37,38,38,38,38,38,38,45,12,12,65,33,34,32,66,31,33,34,32,67,47,82,26,26,26,55,56,57,58,22,22,22,23,23,23,24,24,24,25,25,25,68,42,41,43,69,38,39,40,42,41,43,70,39,40,42,41,43,71,40,42,41,43,72,60,73,12,15,16,17,18,10,11,74,9,13,14,8,17,48,17,19,19,19,12,15,16,17,18,10,11,75,9,13,14,8,28,61,28,28,30,30,62,30,30,32,32,63,32,32,32,34,34,34,34,34,34,36,36,36,36,36,36,77,76,15,15,15,15,15,15,15,15,78,79,12,15,16,17,18,10,11,80,9,13,14,8,81,14,14,14,14,14,14,14,14,21,21,21,16,16,16,16,16,16,16,16;/以上状态对应的操作类别char SS14=ss,o,s,s,s,s,ssssssssssss,s,srsssssssssss,s,s,s,s,r,ss,r,r,r,r,r,r,ssssssssss,ssssss,ssssss,ssssssss,sr,rr,rrrrrrrr,r,ss,rsr,rrr,ssssss,rrssssr,s,ss,ss,rsrr,rrsrr,rrsrrr,rrrrrr,ssssssss,rrrrrr,rrrrrr,s,rr,s,sssss,ssss,ss,rrr,s,s,s,s,rrr,rrr,rrr,rrr,s,sssssss,ssssss,sssss,ssss,ss,ssssssssssss,rsr,rrr,ssssssssssss,rsrr,rrsrr,rrsrrr,rrrrrr,rrrrrr,s,s,rrrrrrrr,s,s,ssssssssssss,s,rrrrrrrr,rrr,rrrrrrrr; /状态的个数int cal84=2,1,1,1,1,1,12,1,13,1,1,1,1,1,2,1,1,1,1,1,1,10,6,6,8,2,2,8,1,2,3,3,6,7,1,2,2,4,5,6, 6,8,6,6,1,2,1,5,4,2,3,1,1,1,1,3,3,3,3,1,7,6,5,4,2,12,3,3,12,4,5,6,6,6,1,1,8,1,1,12,1,8,3,8;/以上状态在action和goto中对应的列char Let14=v,Q,$,m,(,),i,a,b,c,d,f,w,A, C,X,Y,S,i,a,b,c,d,f,w,A,C,X,Y,S,;,(,(,=,;,i,Z,i,i,i,i,$,i,a,b,c,d,f,w,X,Y,S,i,!,(,E,H,G,i,!,(,E,H,G,i,(,n,L,I,K,T,F,;,;,i,a,b,c,d,f,w,;,&,),&,|,),&,|,),i,!,(,E,H,G,&,|,#,),i,&,),+,;,+,-,;,),+,-,/,;,),+,-,*,/,;,),+,-,*,/,;,),i,(,n,L,I,K,T,F,+,-,*,/,;,),+,-,*,/,;,),i,;,i,!,(,H,G,i,!,(,G,&,),&,|,),i,i,i,i,&,|,),&,|,),&,|,),&,|,),i,(,n,I,K,T,F,i,(,n,K,T,F,i,(,n,T,F,i,(,n,F,+,),i,a,b,c,d,f,w,A,C,X,Y,S,&,|,),&,|,),i,a,b,c,d,f,w,A,C,X,Y,S,+,-,;,),+,-,/,;,),+,-,*,/,;,),+,-,*,/,;,),+,-,*,/,;,),i,a,b,c,d,f,w,e,i,a,b,c,d,f,w,A,C,X,Y,S,i,a,b,c,d,f,w,&,|,),i,a,b,c,d,f,w,; /初始化关系表 for(int i=0;i84;i+) for(int j=0;jline_States=i;r_new-rank_Letter=Letij;r_new-relationship=srij;r_new-name=SSij;r_find-next=r_new;r_find=r_new;r_new-next=NULL;return r_head;/=/初始化规则表函数: Guiyue *guiyue()/ 数据传递: g_head返回规则表的头指针 Guiyue *FirstGuiyue() Guiyue *g_head,*g_find,*g_new;g_head=NULL;/规约char root=B,Q,S,A,A,C,C,X,Y,Y,Y,Y,Z,Z,S,S,S,E,E,H, H,G,G,G,G,G,G,G,L,L,I,I,K,K,T,T,F,F,F; int LR=1,7,3,2,1,3,1,2,1,1,1,1,3,1,11,7,4,3,1,3,1,3,3,3,3,3,2,1,3,1,3,1,3,1,3,1,3,1,1;/初始化规则表for(int i=0;inum=i;g_new-count=LRi;g_new-name=rooti;g_find-next=g_new;g_find=g_new;g_new-next=NULL;return g_head;/=/语法分析函数: int ResultAnely(Relation *r_head,Stack *s_head,char str,Guiyue *g_head,int cal) / 数据传递: 1 *r_head:分析表头指针. / 2 *s_head:符号栈头指针. / 3 str :转义字符流. / 4 *g_head:规则表头指针. / 5 cal :转义字符流的长度. int ResultAnely(Relation *r_head,Stack *s_head,char str,Guiyue *g_head,int cal)Relation *r_find;Guiyue *g_find;Stack *s_find,*s_look;s_find=s_head;int j,v,admition=1,goon=1,in,out=1,hang=-1,count;char stack200,name;/coutn=显-示-语-法-分-析-过-程-及-结-果=endl;/cout LineNum StackData inputSentencenline_States=s_find-num&r_find-rank_Letter=str0&r_find-name=s)/:入栈s_find=MarkPush(s_find,str0,r_find-relationship);admit=0;for(in=0;innext;/:入栈if(r_find-line_States=s_find-num&r_find-rank_Letter=str0&r_find-name=r)/:规约g_find=g_head;int g=r_find-relationship;while(g) g_find=g_fi

温馨提示

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

评论

0/150

提交评论