版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上編譯原理實(shí)驗(yàn)報(bào)告姓 名: 高亮 學(xué) 號: 班 級: 計(jì)算機(jī)4班哈爾濱工業(yè)大學(xué)(威海) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院實(shí)驗(yàn)一 詞法掃描器設(shè)計(jì)一 實(shí)驗(yàn)?zāi)康耐ㄟ^設(shè)計(jì)調(diào)試詞法分析程序,實(shí)現(xiàn)從源程序中分出各種單詞的方法;加深對課堂教學(xué)的理解;提高詞法分析方法的實(shí)踐能力。二 實(shí)驗(yàn)內(nèi)容設(shè)計(jì)一個(gè)簡單的類C語言的詞法掃描器。三 實(shí)驗(yàn)要求(一) 程序設(shè)計(jì)要求(1) 根據(jù)附錄給定的文法,從輸入的類C語言源程序中,識別出各個(gè)具有獨(dú)立意義的單詞,即關(guān)鍵字、標(biāo)識符、常數(shù)、運(yùn)算符、分隔符五大類;分發(fā)見最后附錄。(2) 提供源程序輸入界面;(3) 詞法分析后可查看符號表和TOKEN串表;(4) 保存符號表和T
2、OKEN串表(如:文本文件); (5) 遇到錯(cuò)誤時(shí)可顯示提示信息,然后跳過錯(cuò)誤部分繼續(xù)進(jìn)行分析。(二)實(shí)驗(yàn)報(bào)告撰寫要求(1) 系統(tǒng)功能(包括各個(gè)子功能模塊的功能說明);(2) 開發(fā)平臺(操作系統(tǒng)、設(shè)計(jì)語言);Windows 系統(tǒng),C語言(3) 設(shè)計(jì)方案;1) 主數(shù)據(jù)流圖;源程序 Token鏈符號表詞法分析器詞法分析器是否為字母存入token鏈?zhǔn)欠駷閿?shù)字存入token鏈?zhǔn)欠駷閿?shù)字2) 主要子程序的流程框圖(若有必要);3) 模塊結(jié)構(gòu)圖;詞法分析填入符號表生成單詞序列字符分類讀入字符4) 主要數(shù)據(jù)結(jié)構(gòu):符號表、TOKEN串表等。符號表:char *keyword8="do",&
3、quot;begin","else","end","if","then","var","while"/保留字char *operatornum4="+","-","*","/"/運(yùn)算符char *comparison6="<","<=","=",">",">=",&
4、quot;<>"char *interpunction8=",","",":=",".","(",")","",""/界限符(4)。具體設(shè)計(jì)過程(包括主控程序、各個(gè)功能模塊的具體實(shí)現(xiàn))。字母處理:char letterprocess (char ch)/字母處理函數(shù) int i=-1; char letter20; while (isalnum(ch)!=0)/isalnum:如果是英文或阿拉伯?dāng)?shù)字 letter+
5、i=ch; ch=fgetc(fp); ; letteri+1='0' if (search(letter,1) printf("<%s,->n",letter); /strcat(letter,"n"); /fputs('<' letter '>n',outp); else printf("<indentifier,%s>n",letter); /strcat(letter,"n"); /fputs(letter,outp); r
6、eturn(ch);數(shù)字處理:char numberprocess(char ch)/數(shù)字處理程序 int i=-1; char num20; while (isdigit(ch)!=0) num+i=ch; ch=fgetc(fp); if(isalpha(ch)!=0)/如果是字母即為以數(shù)字開始的標(biāo)識符,這是非法的 while(isspace(ch)=0)/負(fù)責(zé)讀完這個(gè)非法標(biāo)識符 num+i=ch; ch=fgetc(fp); numi+1='0' printf("錯(cuò)誤!非法標(biāo)識符:%sn",num); goto u; numi+1='0'
7、; printf("<num,%s>n",num); /strcat(num,"n"); /fputs(num,outp);u: return(ch);主函數(shù):void main () char str,c; printf("*詞法分析器*n"); /outp=fopen("二元式表.txt","w"); if (fp=fopen("source.txt","r")=NULL) printf("源程序無法打開!n"); el
8、se str =fgetc(fp); while (str!=EOF) if (isalpha(str)!=0) str=letterprocess(str); else if (isdigit(str)!=0) str=numberprocess(str); else str=otherprocess(str); ; printf("詞法分析結(jié)束,謝謝使用!n"); printf("點(diǎn)任意鍵退出!n"); c=getch();四 實(shí)驗(yàn)總結(jié)能正確進(jìn)行詞法分析,遇到非法字符時(shí)能夠繼續(xù)執(zhí)行五 運(yùn)行結(jié)果附錄:類C語言的詞法文法id® Letter &
9、lt;temp> int10® Num int10 | Num OP® +| - |* |/ |>| < | = | ( | ) | ; | | = | >= |<= | !=Keyword®if | then | else | while | do Letter®a|b|c|d|e|f|g|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|ZNum®0|1|2|3|4|5|6|7|8|9 |&
10、lt;temp>® Letter <temp> | Num <temp> |實(shí)驗(yàn)二 LR語法分析技術(shù)一 實(shí)驗(yàn)?zāi)康耐ㄟ^設(shè)計(jì)調(diào)試LR語法分析程序,實(shí)現(xiàn)根據(jù)詞法分析的輸入TOKEN字,進(jìn)行文法的語法分析;加深對課堂教學(xué)的理解;提高語法分析方法的實(shí)踐能力。二 實(shí)驗(yàn)內(nèi)容使用附錄中的文法,可以對類似下面的程序語句進(jìn)行語法分析:int a;int b;int c;a=2;b=1; if (a>b)c=a+b;elsec=a-b;三 實(shí)驗(yàn)要求(一) 程序設(shè)計(jì)要求(1)給出主要數(shù)據(jù)結(jié)構(gòu):分析棧、符號表、語法分析樹;(2)將掃描器作為一個(gè)子程序,每次調(diào)用返回一個(gè)TOK
11、EN;(3)程序界面:表達(dá)式輸入、語法分析樹的表示結(jié)果(文件或者圖形方式);(二)實(shí)驗(yàn)報(bào)告撰寫要求(1)系統(tǒng)功能分析與設(shè)計(jì)(包括各個(gè)子功能模塊的功能說明); 輸入單詞符號,進(jìn)行語法檢查,判斷源程序是否符合給定文法的語法定義,通過語義分析檢查語義,運(yùn)用語法制導(dǎo)翻譯原理,將語法分析所識別的語法范疇變換為中間代碼(四元式)。(2)開發(fā)平臺(操作系統(tǒng)、設(shè)計(jì)語言);Windows,c+(3) 設(shè)計(jì)方案:包括功能模塊結(jié)構(gòu)圖、主要函數(shù)的流程圖;主控程序語法分析各個(gè)功能函數(shù)語法分析器Token鏈增加結(jié)束標(biāo)記及初始化查actions創(chuàng)建葉子節(jié)點(diǎn)語法分析成功語法分析錯(cuò)誤創(chuàng)建節(jié)點(diǎn)語法分析結(jié)束(4) 主要數(shù)據(jù)結(jié)構(gòu):分
12、析棧、分析表、符號表、語法分析樹;void SymbolTable_fuction(int address,int lentgh,char *type,char *kind);/字符表函數(shù)int table88=1,1,-1,-1,-1,1,-1,1, / + 1,1,-1,-1,-1,1,-1,1, / - 1,1, 1, 1,-1,1,-1,1, / * 1,1, 1, 1,-1,1,-1,1, / / -1,-1,-1,-1,-1,-1,-1,0, / ( 1,1,1,1,0,1,0,1, / ) 1,1,1,1,0,1,0,1, / i -1,-1,-1,-1,-1,0,-1,-1 /
13、 # ; /*存儲算符優(yōu)先關(guān)系表,先于為,后于或同等優(yōu)先為-1,其它為表示出錯(cuò)*/ struct keyword /存儲關(guān)鍵字,標(biāo)識符,界限符的NAME及編號char *name;int kind;keyword_ABC60;struct SymbolTable /字符表結(jié)構(gòu)體int symbol_address;int symbol_length;char *symbol_type;char *symbol_kind;SymbolTable1100;/*存放讀入的token的結(jié)構(gòu)體*/struct ch_charchar *chchar;struct ch_char *next;*p,*h,
14、*temp,*top;/*進(jìn)行分析用的棧結(jié)構(gòu)*/struct fenxizhanchar *starname;float val;struct fenxizhan *next;*base1,*stact_top,*stact_top_top;(5) 具體設(shè)計(jì)實(shí)現(xiàn)過程(包括主控程序、各個(gè)功能模塊的具體實(shí)現(xiàn))。 void analyze_ABC(FILE *output,char *arry) /識別關(guān)鍵字、標(biāo)識符、數(shù)字int i=0,flag=0;int count=0;if (isalpha(arry0) /判斷首字母是不是英文字母for(int j=1;j<=33;j+) /關(guān)鍵字查找
15、if (strcmp(keyword_ABC,arry)=0) /如果與關(guān)鍵字匹配的話printf("%s (%d,_)n",keyword_ABC,keyword_ABCj.kind); /輸出關(guān)鍵字的token串fprintf(output,"%s (%d,_)n",keyword_ABC,keyword_ABCj.kind);/并寫入token串文件flag=1; /判斷關(guān)鍵字SymbolTable_fuction(num2,strlen(keyword_ABC),"關(guān)鍵字",&q
16、uot;字符型"); /符號表函數(shù)調(diào)用break;if(flag=0)printf("%s (34,%s)n",arry,arry);/輸出標(biāo)識符的token串fprintf(output,"%s (34,%s)n",arry,arry);/并寫入token串文件SymbolTable_fuction(num2,strlen(arry),"簡單變量","字符型");/符號表函數(shù)調(diào)用else /如果首字符不是英文字母for(;i<(int)strlen(arry);i+) if(isdigit(arr
17、yi)count+;if (count=(int)strlen(arry) printf("%s (35,%s)n",arry,arry);/輸出數(shù)字的token串 fprintf(output,"%s (35,%s)n",arry,arry);/并寫入token串文件SymbolTable_fuction(num2,strlen(arry),"實(shí)數(shù)","整型"); /符號表函數(shù)調(diào)用else printf("%s is not standard symbol!n",arry);fprintf(o
18、utput,"%s is not standard symbol!",arry); /提示所要識別的字符沒有定義void analyze_CD(FILE *outfile,char *symbol) /識別界限符、運(yùn)算符 int flag=0;for (int u=38;u<=60;u+)if (strcmp(keyword_ABC,symbol)=0) /界限符、運(yùn)算符查找printf("%s (%d,_)n",keyword_ABC,keyword_ABCu.kind);/輸出界限符、運(yùn)算符的token串fprintf(
19、outfile,"%s (%d,_)n",keyword_ABC,keyword_ABCu.kind);/并寫入token串文件flag=1;SymbolTable_fuction(num2,strlen(keyword_ABC),"界限符和運(yùn)算符","符號");/符號表函數(shù)調(diào)用if(flag=0)printf("%s is unrecognizable symbol!n",symbol); /輸出不符合的字符fprintf(outfile,"%s is unrecognizabl
20、e symbol!n",symbol);int changchar_int(char *ch)/*將字符轉(zhuǎn)為數(shù)字,以得到算符優(yōu)先值*/ int t; if(strcmp(ch,"+")=0)t=0;else if(strcmp(ch,"-")=0)t=1;else if(strcmp(ch,"*")=0)t=2;else if(strcmp(ch,"/")=0)t=3;else if(strcmp(ch,"(")=0)t=4;else if(strcmp(ch,")"
21、;)=0)t=5;else if(strcmp(ch,"#")=0)t=7;else t=6; return t; void error()/錯(cuò)誤提示printf("n");printf("輸入表達(dá)式有錯(cuò)誤!n");exit(0);void push(char *pchar,float val)/*入棧函數(shù)*/ stact_top_top=(fenxizhan*)malloc(sizeof(fenxizhan); stact_top_top->starname=pchar; stact_top_top->val=val;s
22、tact_top_top->next=stact_top; stact_top=stact_top_top; float pop(void)/*出棧函數(shù)*/ if(strcmp(stact_top->starname,"#")!=0 ) data=stact_top->val; stact_top=stact_top->next; return data; float calculate(float number1,float number2,char *str)/四則運(yùn)算float sum;if(strcmp(str,"+")=
23、0)sum=number1+number2;else if(strcmp(str,"-")=0)sum=number1-number2;else if(strcmp(str,"*")=0)sum=number1*number2;else if(strcmp(str,"/")=0)if(number2=0)printf("錯(cuò)誤提示:除數(shù)為零!");exit(0);sum=number1/number2; return sum;/返回結(jié)果四 實(shí)驗(yàn)總結(jié)加深了對語法分析器的理解五 運(yùn)行結(jié)果:附錄:簡單類c語言文法產(chǎn)生式 語
24、義規(guī)則注:P為文法的開始符號說明語句部分文法:P D SD T id ; D |T int | float程序語句部分文法:S id = E; S.code = E.code | gen(id.place:=E.place)S if (C) S1 C.true = newlabel; C.false = S.next;S1.next = S.next;S.code = C.code | gen(C.true:) | S1.codeS if (C) S1 else S2S while (C) S1 do S2C.true = newlabel; C.false = newlabel;S1.nex
25、t = S2.next =S.next;S.code = C.code | gen(C.true:) | S1.code| gen(gotoS.next)| gen(C.false:)| S2.code;S S ; S;C E1 > E2C.code = E1.code | E2.code |gen(ifE1.place>E2.placegotoC.true) |gen(gotoC.false)C E1 < E2 C.code = E1.code | E2.code |gen(ifE1.place<E2.placegotoC.true) |gen(gotoC.false
26、)C E1 = E2 C.code = E1.code | E2.code |gen(ifE1.place=E2.placegotoC.true) |gen(gotoC.false)E E1 + T E.place = newtemp;E.code = E1.code|T.code|gen(E.place:=E1.place+T.place)E E1 T E.place = newtemp; E.code = E1.code | T.code |gen(E.place:=E1.place-T.place)E T E.place = T.place; E.code = T.codeT F T.p
27、lace = F.place; T.code = F.codeT T1 * F T.place = newtemp;T.code = T1.code | F.code |gen(T.place:=T1.place*F.place)T T1 / F T.place = newtemp; T.code = T1.code | F.code |gen(T.place:=T1.place/F.place)F ( E ) F.place = E.place; F.code = E.codeF id F.place = ; F.code = F int10 F.place = int10.v
28、alue; F.code = 實(shí)驗(yàn)三 語義分析及中間代碼生成一 實(shí)驗(yàn)?zāi)康耐ㄟ^上機(jī)實(shí)習(xí),加深對語法制導(dǎo)翻譯原理的理解,掌握將語法分析所識別的語法范疇變換為某種中間代碼的語義翻譯方法。二 實(shí)驗(yàn)內(nèi)容實(shí)現(xiàn)簡單的高級語言源程序的語義處理過程。三 實(shí)驗(yàn)要求(一) 程序設(shè)計(jì)要求(1) 目 標(biāo) 機(jī):8086及其兼容處理器(2) 中間代碼:三地址碼或者四元式(3) 設(shè)計(jì)結(jié)果:語法分析樹(節(jié)點(diǎn)具有屬性)、三地址碼表、符號表、TOKEN串表(4) 語義分析內(nèi)容要求:1) 變量說明語句2) 賦值語句3) 控制語句(任選一種)(5) 其它要求:1) 將詞法分析(掃描器)作為子程序,供語法語義程序調(diào)用;2) 使用語法制導(dǎo)
29、的語義翻譯方法;3) 編程語言自定;4) 最好提供源程序輸入界面;5) 目標(biāo)代碼生成暫不做;6) 編譯后,可查看TOKEN串、語法分析樹、符號表、三地址碼表;7) 主要數(shù)據(jù)結(jié)構(gòu):產(chǎn)生式表、符號表、語法分析樹、三地址碼表。 所用文法使用實(shí)驗(yàn)2中的文法。附錄:語義分析源程序范例int a;int b;int c;a=2;b=1; if (a>b)c=a+b;elsec=a-b;(二)實(shí)驗(yàn)報(bào)告撰寫要求(1) 系統(tǒng)功能分析與設(shè)計(jì)(包括各個(gè)子功能模塊的功能說明);首先將待編譯程序?qū)懭隩XT文本,接下來經(jīng)過詞法掃描器的掃描和分析,將程序轉(zhuǎn)化為TOKEN鏈,接下來語法分析器對TOKEN鏈進(jìn)行語法分析,
30、產(chǎn)生語法分析樹和符號表。接下來使用語義制導(dǎo)翻譯使用語義分析器進(jìn)行語義分析,生成參數(shù)表,函數(shù)表,以及四元式的中間代碼。(2) 開發(fā)平臺(開發(fā)軟硬件環(huán)境);Windows C語言(3) 語義翻譯中使用的數(shù)據(jù)結(jié)構(gòu);/定義結(jié)點(diǎn)類template <class Elem> class linkpublic:link* next;Elem element;int sign;link(const Elem& elementValue,link* nextValue = NULL)element = elementValue;next = nextValue;sign = -1;link(
31、link* nextValue = NUll)next = nextValue;sign = -1;/定義堆棧類template <class Elem> class stackprivate:link<Elem> *top;int size;public:stack(int sz = DefaultSize)top = NULL;size = 0;stack()clear();void clear()while(top!=NULL)link<Elem>* temp = top;top = top->next;size = 0;delete temp;
32、/入棧函數(shù)bool push(const Elem& item)top = new link<Elem>(item,top);size+;return true;/出棧函數(shù)Elem pop()Elem item;if (size = 0)return false;item = top->element;link<Elem>* temp = top->next;delete top;top = temp;size-;return item;/獲取棧頂元素的值Elem GetTop() constElem item; if(size = 0)return
33、 false;item = top->element;return item;/獲取堆棧的深度int length() constreturn size;/判斷棧是否為空bool IsEmpty() constreturn top = NULL;/獲取標(biāo)志位int GetSign() constreturn top->sign; /設(shè)置標(biāo)志位void SetSign(int s)top->sign = s;/定義產(chǎn)生式的數(shù)據(jù)結(jié)構(gòu)class Productionpublic:char From;char To20;(4) 程序具體設(shè)計(jì)實(shí)現(xiàn)過程(包括主要功能模塊的具體實(shí)現(xiàn))。/定義保存first,F(xiàn)ollow的類class FirstFollowpublic:char ch;char first10;char follow10;/ 建立文法分析表類class LRParseprivate:Item * item;Grammar
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年版特許經(jīng)營權(quán)授予協(xié)議
- 買賣協(xié)議書匯編六篇
- 2024年度砸墻工程設(shè)計(jì)與施工監(jiān)理合同3篇
- 2024年生產(chǎn)協(xié)作合同3篇
- 2024年版食堂廚房管理服務(wù)合同3篇
- 活動計(jì)劃模板集錦五篇
- 大學(xué)生學(xué)習(xí)計(jì)劃15篇
- 收購合同匯編10篇
- 對甲氧基苯甲醛項(xiàng)目商業(yè)計(jì)劃書
- 學(xué)校后勤干事崗位職責(zé)總結(jié)
- 腦血管病的介入診療課件
- 苗木供貨服務(wù)計(jì)劃方案
- 全員安全生產(chǎn)責(zé)任考核表
- 董事長調(diào)研方案
- 某物業(yè)公司薪酬管理制度
- 急性心肌梗死罪犯血管心電圖判斷
- 完善程序填空數(shù)組指針 供練習(xí)
- (高清版)組合鋁合金模板工程技術(shù)規(guī)程JGJ 386-2016
- 室內(nèi)質(zhì)控品統(tǒng)一征訂單
- 《論語》誦讀計(jì)劃
- 2006年工資標(biāo)準(zhǔn)及套改對應(yīng)表
評論
0/150
提交評論