資源描述:
《簡單C語言編譯器(編譯原理).doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、.#include#include#include#include#include#include#include#include#defineNULL0structStack//棧結(jié)構(gòu)體:序號(hào)、內(nèi)容、連接下一結(jié)點(diǎn)指針{intnum;charname;structStack*next;};structGuiyue//規(guī)則集結(jié)構(gòu)體:序號(hào)、規(guī)則長度、符號(hào)、連接下一結(jié)點(diǎn)指針{intnum;intcount;charname;stru
2、ctGuiyue*next;};structRelation//分析表結(jié)構(gòu)體:狀態(tài)序號(hào)、對(duì)應(yīng)符號(hào)列、操作類型的對(duì)應(yīng)序號(hào)、操作類型、連接下一結(jié)點(diǎn)指針{intline_States;charrank_Letter;intrelationship;charname;structRelation*next;};structSign//符號(hào)表結(jié)構(gòu)體:自變量名、標(biāo)識(shí)類型、連接下一結(jié)點(diǎn)指針{charname[20];charkind;structSign*next;};structWord//單詞表結(jié)構(gòu)體:單詞名字、標(biāo)識(shí)類型、狀態(tài)、序號(hào)、行號(hào)、連接符號(hào)表指針、連接下一結(jié)點(diǎn)指針{charname[20
3、];..charmark_name;intstate;intnum;intline;structSign*link;structWord*next;};FILE*fp1;//文件指針introw=1,line[10000],Lin[300],w_num;//字符行變量、字符行、單詞所在行、字符數(shù)charbuffer[10000];//字符串緩沖區(qū)Stack*MarkPush(Stack*ip,charmark,intI_i)//壓棧{Stack*s;s=(Stack*)malloc(sizeof(Stack));s->name=mark;s->num=I_i;s->next=ip;ip
4、=s;returnip;}voidMarkPop(Stack*ip)//出棧{Stack*q;charname;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);}}intjudge(charch)//接收ch判斷字符,變量flag返回字符類別{intflag;if(ch=='!'
5、
6、ch=='$'
7、
8、ch=='&'
9、
10、ch=='*'
11、
12、ch=='('
13、
14、ch==')'
15、
16、ch=='-'
17、
18、ch
19、=='_'
20、
21、ch=='+'
22、
23、ch=='='
24、
25、ch=='
26、'
27、
28、ch=='{'
29、
30、ch=='}'
31、
32、ch=='['
33、
34、ch==']'
35、
36、ch==';'
37、
38、ch==':'
39、
40、ch=='"'
41、
42、ch=='<'
43、
44、ch==','
45、
46、ch=='>'
47、
48、ch=='.'
49、
50、ch=='/'
51、
52、ch==''')flag=1;elseif('0'<=ch&&ch<='9')..flag=2;elseif(('a'<=ch&&ch<='z')
53、
54、('A'<=ch&&ch<='Z'))flag=3;elseif(ch=='')flag=4;elseif(ch=='')flag=5;elseif(c
55、h=='?')flag=6;elseif(feof(fp1))flag=7;//結(jié)束elseflag=0;//illegalcharacterreturn(flag);}//======================================================================================================//詞法分析函數(shù):voidscan()//數(shù)據(jù)傳遞:形參fp接收指向文本文件頭的文件指針;//全局變量buffer與line對(duì)應(yīng)保存源文件字符及其行號(hào),char_num保存字符總數(shù)。voidscan(){charc
56、h;intflag,j=0,i=-1;while(!feof(fp1)){ch=fgetc(fp1);flag=judge(ch);printf("%c",ch);//顯示打開的文件if(flag==1
57、
58、flag==2
59、
60、flag==3){i++;buffer[i]=ch;line[i]=row;}elseif(flag==4){i++;buffer[i]='?';line[i]=row;}elseif(flag==5){i++;buffer