第一篇:編譯原理實(shí)驗(yàn)報(bào)告
編譯原理實(shí)驗(yàn)報(bào)告
報(bào)告完成日期 2018.5.30
一. 組內(nèi)分工與貢獻(xiàn)介紹
二. 系統(tǒng)功能概述;
我們使用了自動(dòng)生成系統(tǒng)來完成我們的實(shí)驗(yàn)內(nèi)容。我們?cè)O(shè)計(jì)的系統(tǒng)在完成了實(shí)驗(yàn)基本要求的前提下,進(jìn)行了一部分的擴(kuò)展。增加了聲明變量類型、類型賦值判定和聲明的變量被引用時(shí)作用域的判斷。從而使得我們的實(shí)驗(yàn)結(jié)果呈現(xiàn)的更加清晰和易懂。
三. 分系統(tǒng)報(bào)告;
一、詞法分析子系統(tǒng)
詞法的正規(guī)式:
標(biāo)識(shí)符
<字母>(<字母>|<數(shù)字字符>)* 十進(jìn)制整數(shù)
0 |(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)* 八進(jìn)制整數(shù) 0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* 十六進(jìn)制整數(shù) 0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* 運(yùn)算符和分隔符 +| * | / | > | < | = |(|)| <=|>=|==; 對(duì)于標(biāo)識(shí)符和關(guān)鍵字: A5—〉 B5C5 B5—〉a | b |??| y | z C5—〉(a | b |??| y | z |0|1|2|3|4|5|6|7|8|9)C5|ε 綜上正規(guī)文法為: S—〉I1|I2|I3|A4|A5 I1—〉0|A1 A1—〉B1C1|ε C1—〉E1D1|ε D1—〉E1C1|ε
E1—〉0|1|2|3|4|5|6|7|8|9 B1—〉1|2|3|4|5|6|7|8|9 I2—〉0A2 A2—〉0|B2 B2—〉C2D2 D2—〉F2E2|ε E2—〉F2D2|ε
C2—〉1|2|3|4|5|6|7 F2—〉0|1|2|3|4|5|6|7 I3—〉0xA3 A3—〉B3C3 B3—〉0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f C3—〉(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)|C3|ε
A4—〉+ |-| * | / | > | < | = |(|)| <=|>=|==; A5—〉 B5C5 B5—〉a | b |??| y | z C5—〉(a | b |??| y | z |0|1|2|3|4|5|6|7|8|9)C5|ε
狀態(tài)圖
流程圖:
詞法分析程序的主要數(shù)據(jù)結(jié)構(gòu)與算法
考慮到報(bào)告的整潔性和整體觀感,此處我們僅展示主要的程序代碼和算法,具體的全部代碼將在整體的壓縮包中一并呈現(xiàn)
另外我們考慮到后續(xù)實(shí)驗(yàn)中,如果在bison語法樹生成的時(shí)候推不出目標(biāo)的產(chǎn)生式時(shí),我們?cè)O(shè)計(jì)了報(bào)錯(cuò)提示,在這個(gè)詞的位置出現(xiàn)錯(cuò)誤提示,將記錄切割出來的詞在code.txt中保存,并記錄他們的位置。
以下是我們的主要代碼:
進(jìn)制的識(shí)別:
結(jié)果展示:
二、語法分析子系統(tǒng)
根據(jù)選擇的語法分析方法進(jìn)行描述
我們使用了遞歸子程序發(fā),并且對(duì)原有的產(chǎn)生式進(jìn)行了改寫,改寫后的結(jié)果如下: P→LP1|L L→S
S→id=E|{P}|if C then S | if C then S
1else S2 | while C do S1 C→E1C’
C’→>E2| E→int8E’| int10E’| int16E’| idE’|T E’→+T|-T||+TE’|-TE’ T→int8T’| int10T’| int16T’| idT’|F T’→*F|/F|*FT’|/FT’ F→(E)|int8|int10|int16|id 簡化的語法圖: S的語法圖: C的語法圖: E的語法圖: T的語法圖: F的語法圖: 流程圖: 語法分析子系統(tǒng)的主要數(shù)據(jù)結(jié)構(gòu)與算法 我們采用了自動(dòng)生成技術(shù),同樣在這里也是展示主要的核心功能代碼,全部的代碼展示在壓縮包中: 我們?cè)谠O(shè)計(jì)時(shí),實(shí)現(xiàn)了產(chǎn)生式對(duì)應(yīng)的字符串同時(shí)標(biāo)識(shí)產(chǎn)生式定義的int值 輔助程序: 生成語法樹的程序: 1.樹節(jié)點(diǎn): 2.創(chuàng)建新節(jié)點(diǎn) 3.創(chuàng)建實(shí)數(shù)類型新節(jié)點(diǎn) 4.創(chuàng)建標(biāo)識(shí)符類型新節(jié)點(diǎn) 5.輸出語法樹 三、三地址碼生成器 算法的基本思想: 我們?cè)黾恿寺暶髯兞款愋?、類型賦值判定和聲明的變量被引用時(shí)作用域的判斷。從而使得我們的實(shí)驗(yàn)結(jié)果呈現(xiàn)的更加清晰和易懂。 在報(bào)錯(cuò)的時(shí)候,我們會(huì)呈現(xiàn)類型、作用域和賦值三種的問題的報(bào)錯(cuò)信息。 流程圖: 算法展示: 四、實(shí)驗(yàn)體會(huì) 這次實(shí)驗(yàn)其實(shí)總的來說是讓我們更加清晰的理解到了我們所學(xué)的內(nèi)容。有時(shí)候我們上課聽講,課下復(fù)習(xí)寫作業(yè)的時(shí)候,其實(shí)看似掌握了所學(xué)內(nèi)容,但實(shí)際上并沒有親身體會(huì)的操作很難讓我們深刻的理解其中的相關(guān)意義。通過這次實(shí)驗(yàn),我們能夠從根源處了解到了我們所學(xué)的內(nèi)容,并且基于我們理解之后的輸出。比如詞法分析不能采用空格來區(qū)分單詞,因?yàn)榇嬖诩訙p乘除等運(yùn)算符和分隔符,使用空格來區(qū)分可能會(huì)造成錯(cuò)誤的分解。又比如我們?cè)僭诔绦蛟O(shè)計(jì)中,常常體會(huì)到效率的重要性。影響詞法分析的效率的主要因素是各個(gè)狀態(tài)的分支如何規(guī)劃。如果每個(gè)進(jìn)來的單詞都能在最短的時(shí)間和最少的匹配次數(shù)內(nèi)找到其入口,則效率將得到很大程度上的提高。所以由此我們產(chǎn)生了聲明變量類型、賦值和作用域的想法,將其放在最后來進(jìn)行判斷,這樣可以提高整體的執(zhí)行效率。 另外,這次小組成員彼此不在一個(gè)班級(jí),這樣從某一方面來說,也加強(qiáng)了我們互相快速熟識(shí)并團(tuán)結(jié)協(xié)作的能力,有了這種體驗(yàn),我想我們?cè)诮窈蟮纳钪校鎸?duì)這種情況的時(shí)候,將會(huì)變得更加有經(jīng)驗(yàn)。 五、源程序 詞法分析器: 輸入結(jié)果: 輸出結(jié)果: 語義分析結(jié)果: 輸入: 第二組數(shù)據(jù)的輸入: 輸出: 三地址碼的輸入: 第二組數(shù)據(jù)的輸入: 輸出: 實(shí)驗(yàn)2:語法分析 1.實(shí)驗(yàn)題目和要求 題目:語法分析程序的設(shè)計(jì)與實(shí)現(xiàn)。 實(shí)驗(yàn)內(nèi)容:編寫語法分析程序,實(shí)現(xiàn)對(duì)算術(shù)表達(dá)式的語法分析。要求所分析算術(shù)表達(dá)式由如下的文法產(chǎn)生。 E?E?T|E?T|TT?T*F|T/F|F F?id|(E)|num實(shí)驗(yàn)要求:在對(duì)輸入表達(dá)式進(jìn)行分析的過程中,輸出所采用的產(chǎn)生式。方法1:編寫遞歸調(diào)用程序?qū)崿F(xiàn)自頂向下的分析。方法2:編寫LL(1)語法分析程序,要求如下。 (1)編程實(shí)現(xiàn)算法4.2,為給定文法自動(dòng)構(gòu)造預(yù)測分析表。(2)編程實(shí)現(xiàn)算法4.1,構(gòu)造LL(1)預(yù)測分析程序。 方法3:編寫語法分析程序?qū)崿F(xiàn)自底向上的分析,要求如下。(1)構(gòu)造識(shí)別所有活前綴的DFA。(2)構(gòu)造LR分析表。 (3)編程實(shí)現(xiàn)算法4.3,構(gòu)造LR分析程序。 方法4:利用YACC自動(dòng)生成語法分析程序,調(diào)用LEX自動(dòng)生成的詞法分析程序。實(shí)現(xiàn)(采用方法1) 1.1.步驟: 1)對(duì)文法消除左遞歸 E?TE'E'??TE'|?TE'|?T?FT'T'?*FT'|/FT'|?F?id|(E)|num 2)畫出狀態(tài)轉(zhuǎn)換圖 化簡得: 3)源程序 在程序中I表示id N表示num 1.2.例子: a)例子1 輸入:I+(N*N)輸出: b)例子2 輸入:I-NN 輸出: 吉林大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院實(shí)驗(yàn)報(bào)告 計(jì)算機(jī)基礎(chǔ)實(shí)驗(yàn)教學(xué)中心編制 姓名,學(xué)號(hào):胡智超,53070108;陳玉娟,53070130;程明,53070109;張宇航,53070110 2007 級(jí)1班 實(shí)驗(yàn)室:A209成績指導(dǎo)教師(簽字)(存檔) —————————————————————————————————————————————— ★ 實(shí)驗(yàn)課程名稱: ★ 實(shí)驗(yàn) 項(xiàng) 目: ★ 實(shí)驗(yàn) 儀 器: ★ 實(shí)驗(yàn) 要 求: ★ 實(shí)驗(yàn)步驟、分析設(shè)計(jì)與結(jié)果: 一.實(shí)驗(yàn)序號(hào):《編譯原理》第一次實(shí)驗(yàn) 二.實(shí)驗(yàn)題目:詞法分析 三.實(shí)驗(yàn)日期:2010.10 四.實(shí)驗(yàn)環(huán)境(操作系統(tǒng),開發(fā)語言) 操作系統(tǒng):Windows 開發(fā)語言:C 五.實(shí)驗(yàn)內(nèi)容(實(shí)驗(yàn)要求) a)將標(biāo)識(shí)符的詞法改為“以大寫字母或小寫字母開頭,后面可以跟大寫字 母或小寫字母或數(shù)字或下劃線”。 b)將<條件>中的表示相等關(guān)系的單詞“=”改為“= =” c)將原來的無小數(shù)的數(shù)改為可以有小數(shù)的數(shù) 六.實(shí)驗(yàn)步驟 a)打開VC++,找到getsym()項(xiàng)目。 int getsym() {...} 在getsym()函數(shù)中設(shè)置斷點(diǎn),F(xiàn)10逐過程調(diào)試 根據(jù)要求a修改為 if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z') 往后面看,修改while(ch>='a' && ch<='z' || ch>='0' && ch<='9' ||ch>='A' && ch<='Z' || ch=='_'); b)在檢測賦值符號(hào)的程序段中找到等號(hào) = 的判斷代碼,改變成為 = = 即 可。 c)在獲取整數(shù)數(shù)字的值的程序段后面添加判斷小數(shù)點(diǎn)的代碼。如果是,即 讀取符號(hào)并且按照小數(shù)的要求將其縮小并且累加到總的符號(hào)串中。 七.實(shí)驗(yàn)體會(huì)(包括收獲、心得體會(huì)、存在的問題及解決問題的方法、建議等) 通過實(shí)驗(yàn),如果要修改代碼的話,首先應(yīng)該讀懂源碼,在修改之前了解到程序段的功能是什么,然后再在相應(yīng)的行進(jìn)行修改添加,再進(jìn)行合理的調(diào)試。如果問題太過困難可以查詢資料或與同學(xué)進(jìn)行討論 八.實(shí)驗(yàn)結(jié)果(關(guān)鍵源程序) a) int getsym() { int i,j,k; while(ch==' '||ch==10||ch==9)/*忽略空格,換行和TAB*/{ getchdo; } if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')/*名字或保留字以a..zA。Z開頭*/{ k=0; do{ if(k { a[k]=ch; k++; } getchdo; }while(ch>='a' && ch<='z' || ch>='0' && ch<='9' || ch>='A' && ch<='Z' || ch=='_');// if(ch>='0'&&ch<='9')/*檢測是否為數(shù)字,以0..9開頭*/{ k=0; num=0; sym=number; do{ //435 num=10*num+ch-'0'; k++; getchdo; }while(ch>='0' && ch<='9'); if(ch=='.') { k++; sym=period; getchdo; sym=number; int div=10; do{num=num+(ch-'0')/div; k++; getchdo; div=div*10; }while(ch>='0'&&ch<='9'); } b) else { if(ch=='>')//檢測大于或大于等于符號(hào){ getchdo; if(ch=='=')//add by M { sym=geq;//構(gòu)成>= getchdo; } else { sym=gtr;//否則就是一個(gè)單獨(dú)的>號(hào)} } else { if(ch=='=') { getchdo; if(ch=='=') { sym=deq; getchdo; } else { sym=eql; } } c)else {if(ch == ’.’) {k=10; getchdo; do{num=num+(ch-'0')/k; k=k*10; getchdo; }while(ch>='0'&&ch<='9');} } 國際學(xué)院 0802 楊良燕 200819100227 《編譯原理》課程學(xué)習(xí)心得 《編譯原理》是計(jì)算機(jī)專業(yè)的一門重要課程,正如教材 第一章的引論所述,“編譯程序是現(xiàn)代計(jì)算機(jī)系統(tǒng)的基本組成部分之一”?!耙粋€(gè)編譯程序就是一個(gè)語言翻譯程序,語言翻譯程序把一種語言(源語言)書寫的程序翻譯成另一種語言(目標(biāo)語言)的等價(jià)程序”。 通過這一學(xué)期的學(xué)習(xí),我覺得編譯原理是一門理論性很強(qiáng)的課程,從文法和語言的概念到LL(1)文法和LR(0)文法的分析,幾乎都是對(duì)具體問題的抽象。因而,我們需要更多的時(shí)間來理解、掌握相關(guān)的知識(shí),當(dāng)然在這一過程中也存在很多問題,比如我們后期學(xué)習(xí)具體文法的分析方法時(shí),對(duì)于文法的概念不夠清晰,影響了上課的效率,知道老師再次給我們講解了文法等基礎(chǔ)的知識(shí)點(diǎn),我們才慢慢掌握后面所學(xué)的LL(1)文法等,也發(fā)現(xiàn)了知識(shí)點(diǎn)之間的關(guān)聯(lián)。此外,這門課程的課時(shí)被安排得很少,一周只有一次,這樣很不利于我們對(duì)這門重要課程的理解和掌握。但是我覺得我們很幸運(yùn),因?yàn)槔蠋熢谟邢薜恼n程中盡量將知識(shí)點(diǎn)以比較容易接受的方式給我們講解,教我們用簡單的方法理解記憶不同的知識(shí),對(duì)于我們提出的問題,無論課上或是課外,老師一直是不厭其煩,甚至利用課余時(shí)間為我們講解重要的難題。 編譯原理這門課程不僅僅在于其本身的理論價(jià)值,更在于為我們解決問題提供的思維方式和方法。從LL(1)到LR(0),問題不斷被解決的同時(shí),又有一個(gè)個(gè)新的問題提了出來。對(duì)計(jì)算機(jī)語言世界的知識(shí)積累,像滾雪球一樣越滾越大。這個(gè)逐漸遞進(jìn),逐漸解決問題的過程對(duì)我來說是收獲很大的。整個(gè)過程好像踏著前人研究編譯理論的路線,不斷感覺他們遇到的問題,更重要的是他們解決問題的思路。編譯原理的課程帶給我的不只是如何去編譯程序這樣的理論知識(shí),相信更重要的是一種如何“自動(dòng)計(jì)算”的思路。通過對(duì)相關(guān)編譯問題的具體分析,讓我體會(huì)最深的是一種“自動(dòng)計(jì)算”的思想,同時(shí)完成編譯試驗(yàn)后,更是感到了一種“自動(dòng)計(jì)算”的快樂?!比欢颐靼鬃约弘m然對(duì)編譯有了一定的了解,我懂得了文法的分析,學(xué)會(huì)了構(gòu)造確定和非確定有限自動(dòng)機(jī),學(xué)會(huì)了LL(1)文法和LR(0)文法等,但是并沒有完全掌握,對(duì)于這些知識(shí)點(diǎn)的實(shí)質(zhì)性和其他方面,更是認(rèn)識(shí)不深。作為一名學(xué)習(xí)計(jì)算機(jī)科學(xué)與技術(shù)的學(xué)生,我明白編譯原理是軟件工程的基礎(chǔ),課程的結(jié)束并不意味著學(xué)習(xí)的結(jié)束,只有通過以后的學(xué)習(xí),才能更深入地了解編譯原理。第二篇:編譯原理語法分析實(shí)驗(yàn)報(bào)告
第三篇:編譯原理--實(shí)驗(yàn)報(bào)告(小編推薦)
第四篇:《編譯原理》課程(詞法分析)實(shí)驗(yàn)報(bào)告
第五篇:編譯原理 學(xué)習(xí)心得