編譯原理實驗全集_第1頁
編譯原理實驗全集_第2頁
編譯原理實驗全集_第3頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、文檔來源為:從網(wǎng)絡收集整理.word版本可編輯.歡迎下載支持目錄實驗1詞法分析錯誤!未定義書簽。1.1.目的 錯誤!未定義書簽。1.2.內(nèi)容 錯誤!未定義書簽。1.3.知識 錯誤!未定義書簽。1.4.步驟 錯誤!未定義書簽。1.5.問題及解答 錯誤!未定義書簽。1.6.實驗報告要求 錯誤!未定義書簽。實驗2自頂向下的語法分析 錯誤!未定義書簽。2.1.目的 錯誤!未定義書簽。2.2.知識 錯誤!未定義書簽。2.3.內(nèi)容 錯誤!未定義書簽。2.4.步驟 錯誤!未定義書簽。2.5.問題及解答 錯誤!未定義書簽。2.6.提高 錯誤!未定義書簽。2.7.實驗報告要求 錯誤!未定義書簽。實驗3自底向上的

2、語法分析 錯誤!未定義書簽。3.1.目的 錯誤!未定義書簽。3.2.內(nèi)容 錯誤!未定義書簽。3.3.步驟 錯誤!未定義書簽。3.4.問題 錯誤!未定義書簽。3.5.實驗報告要求 錯誤!未定義書簽。實驗4語義分析錯誤!未定義書簽。4.1.目的 錯誤!未定義書簽。4.2.知識 錯誤!未定義書簽。4.3.內(nèi)容 錯誤!未定義書簽。4.4.步驟 錯誤!未定義書簽。4.5.實驗報告要求 錯誤!未定義書簽。實驗5中間代碼生成實驗6代碼優(yōu)化與代碼生成相關說明實驗1、2要求獨立完成。實驗3、實驗4的實現(xiàn)代碼(VC+工程)均已調(diào)試成功,打包在目錄中(Iab3,lab4 )。希望認真學習的同學多看看。由于時間關系,

3、許多地方還沒來 得及做好,本手冊的內(nèi)容可能比較繁瑣。歡迎大家提出問題和意見。時間比較緊的同學也 請關注每個實驗末尾的實驗報告要求。期末實驗占10分。實驗1詞法分析1.1. 目的構(gòu)造詞法分析器,熟悉編譯程序詞法分析過程。掌握LEX自動生成工具的使用。1.2. 內(nèi)容從本實驗開始,用C語言實現(xiàn)一個編譯系統(tǒng)。詞法分析是其第一步。采用Lex工具自動生成大大簡化了其中的內(nèi)容。因此本實驗的重心并不在如何操作,而是在于怎樣編寫Lex源程序。而要編寫Lex源程序,首先要定義源語言,即該編譯系統(tǒng)所實現(xiàn)的語言。這里作為例子,我們以C+為基礎,采用其部分單詞,因此不妨將我們定義的這種語言稱之為Mini C+ 。1.3

4、. 知識Lex是一個詞法分析器的自動構(gòu)造工具。相關資料較多。1.4. 步驟1、在編寫LEX源程序前,首先要定義一種高級語言。找出其中所有單詞。并進行編碼。高級語言可以是已經(jīng)存在的一種語言,如,C,Pascal,Basic。也可以是自己構(gòu)造的一種語言。當然,考慮到后續(xù)實現(xiàn)的難度,可以簡化許多內(nèi)容。如不考慮數(shù)組,不考慮 For循環(huán)等。將定義好的單詞編碼用一個表表達出來。如我們這里的MiniC+的單詞定義如下:保留子內(nèi)部編碼運算符號if1+else2-while3*cout4/cin5*>>(輸入)6=<<(輸出)7<><=內(nèi)部編碼其他符號內(nèi)部編碼8(199

5、)2010211122122313=2414數(shù)字2515標識符2616527>=17var28<>18說明:(1) 由于只允許數(shù)字,所以不作變量類型。所有類型都是var。(2) 單詞編碼無任何約束,只要方便可行。要知道,我們構(gòu)造的是一個獨立的自包含的系統(tǒng)。所有的東西都是我們自己定義的。而編碼只是便于機器內(nèi)部識別。只要后面的語法分析,語義分析都按這個編碼即可。2、 將flex.rar展開在一個目錄中,如E:flex 。3、 根據(jù)上述單詞編碼編寫LEX源程序。LEX源程序是純文本文件,任何文本編輯器均具備這一功能(如用記事本打開即可)。保存時文件名任取。這里假設命名為LexDem

6、o.txt。為后續(xù)操作簡便,將該文件保存在E:flex子目錄中。4、編譯LEX源程序。生成 lexyy.c。5、 使用C語言環(huán)境打開lexyy.c。編譯運行,最終生成lexyy.exe。根據(jù)我們現(xiàn)有的情況,可以使用三種方案,任選其一。(建議使用命令行工具,實際上更簡單。)(1) 使用 VC建立一個工程(Project),將lexyy.c加入到該工程。實際上,最好拷貝lexyy.c到相應的目錄。然后編譯,產(chǎn)生的lexyy.exe文件在該工程目錄下的Debug子目錄中。(2) 使用VC的命令行工具。格式為:<VC的安裝路徑 >binCLlexyy.c女口: VC安裝在 "Pr

7、ogram Files "下。則命令為:D:"Program Files""Microsoft Visual Studio"VC98Bi nCL lexyy.c(3) 使用TC命令行工具。<TC 的安裝路徑 >binTCC lexyy.cD:TC20bi nTCC lexyy.c6、寫一段該語言測試代碼進行測試。如:While (i<2)Cout<<10;則輸出序列為:3, 019, 015, 07、根據(jù)單詞編碼序列對照上面的表進行驗證。(1) 每個單詞對應一對數(shù),第一個數(shù)為其編碼。第二個數(shù)為該單詞的附加屬性。如

8、無該屬性則置 0。( 2) 如單詞為標識符,其屬性應該為符號表的入口地址。但考慮到學詞法分析時, 還不熟悉符號表的機制,因而暫時也置 01.5. 問題及解答1、涉及到命令行操作,考慮到仍有許多同學對 DOS 命令不熟悉。希望自行加強。2、如 采用 Visual C+ 編譯,則先要建一個工程,將 lexyy.c 加入。3、如 果采用 TC 編譯,則建議用 TCC 命令行工具。4、由于 LEX 只能處理單字節(jié)的字符,請在 LEX 源程序中千萬不要用中文注釋。保存時一定要看清楚類型,必須是ANSI 類型。1.6. 實驗報告要求1、 目 的2、 內(nèi) 容( 1) 單詞及編碼定義(設計一種高級語言(或子集

9、)的單詞其編碼,見前面的 表)( 2) 部分 LEX 代碼( 3) 測試(寫出兩個測試句子:所有單詞正確,含有錯誤單詞的句子)3、 總 結(jié)(心得)實驗2自頂向下的語法分析2.1. 目的在詞法分析的基礎上,熟悉自頂向下的語法分析方法。體驗遞歸程序的特點。實現(xiàn)界面和業(yè)務邏輯代碼分離。實現(xiàn)異種平臺的訪問。培養(yǎng)初步的軟件架構(gòu)的觀念。培 養(yǎng)軟件設計及編程能力。2.2. 知識2.2.1 終結(jié)符、非終結(jié)符及產(chǎn)生式所有的組成最終句子的單詞即為終結(jié)符。非終結(jié)符代表的是我們觀念上的語法范疇。如主語。謂語,名詞等。在高級語言中,語法范疇包括程序、說明語句、可執(zhí)行語句、IF結(jié)構(gòu)、關系表達式、算術表達式等等。2.2.2

10、 語法及語義分析語法分析只要求驗證某個句子是否符合某個文法。關注的是結(jié)構(gòu)。而語義關注的是句子的含義。計算機本身無生命,無所謂真正地理解句子的含義。我們所期望的計算機執(zhí)行相應的語義是指:當計算機程序掃描到某個句子后,所執(zhí)行的操作恰好符合這個句子所表達的意思。如掃描到一個“3+2 ”這樣一個字符串。自動地把結(jié)果5算出來。而在語法分析中,所作的僅僅是判別這個句子的結(jié)構(gòu)是否合法。并不執(zhí)行計算。2.2.3 FIRST 集與 FOLLOW 集所謂FIRST集,本質(zhì)上就是第一個可能出現(xiàn)的符號構(gòu)成的集合。這個是可以由產(chǎn) 生式本身得到的。因為任何句子都是由該文法的產(chǎn)生式推出來的。2.2.4 關于遞歸下降子程序的

11、編寫規(guī)則(請注意規(guī)則和下面的顏色對應關系):(1)文法中的 每個非終結(jié)符 對應一個 過程(函數(shù))。(2)若某個非終結(jié)符有多個產(chǎn)生式候選,則根據(jù)當前輸入符是否在某個候選的Select集選擇。每個候選對應一個if分支。(3)選擇好候選之后,對產(chǎn)生式候選的右部的符號由左到右依次處理。 若為終結(jié)符。則將該符號和當前輸入符號進行判等操作。若相等,繼續(xù)。否則轉(zhuǎn) 若為非終結(jié)符,則調(diào)用該非終結(jié)符所對應的過程。 若當前掃描的符號為當前候選的第一個符號,且當前產(chǎn)生式有&候選.則不作出錯處理。否則均出錯處理 。例 1 : S (S)|achar str;/待檢查的串int ip;II掃描指針例 2 : S

12、(S)| &char str;II待檢查的串 int ip;II掃描指針void S() /只有一個非終結(jié)符Svoid S() /只有一個非終結(jié)符Sif(strip= ' / 處理 S (S)候選if(strip= ' ip+ ; S();ip+ ; S();if(strip= ' ' ip+;if(strip= ' ' ip+;else error();else error(); /不是第1個符號,出錯。else if(strip= '' / 處理 S a 候選else if(strip= ' ' ip+

13、;ip+; else/對應第1符號/不作出錯處理 。error(); /但無&候選項,必須出錯。需要注意的是,本例比較的是字符。而本實驗中用的是符號(單詞)編碼,是經(jīng)過詞法分析后的編碼。也就是后面定義的token數(shù)組相當于本例的str。這點變通能力希望大家有。關于這三條規(guī)則的具體運用,可看模板代碼。實現(xiàn)了兩個非終結(jié)符,其余的需要 同學們自己去實現(xiàn)。2.3. 內(nèi)容輸入輸出裝置(界面)輸入串詞法分析程序分析編碼及屬性表本實驗的目標是實現(xiàn)乘方幾種運算語法是否正確一個文本計算器的語法檢驗。要實現(xiàn)實數(shù)的加、 。這幾幣卜'運算構(gòu)成了'種優(yōu)先級。因此文法的減、乘、除、表達和課堂上不一

14、樣根據(jù)需要設計所有的非終結(jié)符。可以以產(chǎn)生式為核心。在設計的過程中逐步引入 非終結(jié)符。<E>T <L><A><A>f + <L><A><A>f - <L><A><A>£<L>-><M> <B><B>-> * <M> <B><B>-> / <M> <B><B>£<M <N> <C><C&g

15、t;f *<N> <C>/此括號非彼括號,故用引號括起來。/經(jīng)過詞法分析,數(shù)字被認為是終結(jié)符。<N>t“ ( “ <E>“)”<N>t $n um<N>f £非終結(jié)符定義符號定義符號定義<E>算術表達式<A>消除左遞歸的算術子表達式<L>優(yōu)先級為 3的子項<B>消除左遞歸且優(yōu)先級為3的子項<M>優(yōu)先級為 2的子項<C>消除左遞歸且優(yōu)先級為2的子項<N>優(yōu)先級為1的子項說明:優(yōu)先級的編號越小,其運算(歸約)的次序先。2.32 基于L

16、EX自動構(gòu)造器地詞法分析程序的重構(gòu)(任選)對于大型編譯系統(tǒng)而言,往往存在多遍掃描的可能性。將詞法分析程序構(gòu)造成獨 立的過程有很大的好處。但對于我們這個小型的文本計算器而言。將詞法分析構(gòu)造成依附于語法分析的子過程可能更加合理。因此我們需要對詞法分析程序進行重構(gòu)。本實驗只要求實現(xiàn)表達式的求值。因此,只需要使用原來集合的部分單詞。對詞法分析程序進行重構(gòu),使之成為語法分析程序的子程序。通過全局變量的方式加工數(shù)據(jù),輸入表達式串,輸出編碼及屬性序列,分別存放在兩個全局的整型數(shù)組中。因此需要作如下變更:(1)單詞的編碼在語法分析和詞法分析中都需要,因而同一集中在一個頭文件token.h中。以后,無論是詞法、

17、語法、語義分析,均用這套編碼。以下是部分語句:/*/*+*/*/#ifndef TOKEN/*終結(jié)符定義#defi ne $add 20#defi ne $sub 21*/#defi ne $assig n37/*=*/#defi ne $num38/*常數(shù)*/#defi ne $eps40/*£*/*非終結(jié)符定義*/*邏輯表達說明*/#defi ne _E113/*<E>算術表達式 */(2) 定義兩全局整型數(shù)tokens和attribs分別用于表示詞法分析后的單詞編碼和屬性對集。該定義在token.h中,其定義格式如下:#define MAXTOKEN100int t

18、okensMAXTOKEN;/* 單詞編碼序列,可容納 100 個*/int attribsMAXTOKEN;/* 單詞屬性編碼序列*/int ip;/* 當前符號 ( 單詞編碼 )指針*/#endif將上述 token.h 加入到 Lex 文件的第 1 部分,替換掉原來的定義。%#define YYSTYPEdouble#include <ctype.h>#include <stdlib.h>#include "types.h"#include "hash.h" #include "token.h" floa

19、t val=0;%( 3) 第 2 部分為正規(guī)式單詞的定義。實際這里只用到數(shù)字,也可以不變。寫入到( 4) 每掃描到一個單詞,對應的處理動作為:將該 單詞的編碼和屬性分別tokens 和 attribs 數(shù)組中。具體在 Lex 第 3 部分如下編程:"+" addToken($add,0);"-" addToken($sub,0);digits sscanf(yytext,"%f",&val); / 數(shù)字。將數(shù)字的值拷貝進整型變量 val 其中 addToken(int token, int attrib)函數(shù)定義在第 4 部

20、分:void addToken(int token,int attr) if(ip<MAXTOKEN) tokensip=token; attribsip=attr; ip+;( 建議大家統(tǒng)一再看看 expToken.txt 源文件。)lexyy()( 5) 主程序無需打開輸出文件,每掃描到一個單詞,系統(tǒng)會自動用相應的代碼塊, 即,調(diào)用 addToken 函數(shù)執(zhí)行相應的工作。這都在 Lex 自動生成的函數(shù) 內(nèi)部處理。因此語法分析主程序只需要調(diào)用 lexyy() 函數(shù)即可。自編代碼的詞法分析器構(gòu)造(任選)該程序相對而言較為簡單,以下列舉詞法分析主程序。詳細內(nèi)容見參考代碼。/ 從流中讀取一個

21、單詞 int lexyy() char ch=' 'if(bufChar=' ')while(isBlank(ch) ch=fgetc(stream); /跳過所有的空格回車else ch=bufChar; bufChar=' 'if(ch='+')/使用了超前搜索的情況/ 用空格清掉超期搜索字符。return $add;else if(ch='-')return $sub;else if(ch='*')return $mul;else if(ch='/')return $div;e

22、lse if(ch='(')return $llbr;else if(ch=')')return $lrbr;else if(ch='#')return $sharp;else if(isDigit(ch) bufChar=ch;wip=0;return readNum();于 curValue 變量。/超期搜索緩沖/ 單詞指針清 0/ 讀取整個數(shù)字, 返回數(shù)字的單詞編碼,而數(shù)字的值暫存elseerror(" 詞法錯誤 "); return 0;主程序的編寫void main() /*執(zhí)行詞法分析*/lexyy();/*執(zhí)行語

23、法分析*/E();/*調(diào)用開始符號所對應的過程進行分析。*/printf("語法正確.");/*如能執(zhí)行到這里,證明中途沒出錯*/若上述代碼放在LEX文件中,請把中文注釋去掉,同時保存類型設為ANSI。2.4. 步驟1、重構(gòu)詞法分析程序設計文法定義不回溯且考慮到三種優(yōu)先級的表達式計算的文法,前面是一參考實現(xiàn)。最好能根據(jù)要求獨立設計文法。2、建立C語言工程建立語法分析主程序文件,假定命名為:express.c。同時將該 token.h加入。3、編寫遞歸下降程序根據(jù)文法,按要求在express中編寫遞歸下降子程序。如感覺比較困難,請參照遞歸下降法。4、編寫測試主程序(基本要求)

24、構(gòu)造一命令行的輸入程序,即輸入表達式串。輸出語法分析成功與否。輸出結(jié)果 為“語法正確”“語法錯誤”。5、程序系統(tǒng)調(diào)試驗證結(jié)果2.5. 問題及解答請大家提出意見和建議,以便改進本手冊。2.6. 提高1、實現(xiàn)一個完整的高級語言子集。2、建立圖形界面,對本實驗內(nèi)容進行包裝。3、 選取針對某些結(jié)構(gòu)化文檔,如XML建立語法分析器。2.7. 實驗報告要求考慮到大家的實際情況,實驗報告只要求實現(xiàn)基于字符的分析過程。其提綱如下:1、目的2、內(nèi)容先介紹下該程序主要功能(1) 文法E T E ' E'=+TE £ T F T 'T'=*F T£ F (E)|i(

25、2) 遞歸下降過程(附上代碼)( 3 ) 測試用例3、總結(jié)(心得)實驗3自底向上的語法分析3.1. 目的1、掌握 SLR 法進行語法分析的原理。2、設計相應得數(shù)據(jù)結(jié)構(gòu)及編碼,實施算法的相關要素的機內(nèi)表示。3、 掌握語法分析器的設計與調(diào)試;3.2. 內(nèi)容1、算法的數(shù)據(jù)結(jié)構(gòu)( 1)分析表分析表采用二維持數(shù)組,其中第 0 行存放表頭。int atMAXROWMAXCOL;(2)堆棧/分析表由于符號棧與狀態(tài)棧通常同步操作,可將二棧合二為一。堆棧元素可用結(jié)構(gòu)體包裝相 應的數(shù)據(jù)。/代表非終結(jié)符和終結(jié)符 (由于符號棧和狀態(tài)棧均為同步操作。通過結(jié)構(gòu)體的方式實現(xiàn)堆棧 合并 )typedef struct Tch

26、ar name;/名稱 (便于外部輸出 )int code;/編碼 (便于內(nèi)部處理 )int state;/狀態(tài)int value;/該非終結(jié)符的值Token;/堆棧類型typedef struct S1 Token bodyMAXSIZE;/堆棧體int ip; TokenStack;( 3 )產(chǎn)生式的表示/棧頂指針/產(chǎn)生式候選記錄表 typedef struct Production char leftName;/左部名稱int leftCode;/左部編碼int rightLen;/右部長度,決定出棧數(shù)。 Prod;2、程序模塊的劃分(1)堆棧操作的相關函數(shù)( 2)分析表操作( 3 )主

27、分析過程/對一個輸入符號執(zhí)行分析/說明:由于堆棧集成為一個,所以堆棧操作可以不指出堆棧變量。int analysis(TokenStack *s,int code) int curState,curOp,pi;/當前狀態(tài),操作,產(chǎn)生式編號curState=getState(s);/獲取當前狀態(tài)curOp=getOperate(curState,code);/ 獲取當前操作if(curOp=-1) error(" 分析表中未定義 ");if(curOp=ACC) printf("n 輸入串正確 ");exit(0);else if(curOp>R)

28、pi=curOp-R;for(int i=0;i<ppi.rightLen;i+) / pop(s);/輸入串正確出口/歸約代碼/ 去掉 R 標識,得到產(chǎn)生式編號 查對應的產(chǎn)生式候選登記表/出棧。curState=getState(s); /獲取當前棧頂狀態(tài)。 curOp=getOperate(curState,ppi.leftCode); /查 Goto 表獲取跳轉(zhuǎn)的狀態(tài)。/ 符號棧入棧 ./狀態(tài)入棧(即查Goto表對應的值,所以G與S必須相等)/( 語法分析階段:不考慮語義,故value 參數(shù)為 0)push(s,ppi.leftName,ppi.leftCode,curOp-S,0

29、);outputStacks(s);opState=0;/當前為歸約狀態(tài)else if(curOp>S) /Si 入棧push(s,getName(code),code,curOp-S,0); / 當前符號、狀態(tài)入棧outputStacks(s); opState=1;else/當前為移進狀態(tài)error(" 語法錯誤 !");/return 0;(4)主程序及輸入輸出(5)錯誤處理3、測試要求(1) 成功的輸入串(2)詞法錯誤串(3)語法錯誤串3.3. 步驟1、建立 C 語言工程2、加入單詞編碼頭文件。3、編寫相關代碼4、在命令行下運行,進行測試。3.4. 問題時間關

30、系,許多地方還沒來得及作好,但歡迎大家提出問題。3.5. 實驗報告要求1、目的2、內(nèi)容( 1) 數(shù)據(jù)結(jié)構(gòu)設計:文字描述,不要求寫代碼( 2) 主要模塊: 主分析過程 ( 代碼或流程圖 ) 堆棧操作:push、pop(將函數(shù)名寫出) 分析表操作: (將函數(shù)名寫出) 詞法分析輔助過程: (將函數(shù)名寫出) 輸入輸出及錯誤處理: (將函數(shù)名寫出)(期末考試實驗占 10 分。其中本實驗將根據(jù)內(nèi)容記分,并直接記入期末成績???參考所附代碼,如自己有另外實現(xiàn)也可,需提交代碼)( 3 ) 測試: 語法正確的表達式。 語法錯誤的表達式。 詞法錯誤的表達式。3、總結(jié)(心得)實驗 4 語義分析4.1. 目的1、屬性

31、文法及語法制導翻譯和遞歸下降的語法分析結(jié)合,構(gòu)造語義分析程序。2、以表達式文法為例,構(gòu)造文本計算器演示程序。4.2. 知識1、設計屬性文法。以一個例子加以說明:考察文法 G(E): ET LL+ T L|T$num我們可以從以下幾個方面去理解。( 1) 下標的含義首先考慮到產(chǎn)生式中不止一個E,在語法分析中由于在不同的時間不同的地方處理,因而不會產(chǎn)生歧義。但在語義分析中,任何一個符號的屬性都可在上下文中出現(xiàn),因而有 必要加以區(qū)分。通常通過設置下標的方式來區(qū)分。L +TL 1有了下標 L 和 L1 就能加以區(qū)分??梢赃@么說,L、L1 不是“同個”非終結(jié)符,但是是“同類”非終結(jié)符。因此,屬性文法設計

32、的第一步就是把同一產(chǎn)生式候選中的相同符號加以下標。(2)屬性的設計屬性是為每個符號配置的。終結(jié)符得屬性通常通過詞法分析得到。非終結(jié)符的屬性通 常為上下文的屬性計算得到。首先考慮全局的,即整個文法最終要求什么。將其數(shù)據(jù)化作為開始符號得屬性。在上例中,表達式最終是求若干個數(shù)之和的結(jié)果值。 因此為非終結(jié)符 E配備一個屬性s,表示E 所展開的子表達式的值。再考慮葉子結(jié)點能夠獲取到什么信息。葉子都是終結(jié)符,信息實際上是通過詞法分析 獲取的單詞語義。 如“2”,分析程序掃描到文本字符“ 2”,將其轉(zhuǎn)換成二進制的值2。但在語法分析中,只是將其解釋為“數(shù)字” ,用 $num 表示。而二進制的值 2 只是作為

33、$num 的一個屬性 ,不妨記為 $num.v 。最后考慮語法樹中的支干結(jié)點需要傳遞些什么數(shù)據(jù), 根據(jù)相應的數(shù)據(jù)定義相應的屬性。 設計屬性時,必須明確兩點:3、支干(非葉子,非根)結(jié)點的屬性主要功能是傳遞數(shù)據(jù)和中間計算。要按樹的遍歷順 序來考慮。因為無論是自頂向下還是自底向上,本質(zhì)上都是對樹的一次遍歷(這點在 上課實講過) 。4、 一個結(jié)點可以有多個屬性。本例中,非終結(jié)符L結(jié)點不僅負責傳遞屬性,還要完成計i表示輸入屬性,算。定義兩個屬性變量,2+ 3 + 5的屬性文法語法樹(3) 屬性的計算規(guī)則設計規(guī)則: 根據(jù)實例語法樹,考慮其自左至右遍歷的順序。分析其數(shù)據(jù)傳遞和計算方法。 結(jié)合產(chǎn)生式。將傳遞

34、和計算規(guī)則提煉到產(chǎn)生式中。如上例,設計的屬性文法如下:E T L.i=T.s L E.s=L.sL + T L i.i=L.i+T.s L 1 L.s=L 1 .sL £ L. s=L.iT $num T.s=$ nu m.v5、如何根據(jù)屬性文法設計遞歸下降子程序關于遞歸下降的語義分析,清華版的教材沒有提及。國防科大版的教材有初步的介紹。 這里以一個簡單的例子說明如何實現(xiàn)。繼續(xù)考察上例,即將表達式中的加法單獨抽取出來,其語義就是加法。(1) 每個非終結(jié)符對應一個過程(2) 繼承屬性作為輸入?yún)?shù)(3) 綜合屬性作為返回值如:E->T L.i=T.s L E.s=L.sfloat E() float Ts,Ls;/Ts,Ls分別表示 T.s、L.兩個屬性Ts=T();Ls=L(Ts);return Ls;4.3. 內(nèi)容本實驗的主要內(nèi)容在于實現(xiàn)一個文本計算器。1、 屬性文法設計 由于使用了遞歸下降的語法分析,則必須考慮是否為 LL 文法。針對表達式文法,需 要選用消除了左遞歸的文法。根據(jù)教材上的版本進行改造,考慮了四則混合運算的情況。 設計文法如下:E T L.i=T.s L E.s=L.sL + T L 1.i=L.i+T.s L 1 L.s=L 1.sL - T L 1.i=L.i-T.s L1 L.s=L1.sL £ L.s=L.iT F

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論