構造一個dfa_編譯程序?qū)儆谑裁窜浖㥮編譯程序構造
本文關鍵詞:編譯程序構造,由筆耕文化傳播整理發(fā)布。
1.題目:編譯程序構造 2.內(nèi)容:涉及詞法分析、自下而上語法分析程序的實現(xiàn):SLR(1)分析器的實現(xiàn)以及生成中間代碼。 3.具體要求 根據(jù)LR分析算法構造SLR(1)分析程序,并完成語法分析動作(當需要一個單詞時,調(diào)用詞法分析程序獲取),同時完成語義分析生成四元式輸出。要求程序具有通用性,改變文法時只需改變程序的數(shù)據(jù)初值,無需改變程序主體; (1)基本要求:完成1條說明語句、2條算數(shù)表達式和賦值語句的翻譯,生成中間代碼。 (2)高級要求:在完成基本要求的基礎上,實現(xiàn)if語句和布爾表達式的翻譯。if語句的文法和翻譯方案參見課本。 變量說明語句的文法及相應的語義子程序:.att表示數(shù)據(jù)類型屬性,fill函數(shù)表示將單詞id及其類別屬性填寫符號表。 (0)S→D; {acc} (1)D→int id { fill(id,int);D.att=int; } (2)D→float id {fill(id,float); D.att=float; } (3)D→D(1),id { fill(id,D(1).att);D.att=D(1).att; } 算數(shù)表達式和賦值語句的文法及相應的語義子程序。 (1)A→id=E; {p=lookup(id.name); emit(E.PALCE, , p);} (2)E→E(1)+T {E.PALCE=newtemp(); emit(+,E(1).PALCE,T.PALCE,E.PALCE)} (3)E→T {E.PALCE=T.PALCE;} (4)T→T(1)*F {T.PALCE=newtemp(); emit(+,T(1).PALCE,F(xiàn).PALCE,T.PALCE)} (5)T→F {T.PALCE=F.PALCE;} (6)F→(E) { F.PALCE=E.PALCE;} (7)F→id {P=LOOKUP(id.name) F.PALCE=P;} (8)F→num { P=LOOKUP(num.value) F.PALCE=P;} 構造其用于SLR(1)分析的識別活前綴的DFA以及action表和goto表。然后編程實現(xiàn)。(關于詞法分析部分只需識別出與此文法相關的單詞即可(+,*,(,),id,=))。 4.程序設計提示: (1)分析棧設計時可以用一個棧完成,也可以設計三個棧:一個符號棧,一個狀態(tài)棧,一個語義棧,則歸約時,則需要在符號棧中退掉n個符號,在狀態(tài)棧中退掉n個符號(n為產(chǎn)生式符號個數(shù)),,語義棧中退掉n個符號對應的語義; (2)終結(jié)符表和非終結(jié)符表的組織和預測分析程序中相同(將符號對應到一個數(shù)字,表示在分析表中對應的下標)。 (3)action表中的錯誤處理:簡化的錯誤處理:當查找action表出現(xiàn)空白時,則當前單詞無法移進和規(guī)約,可簡單的認為當前單詞為多余的單詞,則拋棄當前單詞,讀下一單詞繼續(xù)分析。 5.測試數(shù)據(jù): 作為程序測試數(shù)據(jù),以賦值語句area=r*r+r$作為測試輸入(源程序)。程序要求輸出二元式序列、符號表、語法分析過程、四元式序列。 假設AA.TXT的文件內(nèi)容如下: int area,r; r=1; area=r*r+r; 程序運行情況如下: 請輸入源文件名稱:E:\AA.TXT<回車> 語法分析過程如下: 狀態(tài)棧 符號棧 語義棧 動作說明 源程序?qū)亩饺缦拢? (int,-) (id,0) (,,-) (id,1) (;,-) (id,1) (=,) (num,0) (id,0) (=,) (id,1) (*,) (id,1) (+,) (id,1) (;,-) 符號表如下: Name type value addr 0 area int 1 r int 數(shù)字表如下 源程序?qū)乃脑叫蛄腥缦拢? (=,1, , r) (*,r,r,T1) (+,T1,r,T2) (=,T2,,area) 分析過程完成。 6.程序擴展要求 有能力的同學可將編譯程序擴展布爾表達式、if語句的分析和四元式生成,布爾表達式和if語句的翻譯參見教材。
本文關鍵詞:編譯程序構造,由筆耕文化傳播整理發(fā)布。
本文編號:53302
本文鏈接:http://www.wukwdryxk.cn/kejilunwen/jisuanjikexuelunwen/53302.html