版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 課程設計任務書及成績評定</p><p> 課程設計的任務和具體要求設計任務選擇一種常見高級語言為背景,對其進行簡化,設計一個簡單的c編譯器。例如只包括整型常數(shù)和其四則運算以及相應的賦值語句,轉(zhuǎn)移語句,條件語句和最簡單的輸入輸出語句等.編制一個包括必要處理階段(詞法分析、語法分析、語義分析、代碼生成)簡化又完整的編譯程序。設計要求寫出符合分析方法要求的文法,給出分析方法的思想,完成分析程序設
2、計;編制好分析程序后,設計若干用例,上機測試并通過所設計的分析程序。指導教師簽字: 日期: </p><p> 指導教師評語成績: 指導教師簽字: 日期: </p><p> 課程設計所需軟件、硬件等PC機
3、Microsoft Visual C++6.0</p><p> 課程設計進度計劃</p><p> 起至日期工作內(nèi)容備注</p><p> 2010.5.1---2010.5.152010.5.16---2010.6.12010.6.2---2010.6.15收集資料編寫代碼運行、調(diào)試</p><p> 參考文獻、資料索引</p>
4、;<p> 序號文獻、資料名稱編著者出版單位</p><p> 1 程序設計語言編譯原理 陳火旺、劉春林等 國防工業(yè)出版社2 數(shù)據(jù)結構(C語言版) 嚴蔚敏、吳偉民 清華大學出版社3 C程序設計 譚浩強 清華大學出版社4 程序設計語言編譯方法 肖軍模
5、 大連理工大學出版社</p><p><b> 目 錄</b></p><p> 課程設計的任務和具體要求................................1</p><p> 課程設計進度計劃........................................2</p><p
6、> 目錄....................................................3</p><p><b> 正文</b></p><p> 1、設計題目………………………………………………………… 4</p><p> 2 、 算法設計的思想………………………………………………4</p>
7、;<p> 3 、 算法設計分析…………………………………………………5</p><p> 4、 源代碼…………………………………………………………6</p><p> 5 、 運行結果分析…………………………………………………6</p><p> 結束語………………………………………………………………20</p><p&
8、gt;<b> 正文</b></p><p><b> 1、設計題目</b></p><p> 一個簡單編譯器的設計與分析</p><p><b> 2、算法設計的思想</b></p><p> 編譯程序的工作過程一般可以分為五個階段:詞法分析、語法分析、語義分析與中
9、間代碼產(chǎn)生、優(yōu)化、目標代碼生成。每一個階段在功能上是相對獨立的,它一方面從上一個階段獲取分析的結果來進行分析,另一方面由將結果傳遞給下一個階段。由編譯程序的五個階段就對應了編譯系統(tǒng)的結構。</p><p> 其中詞法分析器利用超前搜索、狀態(tài)轉(zhuǎn)換等方法,將源程序轉(zhuǎn)化成為一個一個的單詞符號二元式。一般程序語言的單詞符號包括關鍵字、運算符、常數(shù)、標識符和界符。語法分析器將這些單詞符號作為輸入,對它進行語法分析。語法分
10、析分為兩種方法:自上而下分析法和自下而上分析法。針對不同程序語言的語法規(guī)則可以采取不同的分析方法,當然兩種方法也可以同時使用。語法分析器把語法單元作為輸入供語義分析器使用。一般的語義分析器主要采用的是語法制導方法,即在語法分析的同時進行語法分析,并產(chǎn)生一定的語義動作,來生成中間代碼。上面三個過程可以與硬件無關,而接下來的優(yōu)化器和目標代碼生成器是針對某一種處理器而言的。代碼優(yōu)化是將語義分析生成的中間代碼進行優(yōu)化,產(chǎn)生執(zhí)行效率更高的代碼。目
11、標代碼生成器最終生成可以在某種機器上運行的機器語言或者匯編語言。在整個編譯過程中還包括對表格的操作和對錯誤的處理,這些也都是非常重要的環(huán)節(jié)。</p><p> 下圖給出了編譯系統(tǒng)的結構框圖:</p><p><b> 3、算法設計分析</b></p><p> 使用的數(shù)據(jù)結構和關鍵變量</p><p> stru
12、ct Stack { // 棧結構體: 序號、內(nèi)容、連接下一結點指針</p><p><b> int num;</b></p><p> char name;</p><p> struct Stack *next;</p><p><b> };</b></p><
13、;p> struct Guiyue { // 規(guī)則集結構體:序號、規(guī)則長度、符號、連接下一結點指針</p><p><b> int num;</b></p><p> int count;</p><p> char name;</p><p> struct Guiyue *next;</p&g
14、t;<p><b> };</b></p><p> struct Relation { // 分析表結構體:狀態(tài)序號、對應符號列、操作類型的對應序號、操作類型、連接下一結點指針</p><p> int line_States ;</p><p> char rank_Letter;</p><p&g
15、t; int relationship;</p><p> char name;</p><p> struct Relation *next;</p><p><b> };</b></p><p> struct Sign { // 符號表結構體: 自變量名、標識類型、連接下一結點指針</p>
16、<p> char name[20];</p><p> char kind;</p><p> struct Sign *next;</p><p><b> };</b></p><p> struct Word { // 單詞表結構體: 單詞名字、標識類型、狀態(tài)、序號、行號、連接符號表指針、連
17、接下一結點指針</p><p> char name[20];</p><p> char mark_name;</p><p> int state;</p><p><b> int num;</b></p><p><b> int line;</b><
18、/p><p> struct Sign *link;</p><p> struct Word *next;</p><p><b> };</b></p><p> FILE *fp1, fp2; // 文件指針</p><p> int row = 1; // 字符行變量<
19、;/p><p> int line[10000], Lin[300]; // 字符行</p><p> int w_num; // 單詞所在行、字符數(shù)</p><p> char buffer[10000]; // 字符串緩沖區(qū)</p><p> struct Word *head,*find; // 單詞表結構體頭指針&l
20、t;/p><p> struct Relation *r_head; // 分析表結構體頭指針</p><p> struct Guiyue *g_head; // 規(guī)約集結構體頭指針</p><p> struct Stack *s_head; // 棧結構體頭指針</p><p><b> 主要功能函數(shù)簡述&
21、lt;/b></p><p> 以下是實現(xiàn)的主要功能函數(shù)的信息簡述,具體實現(xiàn)請參看六、源代碼</p><p> int judge(char ch) </p><p> 功能:接收ch判斷字符,變量flag返回字符類別</p><p> void scan() </p><p> 功能:掃描輸入源文
22、件,并生成單詞種別碼</p><p> struct Word *InitWord()</p><p> 功能:包括分割單詞、標識單詞、生成變量符號表、完善單詞屬性表</p><p> int ResultAnely(Relation* r_head,Stack *s_head, char str[], Guiyue *g_head, int cal)<
23、/p><p><b> 功能:詞法分析函數(shù)</b></p><p> int ResultAnely(Relation *r_head,Stack *s_head,char str[],Guiyue *g_head,int cal)</p><p><b> 功能:語法分析函數(shù)</b></p><p&
24、gt; void ProduceStyle(char str[], int order_num)</p><p> 功能:算術表達式四元式函數(shù)</p><p> void BoolStyle(char str[], int order_num)</p><p> 功能:布爾表達式四元式函數(shù)</p><p> void FourSt
25、yle(int goon, Word *head)</p><p> 功能:顯示四元式函數(shù)</p><p> Stack *MarkPush(Stack *ip,char mark,int I_i)</p><p><b> 功能:進棧</b></p><p> void MarkPop(Stack *ip)&l
26、t;/p><p><b> 功能:出棧</b></p><p> void FindWordDeclare(Word *head)</p><p> 功能:正確性檢測函數(shù),查找保留字是否被聲名和符號是否對稱</p><p> Relation *FirstRelation()</p><p>
27、 功能:初始化分析表函數(shù)</p><p> Guiyue *FirstGuiyue()</p><p> 功能:初始化規(guī)則表函數(shù)</p><p><b> 4、主要源代碼:</b></p><p> int judge(char ch) // 接收ch判斷字符,變量flag返回字符類別</p>
28、<p><b> {</b></p><p><b> int flag;</b></p><p> if(ch=='!'||ch=='$'||ch=='&'||ch=='*'||ch=='('||ch==')'||ch==&
29、#39;-'||ch=='_'||</p><p> ch=='+'||ch=='='||ch=='|'||ch=='{'||ch=='}'||ch=='['||ch==']'||ch==';'||</p><p> ch=='
30、:'||ch=='"'||ch=='<'||ch==','||ch=='>'||ch=='.'||ch=='/'||ch=='\'') </p><p><b> flag=1;</b></p><p> else
31、 if('0'<=ch&&ch<='9') </p><p><b> flag=2;</b></p><p> else if(('a'<=ch&&ch<='z')||('A'&
32、lt;=ch&&ch<='Z')) </p><p><b> flag=3;</b></p><p> else if(ch==' ') </p><p><b> flag=4;</b>
33、</p><p> else if(ch=='\n') </p><p><b> flag=5;</b></p><p> else if(ch=='?') </p&
34、gt;<p><b> flag=6;</b></p><p> else if(feof(fp1))</p><p> flag=7;//結束</p><p> else </p><p> flag=0
35、; //illegal character</p><p> return(flag);</p><p><b> }</b></p><p> void scan()</p><p><b> {</b></p><p><b> char c
36、h;</b></p><p> int flag,j=0,i=-1;</p><p> while(!feof(fp1)) {</p><p> ch=fgetc(fp1);</p><p> flag=judge(ch);</p><p> printf("%c",ch);/
37、/顯示打開的文件</p><p> if(flag==1||flag==2||flag==3) {i++;buffer[i]=ch;line[i]=row;}</p><p> else if(flag==4) {i++;buffer[i]='?';line[i]=row;}</p><p> else i
38、f(flag==5) {i++;buffer[i]='~';row++;}</p><p> else if(flag==7) continue;</p><p> else cout<<"\n請注意,第"<<row<< "行的"<<ch<&
39、lt;"是非法字符!"<<endl; </p><p> } </p><p><b> w_num=i;</b></p><p><b> //初始化關系表</b></p><p>
40、; for(int i=0;i<84;i++){</p><p> for(int j=0;j<cal[i];j++){</p><p> r_new=(Relation *)malloc(sizeof(Relation));</p><p> if(r_head==NULL){</p><p> r_find=r_he
41、ad=r_new;</p><p><b> }</b></p><p> r_new->line_States=i;</p><p> r_new->rank_Letter=Let[i][j];</p><p> r_new->relationship=sr[i][j];</p>
42、<p> r_new->name=SS[i][j];</p><p> r_find->next=r_new;</p><p> r_find=r_new;</p><p> r_new->next=NULL;</p><p><b> }</b></p><p
43、><b> }</b></p><p> return r_head;</p><p><b> }</b></p><p> Guiyue *FirstGuiyue(){</p><p> Guiyue *g_head,*g_find,*g_new;</p><
44、;p> g_head=NULL;</p><p><b> //規(guī)約</b></p><p> char root[]=</p><p> {'B','Q','S','A','A','C','C','X'
45、,'Y','Y','Y','Y','Z','Z','S','S','S','E','E','H',</p><p> 'H','G','G','G','
46、;G','G','G','G','L','L','I','I','K','K','T','T','F','F','F'};</p><p><b> int LR[]=&l
47、t;/b></p><p> {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};</p><p><b> //初始化規(guī)則表</b></p><p> for(int i=0;i<39;i++){</p>
48、<p> g_new=(Guiyue *)malloc(sizeof(Guiyue));</p><p> if(g_head==NULL){</p><p> g_find=g_head=g_new;</p><p><b> }</b></p><p> g_new->num=i;<
49、;/p><p> g_new->count=LR[i];</p><p> g_new->name=root[i];</p><p> g_find->next=g_new;</p><p> g_find=g_new;</p><p> g_new->next=NULL;</p&g
50、t;<p><b> }</b></p><p> return g_head;</p><p><b> }</b></p><p> int ResultAnely(Relation *r_head,Stack *s_head,char str[],Guiyue *g_head,int cal)
51、{</p><p> Relation *r_find;</p><p> Guiyue *g_find;</p><p> Stack *s_find;</p><p> //Stack *s_look;</p><p> s_find=s_head;</p><p> int a
52、dmition=1,goon=1,in,out=1,hang=-1,count;</p><p> //char stack[200];</p><p> char name;</p><p> //cout<<"\n===================顯--示--語--法--分--析--過--程--及--結--果==========
53、========="<<endl;</p><p> //cout<<" LineNum StackData inputSentence\n"<<endl;</p><p> while(goon){//:1</p><p> int
54、admit=1;</p><p> r_find=r_head;</p><p> g_find=g_head;</p><p><b> hang++;</b></p><p> while(r_find&&admit){//:2</p><p> if(r_find-
55、>line_States==s_find->num&&r_find->rank_Letter==str[0]&&r_find->name=='s'){//:入棧</p><p> s_find=MarkPush(s_find,str[0],r_find->relationship);</p><p><b
56、> admit=0;</b></p><p> for(in=0;in<cal-1;in++){str[in]=str[in+1];}</p><p> str[in]='\0';</p><p><b> cal--;</b></p><p> r_find=r_fin
57、d->next;</p><p><b> }//:入棧~</b></p><p> if(r_find->line_States==s_find->num&&r_find->rank_Letter==str[0]&&r_find->name=='r'){//:規(guī)約</p>
58、<p> g_find=g_head;</p><p> int g=r_find->relationship;</p><p> while(g) {g_find=g_find->next;g--; }</p><p> name=g_find->name;</p><p> count=g_find
59、->count;</p><p><b> admit=0;</b></p><p> for(int k=0;k<count;k++){</p><p> MarkPop(s_find);</p><p><b> }</b></p><p> r_f
60、ind=r_head;</p><p><b> int a=1;</b></p><p> while(r_find&&a){</p><p> if(r_find->line_States==s_find->num && r_find->rank_Letter==name){</
61、p><p> s_find=MarkPush(s_find,name,r_find->relationship);</p><p><b> a=0;</b></p><p><b> }</b></p><p> r_find=r_find->next;</p>&
62、lt;p><b> }</b></p><p><b> }//:規(guī)約~</b></p><p> if(r_find->line_States==s_find->num&&r_find->rank_Letter==str[0]&&r_find->name=='o'
63、;){//:2判斷運算結束</p><p><b> admit=0;</b></p><p><b> goon=0;</b></p><p><b> out=0;</b></p><p> cout<<"\nSuccess !"&l
64、t;<endl;</p><p> return(1);</p><p><b> }</b></p><p> r_find=r_find->next;</p><p><b> }</b></p><p> if(admit==1){ //判斷輸
65、入流是否正確,如在分析表中找不到關系,則輸入流錯誤</p><p><b> goon=0;</b></p><p> cout<<"\nInput Flow Error !"<<endl;</p><p> return(0);</p><p><b> }
66、</b></p><p><b> }</b></p><p> cout<<"\n****************************************\n"<<endl;</p><p> return 242424;</p><p><b
67、> }</b></p><p> void ProduceStyle(char str[],int order_num){</p><p> struct FourStyle{</p><p> char Word,Opr1,Opr2,Result;</p><p><b> int num;</b
68、></p><p> struct FourStyle *next;</p><p><b> };</b></p><p> struct Stack *stack_a,*stack_b;</p><p> char temp;</p><p> struct FourStyle
69、 *f_head,*f_find,*f_new;</p><p> stack_a=(struct Stack *)malloc(sizeof(struct Stack));</p><p> stack_a->name='$';</p><p> stack_a->next=NULL;</p><p>
70、stack_b=(struct Stack *)malloc(sizeof(struct Stack));</p><p> stack_b->name='#';</p><p> stack_b->next=NULL;</p><p> f_head=NULL;</p><p> int admit,ca
71、l,four;</p><p> four=1;// 四元式序號</p><p><b> cal=0;</b></p><p><b> admit=1;</b></p><p> while(admit){</p><p> if(str[cal]=='
72、='){</p><p> stack_a=MarkPush(stack_a,str[cal],cal);</p><p><b> cal++;</b></p><p><b> }</b></p><p> else if(stack_b->name=='#'
73、;||stack_b->name=='+'||stack_b->name=='-'||stack_b->name=='*'||stack_b->name=='/')</p><p><b> {</b></p><p> if((str[cal]>='a'
74、)&&(str[cal]<='z')||(str[cal]>='0')&&(str[cal]<='9')){</p><p> stack_a=MarkPush(stack_a,str[cal],cal);</p><p><b> cal++;</b></p&
75、gt;<p><b> }</b></p><p> else if(str[cal]=='('){</p><p> stack_b=MarkPush(stack_b,'#',cal);</p><p><b> cal++;</b></p><p
76、><b> }</b></p><p> else if((stack_b->name=='#')&&(str[cal]=='+'||str[cal]=='-'||str[cal]=='*'||str[cal]=='/')){</p><p> stack
77、_b=MarkPush(stack_b,str[cal],cal);</p><p><b> cal++;</b></p><p><b> }</b></p><p> else if((stack_b->name=='#')&&(str[cal]==')')
78、){</p><p> MarkPop(stack_b);</p><p><b> cal++;</b></p><p><b> }</b></p><p> else if((stack_b->name=='#')&&(str[cal]=='
79、;;')){</p><p><b> admit=0;</b></p><p><b> }</b></p><p> else if(stack_b->name=='+'||stack_b->name=='-'||stack_b->name=='*
80、'||stack_b->name=='/'){</p><p> if((stack_b->name=='+'||stack_b->name=='-')&&(str[cal]=='*'||str[cal]=='/')){</p><p> stack_b=MarkP
81、ush(stack_b,str[cal],cal);</p><p><b> cal++;</b></p><p><b> }</b></p><p><b> else{</b></p><p> if(f_head==NULL){</p><
82、p> f_new=(struct FourStyle *)malloc(sizeof(struct FourStyle));</p><p> f_find=f_new;</p><p> f_head=f_find;</p><p><b> }</b></p><p><b> else{&
83、lt;/b></p><p> f_new=(struct FourStyle *)malloc(sizeof(struct FourStyle));</p><p> f_find->next=f_new;</p><p> f_find=f_new;</p><p> f_new->next=NULL;</
84、p><p><b> }</b></p><p> f_new->num=order_num;</p><p> f_new->Word=stack_b->name;</p><p> MarkPop(stack_b);</p><p> f_new->Opr2=st
85、ack_a->name;</p><p> MarkPop(stack_a);</p><p> f_new->Opr1=stack_a->name;</p><p> MarkPop(stack_a);</p><p> temp=four+65;</p><p> f_new->R
86、esult=temp;</p><p> stack_a=MarkPush(stack_a,f_new->Result,cal);</p><p><b> four++;</b></p><p><b> }</b></p><p><b> }</b><
87、/p><p><b> }</b></p><p> if(cal!=3&&admit==0&&str[cal]==';'){</p><p> f_new=(struct FourStyle *)malloc(sizeof(struct FourStyle));</p><
88、p> f_new->num=order_num;</p><p> f_new->Opr1=stack_a->name;</p><p> MarkPop(stack_a);</p><p> f_new->Word=stack_a->name;</p><p> MarkPop(stack_a)
89、;</p><p> f_new->Opr2='_';</p><p> f_new->Result=stack_a->name;</p><p> MarkPop(stack_a);</p><p> f_find->next=f_new;</p><p> f_fi
90、nd=f_new;</p><p> f_new->next=NULL;</p><p><b> four++;</b></p><p><b> }</b></p><p> else if(cal==3&&admit==0&&str[cal]==&
91、#39;;'){</p><p> f_new=(struct FourStyle *)malloc(sizeof(struct FourStyle));</p><p> f_new->num=order_num;</p><p> f_new->Opr1=stack_a->name;</p><p> M
92、arkPop(stack_a);</p><p> f_new->Word=stack_a->name;</p><p> MarkPop(stack_a);</p><p> f_new->Opr2='_';</p><p> f_new->Result=stack_a->name;&l
93、t;/p><p> f_head=f_new;</p><p> f_new->next=NULL;</p><p><b> four++;</b></p><p><b> }</b></p><p><b> }</b></p&g
94、t;<p> f_find=f_head;</p><p> while(f_find){</p><p> /*cout.width(20);*/cout<<f_find->num<<": ( "<<f_find->Word<<" "<<f_find-&
95、gt;Opr1<<" "<<f_find->Opr2<<" "<<f_find->Result<<" )"<<endl;</p><p> f_find=f_find->next;</p><p><b> }</b&
96、gt;</p><p><b> }</b></p><p> void BoolStyle(char str[],int order_num){</p><p> struct FourStyle{</p><p> char Word,Opr1,Opr2;</p><p> int
97、Order,num;</p><p> struct FourStyle *next;</p><p><b> };</b></p><p> struct FourStyle *b_head,*b_find,*b_new,*p[100];</p><p> b_head=NULL;</p>&l
98、t;p> int cal,admit,i=0;</p><p><b> admit=1;</b></p><p><b> cal=0;</b></p><p> while(admit){</p><p> if(str[cal]!='|'&&st
99、r[cal]!='&'){</p><p> if(b_head==NULL){</p><p> b_find=b_new=(struct FourStyle *)malloc(sizeof(struct FourStyle));</p><p> b_head=b_find;</p><p> p[i]=b
100、_find;</p><p><b> i++;</b></p><p><b> }</b></p><p><b> else{</b></p><p> b_new=(struct FourStyle *)malloc(sizeof(struct FourStyl
101、e));</p><p> p[i]=b_new;i++;</p><p> b_find->next=b_new;</p><p> b_find=b_new;</p><p> b_new->next=NULL;</p><p><b> }</b></p>
102、<p> b_new->Opr1=str[cal];cal++;</p><p> b_new->Word=str[cal];cal++;</p><p> b_new->Opr2=str[cal];cal++;</p><p> b_new->num=order_num;</p><p> b_
103、new->Order=0;</p><p> b_new=(struct FourStyle *)malloc(sizeof(struct FourStyle));</p><p> p[i]=b_new;i++;</p><p> b_new->Opr1='_';</p><p> b_new->W
104、ord='j';</p><p> b_new->Opr2='_';</p><p> b_new->num=order_num;</p><p> b_new->Order=0;</p><p> b_find->next=b_new;</p><p>
105、 b_find=b_new;</p><p> b_new->next=NULL;</p><p><b> }</b></p><p> else if(str[cal]=='|'){</p><p> p[i-1]->Order=p[i-1]->num+1;</p&g
106、t;<p><b> cal++;</b></p><p><b> }</b></p><p> else if(str[cal]=='&'){</p><p> p[i-2]->Order=p[i-2]->num+2;</p><p>&
107、lt;b> cal++;</b></p><p><b> }</b></p><p> if(str[cal]=='$'){</p><p><b> admit=0;</b></p><p> p[0]->Order=order_num;<
108、/p><p> p[i-2]->Order=p[i-2]->num+2;</p><p> if(str[cal-4]=='&'){</p><p> p[i-1]->Order=p[i-3]->num;</p><p><b> }</b></p>&l
109、t;p><b> }</b></p><p><b> }</b></p><p> b_find=b_head;</p><p> while(b_find){</p><p> cout<<b_find->num<<": ( "
110、<<b_find->Word<<" "<<b_find->Opr1<<" "<<b_find->Opr2<<" "<<b_find->Order<<" )"<<endl;</p><p> b_f
111、ind=b_find->next;</p><p><b> }</b></p><p><b> }</b></p><p> void Print(int t,Word *head,FILE *fp,Relation *r_head){</p><p> struct Word *
112、w_look;</p><p> struct Sign *s_look;</p><p> struct Relation *r_new;</p><p><b> int i=0;</b></p><p> switch(t){</p><p><b> case 1:&l
113、t;/b></p><p><b> {</b></p><p> cout<<endl<<"==========輸--入--流--轉(zhuǎn)--義--表============="<<endl;</p><p> w_look=head;</p><p>
114、while(w_look){</p><p> if(i==30) {cout<<" "<<w_look->mark_name<<endl;i=0;}</p><p> else {cout<<" "<<w_look->mark_name;i++;}</p>
115、<p> w_look=w_look->next;</p><p><b> }</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> case 2:</b>&l
116、t;/p><p><b> { </b></p><p> cout<<endl<<"==========詞--法--分--析--過--程--及--結--果============="<<endl;</p><p> w_look=head;</p><p>
117、 cout<<"WordNumber WordLine WordName WordMark"<<endl;</p><p> while(w_look){</p><p> cout<<" "<<w_look->num<<"\t\t&quo
118、t;<<w_look->line<<"\t\t"<<w_look->name<<"\t\t"<<w_look->mark_name<<endl;</p><p> w_look=w_look->next;</p><p><b> }<
119、;/b></p><p> cout<<"WordNumber WordLine WordName WordMark"<<endl;</p><p> cout<<"\n=========================================================
120、====\n"<<endl;</p><p> cout<<endl<<"======自--變--量--符--號--表========"<<endl;</p><p> s_look=head->link;</p><p> cout<<"DataType
121、"<<" "<<"SignName";</p><p> while(s_look){</p><p> cout<<" "<<s_look->kind<<"\t\t"<<s_look->name<&
122、lt;endl;</p><p> s_look=s_look->next;</p><p><b> }</b></p><p><b> break;</b></p><p><b> }</b></p><p><b>
123、case 4:</b></p><p><b> {</b></p><p> cout<<endl<<"============歸--約--規(guī)--則============"<<endl;</p><p> while(!feof(fp)) printf("
124、%c",fgetc(fp));//顯示打開的文件</p><p> cout<<endl<<"============LR--分--析--表============"<<endl;</p><p> r_new=r_head;</p><p><b> int l=-1;</b
125、></p><p> while(r_new){</p><p> if(l==r_new->line_States){</p><p> cout<<" "<<r_new->rank_Letter<<"="<<r_new->name<&l
126、t;r_new->relationship;</p><p><b> }</b></p><p><b> else{</b></p><p><b> l++;</b></p><p> cout<<endl<<l<<
127、9;\t'<<r_new->rank_Letter<<"="<<r_new->name<<r_new->relationship;</p><p><b> }</b></p><p> r_new=r_new->next;</p><p>
128、<b> }</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p>
129、 //======================================================// </p><p> 主函數(shù): void main()</p><p> void main(){</p><p> cout<<"簡易C語言編譯器"<<endl<<endl;&
130、lt;/p><p> struct Word *head,*find;</p><p> struct Relation *r_head;</p><p> struct Guiyue *g_head;</p><p> struct Stack *s_head;</p><p> head=(Word *)ma
131、lloc(sizeof(Word));</p><p> head->next=NULL;</p><p> r_head=(Relation *)malloc(sizeof(Relation));</p><p> r_head->next=NULL;</p><p> s_head=(Stack *)malloc(si
132、zeof(Stack));</p><p> s_head->name='$';</p><p> s_head->num=0;</p><p> s_head->next=NULL;</p><p> int goon=2,cal,i=0;</p><p> char do
133、cument[50],str[1000];//另存輸入流</p><p> FILE *fp2;</p><p> cout<<"請輸入源代碼文件名。程序已提供 test1.c(正確的源代碼) 和 test2.c(有錯誤的源代碼)"<<endl;</p><p> cout<<"注意請輸入文件的
134、全路徑名,而且文件后綴名必須為 *.c "<<endl;</p><p> cout<<"Let's go-->" ;</p><p> cin>>document;</p><p> cout<<endl;</p><p> if((fp1=
135、fopen(document,"rt"))==NULL){</p><p> cout<<"\n文件不存在或者打開失敗,謝謝使用!"<<endl;</p><p><b> exit(0);</b></p><p><b> }</b></p&g
136、t;<p> fp2=fopen("LR.txt","rt");</p><p> int flag=1;</p><p> if(head->next==NULL){ </p><p> scan(); //生成輸入流(1),從文件中掃描源代碼語句,保存在緩沖區(qū)</p><
137、;p> head=InitWord(); //生成單詞表(2),從緩沖區(qū)中讀取字符串語句,進行詞法分析</p><p> find=head;</p><p> while(find){</p><p> str[i]=find->mark_name;</p><p> find=find->next;</p
138、><p><b> i++;</b></p><p><b> }</b></p><p> str[i]='$';</p><p> str[i+1]='\0';</p><p><b> cal=i+1;</b>
139、</p><p><b> }</b></p><p><b> flag++;</b></p><p> system("pause");</p><p> cout<<endl<<"簡易C語言編譯器"<<endl
140、;</p><p> Print(flag,head,fp2,r_head);</p><p><b> flag++;</b></p><p> system("pause");</p><p> cout<<endl<<"簡易C語言編譯器"<
141、;<endl;</p><p> if(r_head->next==NULL){ </p><p> g_head=FirstGuiyue();//從文件中讀取文法語句,打印文法</p><p> r_head=FirstRelation();//生成LR分析表</p><p><b> }</b&g
142、t;</p><p> //if (flag==3) { Print(flag,head,fp2,r_head); continue; } </p><p> if(goon==2){ </p><p> goon=ResultAnely(r_head,s_head,str,g_head,cal);//語法分析</p><p&
143、gt; FindWordDeclare(head);//檢查正確性,判斷符號是否對稱</p><p><b> }</b></p><p> // if (flag==3) continue; </p><p> system("pause");</p><p> cout<&
144、lt;endl<<"簡易C語言編譯器"<<endl;</p><p><b> flag++;</b></p><p> FourStyle(goon,head);//生成四元式(4)</p><p><b> flag=0;</b></p><p>
145、; fclose(fp1); fclose(fp2);</p><p><b> }</b></p><p><b> 5、測試及分析</b></p><p><b> 1.打開源文正確的</b></p><p><b> 2、詞法分析:</b>
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯原理課程設計---一個簡單編譯器的設計與分析
- 編譯原理課程設計--一個簡單文法的編譯器的設計與實現(xiàn)
- 編譯原理課程設計--一個簡單文法的編譯器前端的設計與實現(xiàn)
- 編譯原理課程設計報告(一個完整的編譯器)
- 編譯原理課程設計---簡單編譯器的設計與實現(xiàn)
- 編譯原理課程設計--編譯器
- 編譯原理課程設計報告-簡單文法的編譯器的設計與實現(xiàn)
- 編譯原理課程設計---編譯器的實現(xiàn)
- 編譯原理課程設計報告_編譯器
- 編譯原理課程設計任務書
- 編譯原理課程設計報告--編譯器實現(xiàn)
- 編譯原理課程設計____c語言編譯器的實現(xiàn)-
- 編譯原理課程設計---c語言編譯器的實現(xiàn)
- 編譯原理課程設計--c語言編譯器實現(xiàn)
- 編譯原理課程設計--c語言編譯器實現(xiàn)
- c語言編譯器實現(xiàn)-編譯原理課程設計
- 編譯原理課程設計報告---編譯器功能的實現(xiàn)
- 編譯原理課程設計---s語言的編譯器的設計與實現(xiàn)
- 編譯原理課程的設計--c語言編譯器
- 編譯原理課程設計報告--pl0編譯器的擴充
評論
0/150
提交評論