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

下载本文档

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

文档简介

1、精品文库#in clude #in clude#in clude #in clude #in clude#in clude #in clude#in clude#defi ne NULL 0struct Stack II栈结构体:序号、内容、连接下一结点指针int num;char n ame;struct Stack *n ext;struct GuiyueII规则集结构体:序号、规则长度、符号、连接下一结点指针int num;int count;char n ame;struct Guiyue *n ext;;struct Relation /分析表结构体:状态序号、对应符号列、操作类型的

2、对应序号、操作类型、 连接下一结点指针int lin e_States ; char ran k_Letter;int relati onship;char n ame;struct Relatio n *n ext; ;struct Sign II符号表结构体:自变量名、标识类型、连接下一结点指针 char n ame20;char kind;struct Sig n *n ext;struct Word II单词表结构体:单词名字、标识类型、状态、序号、行号、连接符号表指针、 连接下一结点指针char n ame20; char mark_n ame; int state;int num;

3、int line;struct Sig n *li nk; struct Word *n ext;FILE *fp1;/文件指针int row=1,li ne10000,Li n300,w_num;/ 字符行变量、字符行、单词所在行、字符数 char buffer10000;/ 字符串缓冲区Stack *Mark Push(Stack *ip, char mark,i nt I_i)/ 压栈Stack *s;s=(Stack *)malloc(sizeof(Stack); s-n ame=mark;s- num=l_i;s-n ext=i p;ip=s;return ip;void Mark

4、Pop (Stack *ip)/ 出栈 Stack *q; char n ame;n ame=ip-n ame; q=ip-n ext;if(i p- next!=NULL) ip-n ame=ip-n ext- n ame; ip-num=ip-n ext- num; ip-n ext= ip-n ext- n ext; free(q);int judge(char ch)/接收ch判断字符,变量flag返回字符类别int flag;if(ch=!|ch=$|ch=&|ch=*|ch=(|ch=)|ch=-|ch=_| ch=+|ch=|ch=T|ch=|ch=|ch=T|ch=T|ch=;

5、| ch=:|ch=”|ch=|ch=.|ch=7|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;II 结束/illegal characterelse flag=0;return(flag);=II词法分析函数:void scan()/ 数据传递:形参fp接收指向文本文件头的文件指针;II全局变量buffer与line对

6、应保存源文件字符及其行号,char_num保存字符总数。void sca n()char ch;int flag,j=0,i=-1;while(!feof(fp1)ch=fgetc(fp1);flag=judge(ch);i+;bufferi=ch;li nei=row; i+;bufferi=?;li nei=row; i+;bufferi=;row+;printf(%c,ch);II显示打开的文件if(flag=1|flag=2|flag=3)else if(flag=4)else if(flag=5)else if(flag=7)con ti nue;else coutn 请注意,第ro

7、w 行的ch是非法字符!e ndl;w_num=i;确定单词所在的行 */*int on e,two,k=0; for(i=0;iki nd=0;s_first- name0=0;n ews=head=ft=(struct Word *)malloc(sizeof(struct Word); ft-li nk=s_first;ft- next=NULL;分 割 单 词 功/int i=0,k,flag,jud=0;for(k=0;kn amei=bufferk; n ews-n ame+i=0;else /2i=0;ft=n ews;if(n ews- name0=33&n ews-n ame

8、0n ext=n ews;n ews-n ext=NULL;if(flag=1)/3 if(bufferk=7&bufferk+1=7) jud=1; else if(bufferk=/&bufferk+1=*) jud=2; else/4n ews-n amei=bufferk;if(bufferk=&bufferk+1=)|(bufferk=&bufferk+1=&)|(bufferk=T&bufferk+1=|)|(bufferk=&bufferk+1=)|(bufferk=n amei=bufferk;n ews-n ame1+i=0;ft=n ews;n ews=(struct Wo

9、rd *)malloc(sizeof(struct Word); ft-n ext=n ews;n ews-n ext=NULL;/4/3/2/1else if(jud=1)if(bufferk=) jud=0;else ;else if(jud=2)jud=O; k=k+1;if(bufferk=*&bufferk+1=/) else ;if(n ews- name0125) ft-n ext=NULL;单词转换成标识符*/*ft=head;while(ft)if(strc mp (ft- name,mai n)=0)ft-mark_ name-m; else if(strc mp (ft-

10、 name,void)=0)ft-mark_ name=v; else if(strc mp (ft- name,while)=0)ft-mark_ name=w; else if(strc mp (ft- name,if)=0)ft-mark_ name=f; else if(strcm p(ft-n ame,else)=0)ft-mark_ name=e; else if(strcm p(ft-n ame,i nt)=0)ft-mark_ name=a; else if(strcm p(ft-n ame,float)=0)ft-mark_ name=b; else if(strc mp (

11、ft- n ame,double)=0)ft-mark_ name-d; else if(strc mp (ft- n ame,char)=0)ft-mark_ name-c; else if(ft-n ame0=0&ft-n ame0mark_ name- n; else if(ft- nameO=+|ft- nameO=-|ft- nameO=鋼|ft- name0=7|ft- nameO=|ft- nameO=n ameO=|ft- nameO=,|ft- nameO=;|ft- nameO=(|ft- nameO=)|ft- nameO=|ft- nameO=-)ft-mark_nam

12、e=ft- nameO; else if(strc mp (ft- n ame,&)=O)ft-mark_ name- &; else if(strcm p(ft-n ame,|)=O)ft-mark_ name=T; else if(strc mp (ft- n ame,!=)=O)ft-mark_ name-; else if(strcm p(ft-n ame,=)=O)ft-mark_ name-#; else ft-mark_ name-i; ft-ft- n ext;初始化单词表的序号和行号*/*i-O; ft-head;while(ft)ft-num-i; ft-li ne-L i

13、n i;i+; ft-ft- n ext;始化符号*/*ft-head;char word_t ype;while(ft)/1if(ft-mark_ name=a|ft-mark_ name=b|ft-mark_ name=c|ft-mark_ name=d)/2 p=ft-n ext;word_t yp e=ft-mark_ name;while( p-mark_ name!=;)if(p-mark_ name!-,)s_look=(struct Sign *)malloc(sizeof(struct Sign);s_look-k in d=word_t ype;strc py( s_loo

14、k- n ame ,p-n ame);s_first-n ext=s_look;s_first=s_look;s_look- next=NULL;p=p-n ext;ft=p;/2ft=ft- n ext;/1 return(head);/*head:单词表的头指针.查找保留字是否被声名和符号是否对称正确性检测函数:FindWordDeclare(Word *head)/ 数据传递/备注void Fin dWordDeclare(Word *head)struct Sig n *s_first;struct Word *fin d,*w_ name1000,*word_fu100;struct

15、 Stack *ip ,*q;int i,cal=0,ca=0,e nd;fin d=head;coute ndl=mark_ name=-i)w_n amecal=fi nd;cal+;iffin d- next!=NULL)if(fi nd-mark_ name=fi nd-n ext-mark_ name )&(fin d-mark_ name!=) &(fin d-mark_ name!= )&(fin d-mark_ name!=()&(fin d-mark_ name!=)cout第line行, mark_name存 在字符重复错误!mark_ name=T&find-n ext-

16、mark_ name=)|(fi nd-mark_ name=,&find-n ext -mark_ name=)| (fin d-mark_ name=,&find-n ext-mark_ name=;)|(fi nd-mark_ name=;&find-n ext- mark_ name=,)| (fin d-mark_ name=(&find-n ext-mark_ name=,)|(fi nd-mark_ name=,&find-n ext- mark_ name=()| (fin d-mark_ name=)&find-n ext-mark_ name=;)|(fi nd-mark_

17、 name=)&find-n ext- mark_ name=-,)|(fin d-mark_ name=)&find-n ext-mark_ name=)处存在符cout第line行,name号连接错误 !mark_ name=a|fi nd-mark_ name=b|fi nd-mark_ name=c|fi nd-mark_ name=d )& (find-n ext-mark_ name=|fi nd-n ext-mark_ name=|fi nd-n ext-mark_ name=,| find-n ext-mark_ name=;|fi nd-n ext-mark_ name=(|

18、fi nd-n ext-mark_ name=)|find-n ext-mark_ name=+|fi nd-n ext-mark_ name=-|fi nd-n ext-mark_ name=*| find-n ext-mark_ name=7|fi nd-n ext-mark_ name=&|fi nd-n ext-mark_ name=|li ne !e ndl;coutn ext-mark_ name=n ext-mark_ name=|fi nd-n ext-mark_ name=!| find-n ext-mark_ name=|fi nd-n ext-mark_ name= n)

19、 行 mark_namemark_ name=(|fi nd-mark_ name=)|fi nd-mark_ name=|fi nd-mark_ name=)word_fuca=fi nd;ca+;if(fin d- name0=0&fin d- name0 name1=a&fin d- name1=z)cout第 line行,name 存在变量 声明错误!n ext;int j=0;for(i=0;ili nk;end=1;while(s_first&en d)if(strcm p( s_first- n ame,w_ namei-n ame)=0) en d=0;elses_first=

20、s_first- n ext;if(end=1 &i!=cal-1)cout错误!第line行,变量 name没有被声明!n ame=$;for(i=0;imark_ name=-()|(word_fui-mark_ name=) ip=Mark Pu sh(i p,word_fui-mark_ name,i);else第li ne! e ndl;li ne !n ame=(&word_fui-mark_ name=)川(i p- name=&word_fui-mark_ name= =) Mark Pop(ip);else cout错误 !“ namen ame!=$) cout错误 !第“

21、 name ” 存在符号匹配错误coutne ndl;:/ 初始化分析表函数:Relation *FirstRelatio n()/数据传递:r_head返回分析表的头指针Relation *FirstRelatio n()Relati on *r_head,*r_fi nd,*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

22、,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,

23、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,3

24、0,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,s

25、sssss,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 ,rr

26、rrrrrr,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,丫,S,i,a,b,c,d,f,w,A,C,X

27、,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,T,K,T,F,;,;,i,a,b,c,d,f,w,;,&,), &,T,), &,T,),i,!,(,E,H,G, &,T,#, ),i,& ,),+,;,+,-,;,),+,-,7,;,),+,-, *,/,;,),+,-,*,/,;,),i,(, n,L,T,K,T,F, +,-,*,/,;,),+,-,*,/,;,),i,;,i, !,(,H,G,i,!,(,G,&,),8 ,T,),i,i,i, i, &,T,),

28、&,T,), &,T,), &,T,),i,(, n ,T,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, &,T, ),&,T,),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,& ,T,),i,a,b,c,d,f,w,;/初始化关系表for(i nt i=0;i84;i+)for(i nt j=0;jli ne_States=i;r_n ew-ra nk

29、_Letter=Letij; r_n ew-relati onship=srij; r_n ew- name=SSij; r_find-n ext=r_ new;r_fin d=r_ new; r_n ew-n ext=NULL;return r_head;:/初始化规则表函数:Guiyue *guiyue()/数据传递:g_head返回规则表的头指针Guiyue *FirstGuiyue()Guiyue *g_head,*g_fi nd,*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

30、,G,G,G,G,G,G,L,L,T,T,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(i nt i=0;inum=i;g_n ew-co un t=LRi;g_n ew-n ame=rooti;g_find-n ext=g_ new;g_fin d=g_ new;g_n ew-n ext=NULL;returng_head;:/语法分析函数:int ResultAnely(Relation *r_head,Stack

31、*s_head,char str,Guiyue *g_head,int cal)/数据传递:1 *r_head:分析表头指针./2*s_head:符号栈头指针./3str:转义字符流./4*g_head :规则表头指针./5cal :转义字符流的长度.int ResultA nely(Relati on *r_head,Stack *s_head,char str,Guiyue *g_head,i nt cal)Relati on *r_find;Guiyue *g_fi nd;Stack *s_fi nd,*s_look;s_fin d=s_head;int j,v,admiti on=1,

32、go on=1,i n,o ut=1,ha ng=-1,co unt;char stack200, name;显-示-语-法-分-析-过-程-及-结-果e ndl;Lin eNumStackData/ coutninpu tSe ntencenen dl;/ coutli ne_States=s_fi nd- num&r_fin d-ra nk_Letter=str0&r_fin d- name=s)/:入栈s_fin d=Mark Push(s_fi nd,str0,r_fi nd-relati onship); admit=0;for(i n=0;i nn ext;/:入栈if(r_fin

33、 d-li ne/:规约丄States=s_fin d- num&r_fin d-ra nk_Letter=strO&r_fin d- name=Y)g_fin d=g_head;int g=r_fi nd-relati onship;while(g) g_fi nd=g_fi nd-n ext;g-; n ame=g_fi nd-n ame;coun t=g_fi nd-co unt;admit=0;for(i nt k=0;kli ne_States=s_fi nd- num & r_fin d-ra nk_Letter=n ame) s_fin d=Mark Pu sh(s_fi nd,

34、n ame,r_fi nd-relati on shi p);a=0;r_fin d=r_fi nd-n ext;/:规约if(r_fin d-li ne_States=s_fi nd- num&r_fin d-ra nk_Letter=str0&r_fin d- name=o)/:2判断运算结束admit=O;goon=0;out=0;coutnSuccessi on !n ext;/:2/*if(out=1)/显示语法分析结果s_look=s_fi nd; v=0; while(s_look)stackv=s_look-n ame; s_look=s_look- n ext; v+;H.c

35、outsetw(17)ha ng=0;j-)coutstack|j; if(stackj=i)v+;for(j=0;j10-v;j+)cout ; coutstr;coute ndl;*/if(admit=1)/判断输入流是否正确,如在分析表中找不到关系,则输入流错误goon=0;coutninput Flow Error !e ndl;return(0);*nen di;/1: coutn ame=$;stack_a- next=NULL;stack_b=(struct Stack *)malloc(sizeof(struct Stack);stack_b-n ame=#;stack_b-

36、next=NULL;f_head=NULL;int admit,cal,four;four=1;/四元式序号cal=0;admit=1;while(admit)if(strcal=)stack_a=Mark Push(stack_a,strcal,cal);cal+;elseif(stack_b-n ame=#|stack_b-n ame=+|stack_b-n ame=-|stack_b-n ame=*|stack_b-n ame=/)if(strcal=a )&(strcal=0 )&(strcal name=#)&(strcal=+|strcal=-|strcal=*|strcal=7)

37、stack_b=Mark Push(stack_b,strcal,cal); cal+;else if(stack_b- name=#)&(strcal=)Mark Pop (stack_b);cal+;else if(stack_b- name=#)&(strcal=-;)admit=0;elseif(stack_b-n ame=+|stack_b-n ame=-|stack_b-n ame=*|stack_b-n ame=/) if(stack_b- name=+|stack_b- name=- )&(strcal=*|strcal=7) stack_b=Mark Push(stack_b

38、,strcal,cal);cal+;elseif(f_head=NULL)f_n ew=(struct FourStyle *)malloc(sizeof(struct FourStyle);f_fin d=f_ new;f_head=f_fi nd;elsef_n ew=(struct FourStyle *)malloc(sizeof(struct FourStyle); f_find-n ext=f_ new;f_fin d=f_ new;f_n ew- next=NULL;f_n ew- num=order_ num;f_n ew-Word=stack_b-n ame;Mark Pop

39、 (stack_b);f_n ew- Op r2=stack_a-n ame;Mark Pop (stack_a);f_n ew- Op r1=stack_a-n ame;Mark Pop (stack_a);temp=four+65;f_n ew-Result=te mp;stack_a=Mark Pu sh(stack_a,f_ new-Result,cal); four+;if(cal!=3&admit=0&strcal=;)f_n ew=(struct FourStyle *)malloc(sizeof(struct FourStyle);f_n ew-num=order_ num;f_n ew- Op r1=stack_a-n ame;Mark Pop (stack_a);f_n ew-Word=stack_a-n ame;Mark Pop (stack_a);f_n ew- Op r2=_;f_n ew-Result=stack_a-n ame;Mark Pop (stack_a);f_find-n ext=f_ new;f_fin d=f_ new;f_n ew- next=NULL;four+;else if(cal=3&admit=0&strcal=;)f_n ew=(struct FourStyle

温馨提示

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

评论

0/150

提交评论