freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

[工學(xué)]編譯原理課程設(shè)計(jì)報(bào)告-展示頁

2025-04-20 22:24本頁面
  

【正文】 無需錯(cuò)誤檢查,只需按如下步驟進(jìn)行:vEnv和tEnv分別用BeginScope進(jìn)入新的符號(hào)表翻譯定義部分 (let…in 之間), 樹結(jié)點(diǎn)連接翻譯體部分 (in…end 之間)vEnv和tEnv用EndScope返回到原符號(hào)表如果體部分為空或者沒有返回值,如果體部分不空或有返回值, 將定義和體部分連接,把體部分的返回值和類型作為最終的返回值和類型SeqExp無需錯(cuò)誤檢查,因?yàn)樗侨舾蓚€(gè)已經(jīng)檢查過的表達(dá)式的鏈分別將每個(gè)子表達(dá)式進(jìn)行翻譯,用 在翻譯最后一個(gè)表達(dá)式時(shí):如果它的類型是VOID,則仍用bine2stm 將它們的IR 樹結(jié)點(diǎn)連接起來,并返回VOID 作為返回類型否則, 將它們的IR 樹結(jié)點(diǎn)連接并返回最后一個(gè)表達(dá)式的值和類型作為返回值和返回類型SimpleVar先檢查vEnv, 若沒找到變量名或類型不是VarEntry則報(bào)告變量未定義SubscriptVar如果它除去下標(biāo)部分后的類型不是數(shù)組類型,則報(bào)錯(cuò)若下標(biāo)部分不是int類型報(bào)錯(cuò)FieldVar若除去域部分后不是記錄類型,則報(bào)錯(cuò)然后逐個(gè)查找記錄的域,如果沒有一個(gè)匹配當(dāng)前域變量的域,則報(bào)錯(cuò)NameTy檢查tEnv,若沒有發(fā)現(xiàn)類型,則報(bào)告未知類型錯(cuò)誤ArrayTy檢查tEnv,若沒有發(fā)現(xiàn)類型,則報(bào)告未知類型錯(cuò)誤,否則返回轉(zhuǎn)換后的ARRAY 類型RecordTy檢查該記錄類型每個(gè)域的類型在tEnv中是否存在,若否,則報(bào)告未知類型錯(cuò)誤若全部正確,則最后返回轉(zhuǎn)換后的RECORD 類型下面是聲明的檢查,在這個(gè)階段可以不需要返回值VarDec如果有顯式的類型聲明,按AssignExp的方法檢查是否類型匹配若無顯式的類型聲明且初始值為nil,則報(bào)錯(cuò),因?yàn)橹挥杏涗涱愋涂梢杂胣il初始化若無初始值,報(bào)錯(cuò),因?yàn)門iger語言所有的變量聲明必須有初始化如果沒有以上錯(cuò)誤,則為變量在幀上分配空間把變量作為VarEntry添加到vEnv中變量聲明不采用塊機(jī)制,而是在任何地方都直接覆蓋TypeDec1 Tiger 語言的類型聲明采用塊機(jī)制(見第二部分),所以要先在一個(gè)聲明塊中檢查否有重復(fù)的聲明(而在不同的塊中可以有重復(fù)的聲明的,新的將沖掉舊的),若有,報(bào)告重定義錯(cuò)誤(具體實(shí)現(xiàn)時(shí)可采用HashSet類)2 接下來翻譯出實(shí)際的Type 類型 ( 方法) ,再?gòu)膖Env 中查找出NAME類型,將實(shí)際的Type類型綁定到NAME類型3 檢測(cè)循環(huán)定義問題 ()4 如果以上均正確,添加類型到tEnv中FunctionDec函數(shù)聲明同樣采用塊機(jī)制. 對(duì)于函數(shù)聲明塊中的每個(gè)聲明,做以下檢查1~5:1 同類型聲明類似,先檢查聲明塊中是否有重復(fù)的聲明2 還要檢查是否與標(biāo)準(zhǔn)函數(shù)沖突,可以通過掃描vEnv 中的StdFuncEntry 實(shí)現(xiàn),若有報(bào)錯(cuò)3 然后檢查參數(shù)列表,與記錄類型RecordTy的檢查完全相同,得到RECORD 類型的形參列表4 接著檢查函數(shù)返回值,如果沒有返回值則設(shè)置成void5 無誤后,為函數(shù)創(chuàng)建新層,將函數(shù)作為FuncEntry添加到vEnv中然后再重新掃描一遍聲明,如果某函數(shù)不是標(biāo)準(zhǔn)函數(shù),則做以下操作1~5:1 用BeginScope進(jìn)入vEnv的一張子表(函數(shù)內(nèi)部用),并轉(zhuǎn)移到新層2 將函數(shù)參數(shù)存入子表3 翻譯函數(shù)體, 并用ProcEntryExit給函數(shù)體加上關(guān)于函數(shù)調(diào)用的指令4 檢查函數(shù)體的返回類型是否和聲明部分匹配,若否則報(bào)錯(cuò)5 用EndScope退出子表,轉(zhuǎn)移到當(dāng)前層 問題解決 循環(huán)定義問題Env中有一個(gè)類型為L(zhǎng)oopEnv的變量loopEnv,這是用來判斷當(dāng)前的Semant翻譯狀態(tài)是否處于循環(huán)體中。 Type包類圖Type類的coerceTo函數(shù)描述了關(guān)于類型的強(qiáng)制轉(zhuǎn)換部分的信息: 除了nil類型可以賦值給record類型外,其它只能轉(zhuǎn)換到本身,且不能將nil賦值給nil。ExpTy: ,在Semant類中對(duì)Absyn包中的表達(dá)式進(jìn)行翻譯,即返回帶類型的表達(dá)式ExpTy。LoopEnv: 主要用于在分析時(shí)判斷是否處于循環(huán)當(dāng)中,具體詳見本章的問題解決。vEnv記錄了當(dāng)前的變量、函數(shù)等信息,是符號(hào)-入口表。VarEntry: 派生自Entry,用于普通變量LoopVarEntry: 派生自Entry,用于循環(huán)變量StdFuncEntry: 派生自Entry,用于庫函數(shù)FuncEntry: 派生自Entry,用于普通函數(shù)Env: 環(huán)境符號(hào)表, tEnv和vEnv。4 Semant包Semant包主要包括了和語義分析有關(guān)的類。檢查通過則交給接下來的中間代碼生成模塊產(chǎn)生中間代碼樹(IRTree)。 :}。 :}。 :}。 :}。 下標(biāo)變量的規(guī)約沖突[3]可以被規(guī)約成x.(a[3])。expr ::= ID:id LPAREN RPAREN {: RESULT= new CallExp(idleft,idright,sym(id),null)。如函數(shù)調(diào)用:expr ::= ID:id LPAREN expr_list:e RPAREN {: RESULT= new CallExp(idleft,idright,sym(id),e)。特別的,將ELSE和THEN設(shè)置為又結(jié)合可以很好的解決ifelse二義性的問題。precedence left LBRACK。precedence left UMINUS。precedence left PLUS, MINUS。precedence left LPAREN。precedence left OR。precedence right DO, ELSE, THEN。precedence right FUNCTION,TYPE。 詳見附錄B。 運(yùn)行后將生成兩個(gè)java文件:。 Absyn包Absyn包中包含了抽象語法樹的結(jié)點(diǎn)。注意,()之后父符號(hào)表的內(nèi)容依然可見,()之后子符號(hào)表的內(nèi)容將被刪去。() 在當(dāng)前符號(hào)表中新建一個(gè)子符號(hào)表。 (Symbol, Object) 將“符號(hào)-對(duì)象”序?qū)Ψ湃氘?dāng)前符號(hào)表中。3 Symbol包Symbol包中封裝了符號(hào)()和符號(hào)表()。首先寫出對(duì)應(yīng)語法,而后利用java_cup來生成對(duì)應(yīng)的自動(dòng)機(jī)。語法分析的中心思想依然是有窮自動(dòng)機(jī)。} \\({WhiteSpace}|{LineTerminator})+\\ {}.|\n {}} 用到的開關(guān)量%line和%column兩個(gè)開關(guān),JFlex就會(huì)在掃描時(shí)維護(hù)兩個(gè)變量yyline和yycolumn表示當(dāng)前掃描到的行與列,這在報(bào)錯(cuò)時(shí)可以用到。 int num=(int)temp64。 else err(The escape sequence +yytext()+is out of the range)。amp。} \\[:digit:][:digit:][:digit:] {int d=new Integer(yytext().substring(1,4))。\\39。)。}\\\ {(39。\n39。)。}\\t {(39。return tok(,())。若符合則進(jìn)行轉(zhuǎn)義,否則報(bào)錯(cuò)。典型如\n \t \ \\ 則直接進(jìn)行轉(zhuǎn)義處理。當(dāng)讀入”時(shí)進(jìn)入。繼續(xù)讀入若讀入/*則計(jì)數(shù)器count++;若讀入/*則count;并判斷當(dāng)前count值,若等于0則退出COMMENT狀態(tài)。 問題解決 多重注釋在yylex中新加入一個(gè)狀態(tài)COMMENT。由于本工程早期是在Linux下進(jìn)行的,所以我下載的是tar格式的壓縮包,再執(zhí)行以下指令進(jìn)行安裝:tar C /zzx1989/ xvzf ln s /zzx1989/JFlex/bin/jflex /usr/bin/jflex運(yùn)行是運(yùn)行如下指令:jflex 。12 安裝詞法分析工具JFlexJFlex是java語言環(huán)境下非常好用的一款詞法分析工具,本章中所有有關(guān)JFlex的操作均參考自《JFlex User39。 項(xiàng)目完成情況基本上符合原計(jì)劃,現(xiàn)已完成最終的目標(biāo)代碼生成,可以將較復(fù)雜的tiger程序編譯MIPS匯編文件,并在模擬器上正確運(yùn)行。每個(gè)模塊的實(shí)現(xiàn)方法將在接下分章節(jié)詳述。 課程設(shè)計(jì)所用語言JAVA 課程設(shè)計(jì)參考“虎書”《Modern piler implementation in JAVA,1st edtion》 實(shí)驗(yàn)環(huán)境(工具)Java 開發(fā)環(huán)境: Eclipse詞法分析器: JFlex語法分析器: CUPMIPS模擬器:PCSPIM 設(shè)計(jì)模塊編譯器的設(shè)計(jì)涉及到很多方面,可分為多個(gè)模塊,從前端(詞法分析)到后端(目標(biāo)代碼生成)依次完成。編譯原理課程設(shè)計(jì)上海交通大學(xué)編譯原理課程設(shè)計(jì)報(bào)告Tiger編譯器的設(shè)計(jì)與實(shí)現(xiàn)張至先 5080309910 目錄1. 介紹 32. 詞法分析 53. 語法分析 74. 語義分析 115. 中間代碼生成 186. 匯編指令選擇 247. 寄存器分配 298. 生成匯編代碼 359. 感想 3610. 附錄A 3711. 附錄B 4112. 附錄C 4613. 附錄D 4714. 附錄E 5515. 附錄F 5716. 附錄G 參考文獻(xiàn) 63 1. 介紹本課程設(shè)計(jì)旨在實(shí)現(xiàn)一個(gè)Tiger語言的編譯器。 Tiger語言規(guī)范詳見《Tiger Language Reference Manual》。具體如下(按完成先后順序):1. 詞法分析2. 語法分析3. 語義檢查4. 中間代碼生成5. 代碼規(guī)范化6. 匯編指令選擇7. 寄存器分配8. 目標(biāo)代碼生成9. 程序運(yùn)行。 Tiger編譯器模塊流程圖 項(xiàng)目時(shí)間安排本學(xué)期第十周開始啟動(dòng)該項(xiàng)目,第十四周完成詞法分析和語法分析(本項(xiàng)目的前兩個(gè)模塊),第十七周完成至寄存器分配之前,第十八周完成工程及課程設(shè)計(jì)文檔,第十九周提交檢查。 2. 詞法分析將源程序字符串讀入,利用了有窮自動(dòng)機(jī)原理將其按照詞法規(guī)則分割為符號(hào)單元,實(shí)現(xiàn)詞法分析程序由工具JFlex生成。s Manual》。 詳見附錄A。當(dāng)讀入/* 時(shí)進(jìn)入此狀態(tài)并設(shè)置一個(gè)計(jì)數(shù)器count。 轉(zhuǎn)義字符轉(zhuǎn)義字符位于字符串中,首先設(shè)定有STRING狀態(tài)。而后對(duì)轉(zhuǎn)義字符進(jìn)行處理。對(duì)于\121等轉(zhuǎn)義字符,則先讀入判斷其數(shù)字大小是否屬于[0,255]中。具體代碼如下:STRING{\ {yybegin(YYINITIAL)。}[^\n\t\\\]+ {(yytext())。\t39。}\\n {(39。)。\39。}\\\\|\\ {(39。)。 if(d=0amp。d=127) ((char)d)。 }\\\^([AZ]||[|\|]|\^|_) {char temp=yytext().charAt(2)。 ((char)num)。 3. 語法分析這個(gè)模塊的目的是以詞法分析的結(jié)果作為輸入,進(jìn)行語法分析,輸出抽象語法樹。根據(jù)LR語法,將對(duì)應(yīng)的語法用實(shí)現(xiàn)其相應(yīng)自動(dòng)機(jī)。依次讀出lexer中的詞法單元,而后在自動(dòng)機(jī)的控制下按照語法逐漸規(guī)約,并在規(guī)約過程中通過result的傳遞得到對(duì)應(yīng)的語法樹,而后將抽象語法樹輸出。常用的函數(shù)有: (String) 靜態(tài)函數(shù),如果字符串表示的符號(hào)存在,則返回原來的符號(hào),否則新建一個(gè)與字符串對(duì)應(yīng)的符號(hào)。 (Symbol) 返回當(dāng)前符號(hào)表中符號(hào)所對(duì)應(yīng)的對(duì)象。() 退回到上一級(jí)符號(hào)表。符號(hào)()和符號(hào)表()將在接下來的模塊中用到。 Absyn包中的類圖(1) Absyn包中的類圖(2) Absyn包中的類圖(3) Absyn包中的類圖(4) Absyn包中的類圖(5) Java cup的使用javacup目錄提示符下輸入: java expect 2 其中參數(shù) expect 2 表示至多2個(gè)沖突(規(guī)約-移進(jìn)或規(guī)約-規(guī)約是允許的),在這種情況下,javacup將使用移進(jìn)代替規(guī)約,遇到規(guī)約-規(guī)約沖突時(shí)采用高優(yōu)先級(jí)。parser為分析器,sym為常數(shù)表。 問題解決 優(yōu)先級(jí)定義在開始文法規(guī)則之前,javacup允許定義終結(jié)符號(hào)的優(yōu)先級(jí)和結(jié)合情況。precedence right OF。precedence nonassoc ASSIGN。precedence left AND。precedence nonassoc LE, GT, EQ, NEQ, GE, LT。precedence left TIMES, DIVIDE。precedence left LBRACE。在這里,優(yōu)先級(jí)為由低到高排列,left/right/nonassoc表明其結(jié)合情況。 參數(shù),表達(dá)式列表可以為空因此應(yīng)當(dāng)把為空的情況分別單獨(dú)列出來考慮。 :}。 :}。解決的辦法是:lvalue ::= ID:id1 DOT ID:id2 {: RESULT= new FieldVar(id2left,id2right,new SimpleVar(id1left,id1right,sym(id1)),sym(id2))。lvalue ::= lvalue:l DOT ID:id {: RESULT= new FieldVar(idleft,idright,l,sym(id))。lvalue ::= lvalue:l LBRACK expr:e RBRACK {: RESULT= new S
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1