簡單C語言編譯器(編譯原理)_第1頁
簡單C語言編譯器(編譯原理)_第2頁
簡單C語言編譯器(編譯原理)_第3頁
簡單C語言編譯器(編譯原理)_第4頁
簡單C語言編譯器(編譯原理)_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、#include<stdio.h>#include<iostream.h>#include<stdlib.h>#include<fstream.h>#include<string.h>#include<math.h>#include<iomanip.h>#include<malloc.h>#define NULL 0struct Stack / 棧結構體: 序號、內(nèi)容、連接下一結點指針int num;char name;struct Stack *next;struct Guiyue/ 規(guī)則集結構體

2、:序號、規(guī)則長度、符號、連接下一結點指針int num;int count;char name;struct Guiyue *next;struct Relation / 分析表結構體:狀態(tài)序號、對應符號列、操作類型的對應序號、操作類型、連接下一結點指針 int line_States ;char rank_Letter;int relationship;char name;struct Relation *next; struct Sign / 符號表結構體: 自變量名、標識類型、連接下一結點指針char name20;char kind;struct Sign *next; struct

3、Word / 單詞表結構體: 單詞名字、標識類型、狀態(tài)、序號、行號、連接符號表指針、連接下一結點指針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;/字符行變量、字符行、單詞所在行、字符數(shù)char buffer10000;/字符串緩沖區(qū)Stack *MarkPush(Stack *ip,char mark,int I_i)/壓棧Stack *s;s=(Stack *)m

4、alloc(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)/

5、 接收ch判斷字符,變量flag返回字符類別int flag;if(ch='!'|ch='$'|ch='&'|ch='*'|ch='('|ch=')'|ch='-'|ch='_'| ch='+'|ch='='|ch='|'|ch=''|ch=''|ch=''|ch=''|ch=''| ch=':'|ch='&q

6、uot;'|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

7、(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);/=/ 詞法分析函數(shù): void scan()/ 數(shù)據(jù)傳遞: 形參fp接收指向文本文件頭的文件指針;/ 全局變量buffer與line對應保存源文件字符及其行號,char_num保存字符總數(shù)。void scan()char ch;int flag,j=0,i=-1;while(!fe

8、of(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 cout<<"n請注意,第"<<row<< "行

9、的"<<ch<<"是非法字符!"<<endl; w_num=i;/*確定單詞所在的行*/int one,two,k=0;for(i=0;i<w_num;i+)one=judge(bufferi);two=judge(bufferi+1);if(one!=two&&bufferi!='?'&&bufferi!='')|one=1)Link=linei;k+;/=/ 初始化單詞表函數(shù): struct Word *InitWord()/ 數(shù)據(jù)傳遞: head返回單詞

10、表的頭指針/ 備注: 初始化單詞表函數(shù)包括分割單詞、標識單詞、生成變量符號表、完善單詞屬性表四個功能struct Word *InitWord()struct Word *head,*ft,*news,*p;struct Sign *s_first,*s_look;s_first=s_look=(struct Sign *)malloc(sizeof(struct Sign);s_first->kind='0's_first->name0='0'news=head=ft=(struct Word *)malloc(sizeof(struct Word

11、);ft->link=s_first;ft->next=NULL;/=分割單詞功能=int i=0,k,flag,jud=0;for(k=0;k<w_num;k+)flag=judge(bufferk);if(jud=0)/1 if(flag=2|flag=3) news->namei=bufferk; news->name+i='0' else /2 i=0; ft=news; if(news->name0>=33&&news->name0<=125) news=(struct Word *)malloc(

12、sizeof(struct Word); ft->next=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='

13、;&'&&bufferk+1='&')| (bufferk='|'&&bufferk+1='|')|(bufferk='>'&&bufferk+1='=')| (bufferk='<'&&bufferk+1='=')|(bufferk='!'&&bufferk+1='=') k=k+1; i=i+1; printf("%d&qu

14、ot;,i); news->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; el

15、se ; if(news->name0<33|news->name0>125) ft->next=NULL; /*單詞轉(zhuǎn)換成標識符*/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->m

16、ark_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->mar

17、k_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->name0<='9')ft->mark_name='n'else if(ft->name0='+

18、'|ft->name0='-'|ft->name0='*'|ft->name0='/' |ft->name0='='|ft->name0='<'|ft->name0='>' |ft->name0=','|ft->name0=''|ft->name0='('|ft->name0=')' |ft->name0=''|ft->name0

19、='')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,&q

20、uot;=")=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=&#

21、39;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_l

22、ook->next=NULL;p=p->next;ft=p;/2ft=ft->next;/1return(head);/=/正確性檢測函數(shù): FindWordDeclare(Word *head) / 數(shù)據(jù)傳遞: *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=hea

23、d;cout<<endl<<"=顯 示 檢 查 結 果="<<endl;while(find)if(find->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!='')&&(f

24、ind->mark_name!='(')&&(find->mark_name!=')') cout<<"第 "<<find->line<<" 行, "<<find->mark_name<<" 存在字符重復錯誤 !"<<endl; else if(find->mark_name='i'&&find->next->mark_name='&#

25、39;)|(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->

26、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=&

27、#39;)'&&find->next->mark_name='') cout<<"第 "<<find->line<<" 行,"<<find->name<<" 處存在符號連接錯誤 !"<<endl; if(find->mark_name='a'|find->mark_name='b'|find->mark_name='c'|find-&g

28、t;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_nam

29、e='+'|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='=&#

30、39;|find->next->mark_name='!'|find->next->mark_name=''|find->next->mark_name='n') cout<<"第 "<<find->line<<" 行, "<<find->mark_name<<" 存在自變量聲明搭配錯誤 !"<<endl;if(find->mark_name='('

31、;|find->mark_name=')'|find->mark_name=''|find->mark_name='') word_fuca=find; ca+;if(find->name0>='0'&&find->name0<='9'&&find->name1>='a'&&find->name1<='z') cout<<"第 "<&

32、lt;find->line<<" 行, "<<find->name<<" 存在變量聲明錯誤 !"<<endl;find=find->next;int j=0;for(i=0;i<cal;i+) s_first=head->link; end=1; while(s_first&&end) if(strcmp(s_first->name,w_namei->name)=0) end=0; else s_first=s_first->next; if(

33、end=1&&i!=cal-1) cout<<"錯誤 ! 第 "<<w_namei->line<<" 行,變量 "<<w_namei->name<<" 沒有被聲明 !"<<endl; q=ip=(struct Stack *)malloc(sizeof(struct Stack);ip->name='$'for(i=0;i<ca;i+)if(word_fui->mark_name='('

34、)|(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<<"錯誤 ! 第 "<<word_fui->line&

35、lt;<" 行,“ "<<word_fui->name<<" ” 存在符號匹配錯誤 ! "<<endl;if(ip->name!='$') cout<<"錯誤 ! 第 "<<word_fui-1->line<<" 行,“ "<<word_fui-1->name<<" ” 存在符號匹配錯誤 !"<<endl; cout<<"

36、n=n"<<endl;/=/初始化分析表函數(shù): Relation *FirstRelation()/ 數(shù)據(jù)傳遞: r_head返回分析表的頭指針 Relation *FirstRelation()Relation *r_head,*r_find,*r_new;r_head=NULL;/狀態(tài)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,1

37、8,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,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,

39、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;/以上狀態(tài)對應的操作類別char SS14="ss","o","s","s","s","s","ssssss

40、ssssss","s","srsssssssssss","s","s","s","s","r","ss","r","r","r","r","r","r","ssssssssss","ssssss","ssssss","ssssssss&qu

41、ot;,"sr","rr","rrrrrrrr","r","ss","rsr","rrr","ssssss","rrssssr","s","ss","ss","rsrr","rrsrr","rrsrrr","rrrrrr","ssssssss","r

42、rrrrr","rrrrrr","s","rr","s","sssss","ssss","ss","rrr","s","s","s","s","rrr","rrr","rrr","rrr","s","sssssss","

43、ssssss","sssss","ssss","ss","ssssssssssss","rsr","rrr","ssssssssssss","rsrr","rrsrr","rrsrrr","rrrrrr","rrrrrr","s","s","rrrrrrrr","s",

44、"s","ssssssssssss","s","rrrrrrrr","rrr","rrrrrrrr" /狀態(tài)的個數(shù)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,

45、8;/以上狀態(tài)在action和goto中對應的列char Let14='v','Q','$','m','(',')','','i','a','b','c','d','f','w','A', 'C','X','Y','S','','i','',

46、9;a','b','c','d','f','w','A','C','X','Y','S','','(','(','=','','i','Z','i','i','i','i','$','','i','a

47、','b','c','d','f','w','X','Y','S','i','!','(','E','H','G','i','!','(','E','H','G','i','(','n','L','I

48、','K','T','F',',','',',','','i','','a','b','c','d','f','w','','&',')','&','|',')','&','|',')'

49、;,'i','!','(','E','H','G','&','|','<','>','','#',')','i','&',')','+','','+','-','',')','+','-'

50、,'/','',')','+','-','*','/','',')','+','-','*','/','',')','i','(','n','L','I','K','T','F','+','-',&#

51、39;*','/','',')','+','-','*','/','',')','i',',','','','i','!','(','H','G','i','!','(','G','&',')',&#

52、39;&','|',')','i','i','i','i','&','|',')','&','|',')','&','|',')','&','|',')','','i','(','n','I&

53、#39;,'K','T','F','i','(','n','K','T','F','i','(','n','T','F','i','(','n','F','+',')','i','a','b','c','d&

54、#39;,'f','w','A','C','X','Y','S','&','|',')','&','|',')','i','a','b','c','d','f','w','A','C','X','Y'

55、,'S','+','-','',')','+','-','/','',')','+','-','*','/','',')','+','-','*','/','',')','+','-','*',

56、9;/','',')','','','i','','a','b','c','d','f','w','e','','i','a','b','c','d','f','w','A','C','X','Y&#

57、39;,'S','','i','','a','b','c','d','f','w','&','|',')','i','','a','b','c','d','f','w','' /初始化關系表 for(int i=0;i<84;i+)

58、for(int j=0;j<cali;j+)r_new=(Relation *)malloc(sizeof(Relation);if(r_head=NULL)r_find=r_head=r_new;r_new->line_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;/=/初始化規(guī)則表函數(shù): Guiyue *guiyue()

59、/ 數(shù)據(jù)傳遞: g_head返回規(guī)則表的頭指針 Guiyue *FirstGuiyue() Guiyue *g_head,*g_find,*g_new;g_head=NULL;/規(guī)約char root='B','Q','S','A','A','C','C','X','Y','Y','Y','Y','Z','Z','S','S','S&

60、#39;,'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

61、,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;/初始化規(guī)則表for(int i=0;i<39;i+)g_new=(Guiyue *)malloc(sizeof(Guiyue);if(g_head=NULL)g_find=g_head=g_new;g_new->num=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;/=/語法分析函數(shù): int

62、ResultAnely(Relation *r_head,Stack *s_head,char str,Guiyue *g_head,int cal) / 數(shù)據(jù)傳遞: 1 *r_head:分析表頭指針. / 2 *s_head:符號棧頭指針. / 3 str :轉(zhuǎn)義字符流. / 4 *g_head:規(guī)則表頭指針. / 5 cal :轉(zhuǎn)義字符流的長度. int ResultAnely(Relation *r_head,Stack *s_head,char str,Guiyue *g_head,int cal)Relation *r_find;Guiyue *g_find;Stack *s_fin

63、d,*s_look;s_find=s_head;int j,v,admition=1,goon=1,in,out=1,hang=-1,count;char stack200,name;/cout<<"n=顯-示-語-法-分-析-過-程-及-結-果="<<endl;/cout<<" LineNum StackData inputSentencen"<<endl;while(goon)/:1int admit=1;r_find=r_head;g_find=g_head;hang+;while(r_find&am

64、p;&admit)/:2if(r_find->line_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;in<cal-1;in+)strin=strin+1;strin='0'cal-;r_find=r_find->next;/:入棧if(r_find->line_States=s_find->num&&r_find->rank_Letter=str0&&r_find-&g

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論