




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、精選優質文檔-傾情為你奉上 課程設計任務書課題名稱編譯原理課程設計完成時間 指導教師 職稱 學生姓名 班級 總體設計要求總體設計要求: 課程設計內容共給定1個題目,每個學生按照課程設計要求,在規定的兩周時間內獨立完成。題目: 編譯程序構造涉及內容:詞法分析、語法分析、語義分析生成中間代碼工作內容及時間進度安排第一周、周:設計動員,布置課程設計任務,查閱資料,制定方案,進行程序方案設計。第一周、周2-周5:編寫和調試程序第二周、周1-周3:編寫和調試程序第二周、周4:整理,撰寫設計報告。第二周、周5:驗收,提交設計報告,評定成績。畢業設計成果1、課程設計報告書一份2、源程序清單一份3、成果使用說
2、明書一份內容摘要 第1章 緒論1.1、課程設計目的 1.2、課程設計意義 1.3、課程設計要求 1.4、課程設計內容1.4.1、題目編譯程序構造1.4.2、內容涉及詞法分析、自下而上語法分析程序的實現:SLR(1)分析器的實現以及生成中間代碼。1.4.3、具體要求根據LR分析算法構造SLR(1)分析程序,并完成語法分析動作(當需要一個單詞時,調用詞法分析程序獲取),同時完成語義分析生成四元式輸出。要求程序具有通用性,改變文法時只需改變程序的數據初值,無需改變程序主體;要求完成一條說明語句、一條算數表達式和賦值語句的翻譯,生成中間代碼。變量說明語句的文法及相應的語義子程序:.att表示數據類型屬
3、性,fill函數表示將單詞id及其類別屬性填寫符號表。(0)SD; acc(1)Dint id fill(id,int);D.att=int; (2)Dfloat id fill(id,float); D.att=float; (3)DD(1),id fill(id,D(1).att);D.att=D(1).att; 算數表達式和賦值語句的文法及相應的語義子程序。(1)Aid=E; p=lookup(); emit(E.PALCE, , p); (2)EE(1)+T E.PALCE=newtemp(); emit(+,E(1).PALCE,T.PALCE,E.PALCE)(3)E
4、T E.PALCE=T.PALCE;(4)TT(1)*F T.PALCE=newtemp(); emit(+,T(1).PALCE,F.PALCE,T.PALCE)(5)TF T.PALCE=F.PALCE;(6)F(E) F.PALCE=E.PALCE;(7)Fid P=LOOKUP(); F.PALCE=P;(8)Fnum P=LOOKUP(num.value)F.PALCE=P;構造其用于SLR(1)分析的識別活前綴的DFA以及action表和goto表。然后編程實現。(關于詞法分析部分只需識別出與此文法相關的單詞即可(+,*,(,),id,=)。1.4.4、程序設計提示(
5、1)分析棧設計時可以用一個棧完成,也可以設計三個棧:一個符號棧,一個狀態棧,一個語義棧,則歸約時,則需要在符號棧中退掉n個符號,在狀態棧中退掉n個符號(n為產生式符號個數),語義棧中退掉n個符號對應的語義;(2)終結符表和非終結符表的組織和預測分析程序中相同(將符號對應到一個數字,表示在分析表中對應的下標)。(3)action表中的錯誤處理:簡化的錯誤處理:當查找action表出現空白時,則當前單詞無法移進和規約,可簡單的認為當前單詞為多余的單詞,則拋棄當前單詞,讀下一單詞繼續分析。1.4.5、測試數據源文件中數據:int area,r; r=1;area=r*r+r;程序要求輸出二元式序列、
6、符號表、語法分析過程、四元式序列。1.4.6、程序擴展要求 第2章 程序總體設計 第3章 程序詳細設計與實現3.1、詞法分析首先定義結構體typedef struct /狀態棧 int datamax;int top;seqstack1;typedef struct /符號棧 string datamax; int top;seqstack2;struct reserveedword/保留字表結構 string word;char value;reserveedword1maxsize;struct identifer/標識符表結構 char identiname15; char identi
7、type15; int address;identifer1maxsize;struct constant/常量表結構string constantname; string value; int constantaddress;constant1maxsize;詞法分析主要函數結構: void Initscanner() /該函數用于用C語言當中常見的關鍵字初始化保留表 void Isalpha(char s) /用于判斷讀入的字符是不是字母 void Isnumber(char s) /用于判斷讀入的字符是不是數字 void Isother(char s) /判斷除數字與字母之外的其他字符
8、void Lexscan() /用于循環從程序中讀入字符并判斷應調用那個判斷函數字符 void Output(int i,int j,char ss15) /輸出二元式 本模塊程序的偽代碼如下:打開文件infile.open("input.txt",ios:in); if(!infile) cerr<<"讀取的文件打開失敗!"<<endl; exit(1); 初始化保留字表 Initscanner();循環讀入從文件當中 Scanner()while(ch!='#') 在該函數中判斷應該調用的判斷函數 Lexsca
9、n() infile.get(ch); if(ch>='A')&&(ch<='Z')|(ch>='a')&&(ch<='z') Isalpha(ch) Output; else if(ch>='0')&&(ch<='9') Isnumber(ch) Output; else Isother(ch) Output; 關閉文件infile.close(); 詞法分析器中從源文件讀出一個單詞,判斷其類型是關鍵字、標識符還是
10、普通符號,根據其類型為結構體各項賦值,并將其傳給語法分析函數。3.2、語法分析由于說明語句與算術表達式和賦值語句所使用的是不同的文法,所以兩者的ACTION表和GOTO表也不一樣,本次課設采用二維數組存放ACTION表和GOTO表信息,其中移進用大于0的數表示,歸約用小于0的數表示,成功用100表示(acc),其他處用0表示,查表時遇到相應的數進行相應的操作。其中,歸約部分需要根據其產生式的信息進行,所以程序中有如下定義:string v18="int","float","",",","id",
11、"#","D","S" /存放說明文法當中的字符string v213="#","id","=","num","","+","*","(",")","F","A","E","T"/存放算本文法當中的字符根據狀態轉換圖(DFA)構造SLR(1)分析表:其中說明文法和算術文法分別構造
12、,同時在每個表當中既有action表 又有goto表int analysis_table1108=3,4,0,0,0,0,2,1, 0,0,0,0,0,100,0,0,0,0,5,6,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,9,0,0,0,0,0,-2,-2,0,0,0,0,0,0,-3,-3,0,0,0,0,0,0,-4,-4,0,0,0,0;int analysis_table21713=0,2,0,0,0,0,0,0,0,0,1,0,0, 100,0,0,0,0,0,0,0,0,0,0,0,0, 0
13、,0,3,0,0,0,0,0,0,0,0,0,0, 0,9,0,8,0,0,0,7,0,6,0,4,5, 0,0,0,0,10,11,0,0,0,0,0,0,0, 0,0,0,0,-3,-3,12,0,-3,0,0,0,0, 0,0,0,0,-5,-5,-5,0,-5,0,0,0,0, 0,9,0,8,0,0,0,7,0,6,0,13,5, 0,0,0,0,-8,-8,-8,0,-8,0,0,0,0, 0,0,0,0,-7,-7,-7,0,-7,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0, 0,9,0,8,0,0,0,7,0,6,0,0,14, 0,9,0,8,0,
14、0,0,7,0,15,0,0,0, 0,0,0,0,0,11,0,0,16,0,0,0,0, 0,0,0,0,-2,-2,12,0,-2,0,0,0,0, 0,0,0,0,-4,-4,-4,0,-4,0,0,0,0, 0,0,0,0,-6,-6,-6,0,-6,0,0,0,0;語法分析當中各個函數說明及偽代碼:void action1(int i,string s) /通過詞法分析傳過來的值判斷移進動作三個棧(狀態棧,符號棧,語義棧)應該讀入哪些值。void action2(int i,string s) /同action1只是表示算術文法int address(string m,int i,
15、string x) /獲得在分析表中的列下標void goto1(int i,string s) /通過判斷棧中的元素,來判斷用那個產生式來進行規約void goto2(int i,string s) /同goto1void slr1() /對說明文法進行語法分析void slr1() /對算術文法進行語法分析 偽代碼如下: 先判斷是說明文法還是算術文法 If(說明文法) Slr1()push_seq1(s1,0); push_seq2(s2,"#");push_seq2(s3,"_");while(1) j=address(v1,8,get1); to
16、p_seq1(s1,top); j=analysis_table1topj; if(j<0) if(j=-1) 用S->D;歸約 else if(j=-2)用D->int id歸約 else if(j=-3)用D->float id歸約" else if(j=-4)用D->D,id歸約" else if(j>0) action1(top,get1); else Slr2() push_seq1(s1,0); push_seq2(s2,"#"); push_seq2(s3,"_"); while(1)
17、 j=address(v2,13,get1); j=analysis_table2topj; if(j>0) action2(top,get1); else if(j<0) if(j=-1)用A->id=E;歸約" else if(j=-2)用E->E+T歸約" else if(j=-3)用E->T歸約" else if(j=-4) 用T->T*F歸約"); else if(j=-5)用T->F歸約" else if(j=-6)用F->(E)歸約" else if(j=-7)用F->
18、;id歸約" else if(j=-8)用F->num歸約" 3.3、語義分析一個程序經過詞法分析,語法分析之后,表明該院程序在書寫上是正確的,但是未對程序的內部邏輯語義進行分析,接下來是進行語義分析。語義分析當中各個函數說明: void print(string s) /打印四元式str1,string str2,string str3,string str4) /產生四元式string newtemp() /產生一個新的臨時變量 3.4、程序實現結果圖圖3-4 語義分析結果圖圖3-5二元式圖3-6符號表圖3-7四元式 專心-專注-專業附錄#include<i
19、ostream>#include<fstream>using namespace std;#define maxsize 50#define max 30ifstream infile;char ch;int m,n,kk=0,addr=0,t=1;string get1;string inmaxsize;string insmaxsize;string s4;int count=0;string v18="int","float","",",","id","#&qu
20、ot;,"D","S"string v213="#","id","=","num","","+","*","(",")","F","A","E","T"string E="",E1="",T="",T1="",F=&qu
21、ot;"int analysis_table1108=3,4,0,0,0,0,2,1, 0,0,0,0,0,100,0,0,0,0,5,6,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,9,0,0,0,0,0,-2,-2,0,0,0,0,0,0,-3,-3,0,0,0,0,0,0,-4,-4,0,0,0,0;int analysis_table21713=0,2,0,0,0,0,0,0,0,0,1,0,0, 100,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,3,0,0,0,0,0,0,
22、0,0,0,0, 0,9,0,8,0,0,0,7,0,6,0,4,5, 0,0,0,0,10,11,0,0,0,0,0,0,0, 0,0,0,0,-3,-3,12,0,-3,0,0,0,0, 0,0,0,0,-5,-5,-5,0,-5,0,0,0,0, 0,9,0,8,0,0,0,7,0,6,0,13,5, 0,0,0,0,-8,-8,-8,0,-8,0,0,0,0, 0,0,0,0,-7,-7,-7,0,-7,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0, 0,9,0,8,0,0,0,7,0,6,0,0,14, 0,9,0,8,0,0,0,7,0,15,0,0,0,
23、 0,0,0,0,0,11,0,0,16,0,0,0,0, 0,0,0,0,-2,-2,12,0,-2,0,0,0,0, 0,0,0,0,-4,-4,-4,0,-4,0,0,0,0, 0,0,0,0,-6,-6,-6,0,-6,0,0,0,0;typedef struct /狀態棧 int datamax;int top;seqstack1;typedef struct /符號棧 string datamax;int top;seqstack2;struct reserveedword/保留字表結構string word;char value;reserveedword1maxsize;str
24、uct identifer/標識符表結構char identiname15;char identitype15;int address;identifer1maxsize;struct constant/常量表結構string constantname;string value;int constantaddress;constant1maxsize;void Initscanner();void Lexscan();void Isalpha(char);void Isnumber(char);void Isother(char);void Output(int ,int ,char *);v
25、oid Scanner();void change(char c,string str) int len=str.length();for(int num=0;num<len;num+)cnum=strnum;clen='0'seqstack1 *init_seqstack1()seqstack1 *s;s=new seqstack1;if(!s)cout<<"空間不足!"<<endl;return NULL;else s->top=-1;return s; int empty_seq1(seqstack1 *s)if(s
26、->top=-1) return 1;else return 0;int push_seq1(seqstack1 *s,int x) if(s->top=max-1)return 0;else s->top+;s->datas->top=x;return 1;int pop_seq1(seqstack1 *s,int *x)if(empty_seq1(s)return 0;else *x=s->datas->top;s->top-;return 1;void top_seq1(seqstack1 *s,int &e)if(empty_se
27、q1(s)cout<<"占空!"else e=s->datas->top;seqstack2 *init_seqstack2()seqstack2 *s;s=new seqstack2;if(!s)cout<<"空間不足!"<<endl;return NULL;else s->top=-1;return s; int empty_seq2(seqstack2 *s)if(s->top=-1) return 1;else return 0;int push_seq2(seqstack2 *s,st
28、ring x) if(s->top=max-1)return 0;else s->top+;s->datas->top=x;return 1;int pop_seq2(seqstack2 *s,string *x)if(empty_seq2(s)return 0;else *x=s->datas->top;s->top-;return 1;void out_seq1(seqstack1 *s)for(int i=0;i<=s->top;i+)printf("%d",s->datai);void out_seq2(s
29、eqstack2 *s) char ch15;for(int i=0;i<=s->top;i+)change(ch,s->datai);printf("%s",ch);seqstack1 *s1=init_seqstack1();seqstack2 *s2=init_seqstack2();seqstack2 *s3=init_seqstack2();void pop(int n)int m;string s;for(int i=0;i<n;i+)pop_seq1(s1,&m);pop_seq2(s2,&s); pop_seq2(s3
30、,&s);int screamp(char a15,string b)int i=0,j=0; while(ai!='0'&&bi!='0')if(ai=bi)i+; j+; elsereturn 0;if(ai=bi)return 1;elsereturn 0;int screamp1(string a,string b)int i=0,j=0; while(ai!='0'&&bi!='0')if(ai=bi)i+; j+; elsereturn 0;if(ai=bi)return 1;e
31、lsereturn 0;void clear(seqstack1 *s1,seqstack2 *s2,seqstack2 *s3)int m;string s;while(!empty_seq1(s1)pop_seq1(s1,&m); pop_seq2(s2,&s); pop_seq2(s3,&s);void char_Table() char str115,str215; cout<<"n生成的標識符表為:" cout<<"ntnamettypetvaluetaddress" for(int i=0;i&
32、lt;m;i+) printf("n%dt%st%s",i,identifer1i.identiname,identifer1i.identitype); cout<<"n生成的常數表為:" cout<<"ntvaluettypetnametaddress" for(int j=0;j<n;j+) change(str1,constant1j.constantname); change(str2,constant1j.value); printf("n%dt%st%s",j,str1,
33、str2); int judge(string m,int i,string x) for(int j=0;j<i;j+) if(screamp1(x,mj) return 1; return 0;int address(string m,int i,string x) for(int j=0;j<i;j+) if(screamp1(x,mj) return j;void print(string s)cout<<"n產生的四元式為"<<endl;char chmax; for(int i=0;i<count;i+)change(c
34、h,si);printf("%s",ch);cout<<endl;cout<<endl;void emit(string str1,string str2,string str3,string str4) scount+="("scount+=str1;scount+=","scount+=str2;scount+=","scount+=str3;scount+=","scount+=str4;scount+=")"count+;string newt
35、emp()char s2;s0='T's1=t;s2='0't+;return s;void action1(int i,string s)int pos,j;j=address(v1,8,s);pos=analysis_table1ij;char str15;change(str,s);out_seq1(s1);printf("tt");out_seq2(s2);printf("tt");out_seq2(s3);printf("tt");if(pos=100)cout<<"分析
36、成功!"<<endl; cout<<"*"<<endl;else printf("action%d,%s=S%d狀態%d入棧n",i,str,pos,pos);push_seq1(s1,pos); push_seq2(s2,s); push_seq2(s3,"_"); get1=inaddr;addr+;void goto1(int i,string s) int pos,j; if(judge(v1,8,s) j=address(v1,8,s);pos=analysis_table1ij
37、;char str15;change(str,s); printf("goto%d,%s=%dn",i,str,pos);push_seq1(s1,pos);push_seq2(s2,s);void slr1() clear(s1,s2,s3); char str115; push_seq1(s1,0); push_seq2(s2,"#"); push_seq2(s3,"_"); get1=inaddr; addr+; int top,j; while(1) j=address(v1,8,get1); top_seq1(s1,top)
38、; if(top=100) addr-; return; j=analysis_table1topj; if(j<0) if(j=-1) out_seq1(s1);printf("tt");out_seq2(s2);printf("tt");out_seq2(s3);printf("tt用S->D;歸約"); pop(2); top_seq1(s1,top); goto1(top,"S"); push_seq2(s3,"_"); else if(j=-2) out_seq1(s1);
39、printf("tt");out_seq2(s2);printf("tt");out_seq2(s3);printf("tt用D->int id歸約"); change(str1,"int"); for(int k=0;k<15;k+) identifer1kk.identitypek=str1k; kk+; pop(2); top_seq1(s1,top); goto1(top,"D"); push_seq2(s3,"_"); else if(j=-3) out
40、_seq1(s1);printf("tt");out_seq2(s2);printf("tt");out_seq2(s3);printf("tt用D->float id歸約"); change(str1,"float"); for(int k=0;k<15;k+) identifer1kk.identitypek=str1k; kk+; pop(2); top_seq1(s1,top); goto1(top,"D"); push_seq2(s3,"_"); els
41、e if(j=-4) out_seq1(s1);printf("tt");out_seq2(s2);printf("tt");out_seq2(s3);printf("tt用D->D,id歸約"); for(int k=0;k<15;k+) identifer1kk.identitypek=identifer1kk-1.identitypek; kk+; pop(3); top_seq1(s1,top); goto1(top,"D"); push_seq2(s3,"_"); else
42、 if(j>0) action1(top,get1); void action2(int i,string s)int pos,j; if(judge(v2,13,s) j=address(v2,13,s);pos=analysis_table2ij;char str15;change(str,s);out_seq1(s1);printf("tt");out_seq2(s2);printf("tt");out_seq2(s3);printf("tt");if(pos=100)cout<<"分析成功!&quo
43、t;<<endl;cout<<"*"<<endl;else printf("action%d,%s=S%d狀態%d入棧n",i,str,pos,pos);push_seq1(s1,pos); push_seq2(s2,s); push_seq2(s3,"_"); get1=inaddr;addr+;void goto2(int i,string s) int pos,j; if(judge(v2,13,s) j=address(v2,13,s);pos=analysis_table2ij;char
44、str15;change(str,s); printf("goto%d,%s=%dn",i,str,pos);push_seq1(s1,pos);push_seq2(s2,s); void slr2() t='1' clear(s1,s2,s3); push_seq1(s1,0); push_seq2(s2,"#"); push_seq2(s3,"_"); get1=inaddr; addr+; string p10;int num=0; pnum=insaddr-1;num+; int top,j; char str
45、115; while(1) j=address(v2,13,get1); top_seq1(s1,top); if(top=100) addr-; return; j=analysis_table2topj; if(j>0) action2(top,get1); else if(j<0) if(j=-1) out_seq1(s1);printf("tt");out_seq2(s2);printf("tt");out_seq2(s3);printf("tt用A->id=E;歸約"); pop(4); top_seq1(
46、s1,top); goto2(top,"A"); for(int i=0;i<m;i+) if(screamp(identifer1i.identiname,p0)&&(identifer1i.identitype!=NULL) change(str1,identifer1i.identiname); emit("=",E,"_",str1); push_seq2(s3,str1); else if(j=-2) out_seq1(s1);printf("tt");out_seq2(s2);pr
47、intf("tt");out_seq2(s3);printf("tt用E->E+T歸約"); pop(3); top_seq1(s1,top); goto2(top,"E"); E1=E; E=newtemp(); emit("+",E1,T,E); push_seq2(s3,E); else if(j=-3) out_seq1(s1);printf("tt");out_seq2(s2);printf("tt");out_seq2(s3);printf("tt
48、用E->T歸約"); pop(1); top_seq1(s1,top); goto2(top,"E"); E=T; push_seq2(s3,T); else if(j=-4) out_seq1(s1);printf("tt");out_seq2(s2);printf("tt");out_seq2(s3);printf("tt用T->T*F歸約"); pop(3); top_seq1(s1,top); goto2(top,"T"); T1=T; T=newtemp(); e
49、mit("*",T1,F,T); push_seq2(s3,T); else if(j=-5) out_seq1(s1);printf("tt");out_seq2(s2);printf("tt");out_seq2(s3);printf("tt用T->F歸約"); pop(1); top_seq1(s1,top); goto2(top,"T"); T=F; push_seq2(s3,F); else if(j=-6) out_seq1(s1);printf("tt")
50、;out_seq2(s2);printf("tt");out_seq2(s3);printf("tt用F->(E)歸約"); pop(3); top_seq1(s1,top); goto2(top,"F"); F=E; push_seq2(s3,E); else if(j=-7) pnum=insaddr-2;num+; out_seq1(s1);printf("tt");out_seq2(s2);printf("tt");out_seq2(s3);printf("tt用F->id歸約"); pop(1); top_seq1(s1,top); goto2(top,"F"); for(int i=0;i<m;i+) if(screamp(identifer1i.identiname,pnum-1)&&(identifer1i.identitype!=NULL) change(str1,identifer1i.identi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 難忘的一個人500字作文10篇范文
- 兒童節游樂場活動方案
- 企業與貓咖的合作協議
- 運輸承包合同與運輸車輛承包合同
- 品牌服裝采購與分銷合同
- 公交公司小隊活動方案
- 快樂童話創作與故事主題(5篇)
- 公交車禮讓行人活動方案
- 對失敗與成功的新認識議論文15篇
- 重新簽訂離婚協議書
- JBT 8473-2014 儀表閥組標準規范
- 【編制說明】電力電纜通道用防火隔板及槽盒技術規范
- 分布式光伏經濟評價規范
- 振動力學期末試卷-06.07.08期末-上海交大
- MOOC 大學物理(上)-西北工業大學 中國大學慕課答案
- 伊朗鋼結構包裝專項方案
- 小升初數學知識點總結(小考復習精編專項講義)六年級數學小升初復習系列:數與式知識點梳理大全
- E+H-壓力變送器培訓
- 統編版高中語文必修下冊《跨媒介閱讀與交流》標準課件
- 重慶市地質災害專業監測預警技術要求(試行)
- 幼兒園戶外自主游戲中教師的有效介入研究-以積木游戲為案例(最終成稿)
評論
0/150
提交評論