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

正文內(nèi)容

編譯原理課程設(shè)計(jì)ll遞歸下降分析器(更新版)

  

【正文】 stant a* * opr 0,a: execute operation a* * lod l,a: load variable l,a* * sto l,a: store variable l,a* * cal l,a: call procedure a at level l* * int 0,a: increment tregister by a* * jmp 0,a: jump to a* * jpc 0,a: jump conditional to a* *******************************************/typedef struct{ alfa name。// 三種標(biāo)識(shí)符的類(lèi)型 typedef enum {LIT,OPR,LOD,STO,CAL,INT,JMP,JPC} fct。// length of identifiers 標(biāo)示符的最大長(zhǎng)度const int nmax = 14。通過(guò)前面記錄下的jpc指令的位置,把它的跳轉(zhuǎn)位置改成當(dāng)前的代碼段指針位置,否則沒(méi)遇到else,那么此時(shí)的當(dāng)前代碼段分配指針的位置也是上面jpc指令的轉(zhuǎn)移位置,也是通過(guò)前面記錄下的jpc位置指令的位置,把它的跳轉(zhuǎn)到當(dāng)前的代碼段指針位置。除此之外,還有出錯(cuò)報(bào)告過(guò)程(Error)、代碼生成過(guò)程(Gen)、測(cè)試單詞合法性及出錯(cuò)恢復(fù)過(guò)程(Test)、登錄名字表過(guò)程(Enter)、查詢(xún)名字表函數(shù)(Position)以及列出類(lèi) PCODE代碼過(guò)程(Listcode)作過(guò)語(yǔ)法分析的輔助過(guò)程。如果這個(gè)字符是字母,則繼續(xù)獲取字符或數(shù)字,最終可以拼成一個(gè)單詞,查保留字表,如果查到為保留字,則把SYM變量賦成相應(yīng)的保留字類(lèi)型值;如果沒(méi)有查到,則這個(gè)單詞應(yīng)是一個(gè)用戶(hù)自定義的標(biāo)識(shí)符(可能是變量名、常量名或是過(guò)程的名字),把SYM置為IDENT,把這個(gè)單詞存入ID變量。四、實(shí)驗(yàn)分析PL/0語(yǔ)言編譯程序采用以語(yǔ)法分析為核心、一遍掃描的編譯方法。(2)擴(kuò)充條件語(yǔ)句的功能使其為:IFTHEN[ELSE](3)增加repeat重復(fù)語(yǔ)句: REPEAT{。此外,由于在做報(bào)告的時(shí)候,需要描繪DFA和程序流程圖,使得自己初步掌握了使用visio和word畫(huà)圖的能力。在編寫(xiě)過(guò)程中,還有一類(lèi)問(wèn)題,就是存在公共左因子,如文法expression→ var = expression | simpleexpression,左因子為ID,在分析過(guò)程中,由于已經(jīng)取出了一個(gè)ID的Token,且生成了一個(gè)IdK的節(jié)點(diǎn),但是在當(dāng)前狀態(tài)無(wú)法確定是哪一個(gè)推導(dǎo),然而IdK節(jié)點(diǎn)已經(jīng)生成,又無(wú)法回退,并且是使用自頂向下的分析方法,已經(jīng)生成的IdK在程序上方無(wú)法使用,自己通過(guò)查閱資料等途徑的學(xué)習(xí)確定了在這種情形下的處理方式:將已經(jīng)生成的IdK節(jié)點(diǎn)傳到下方的處理程序,所以TreeNode * simple_expression(TreeNode * k)、TreeNode * additive_expression(TreeNode * k)等函數(shù)都被設(shè)計(jì)成有節(jié)點(diǎn)類(lèi)型參數(shù)的函數(shù),目的就是將已經(jīng)生成的節(jié)點(diǎn)傳到下面的分析函數(shù)中去。經(jīng)過(guò)揣摩書(shū)上的例子,自己理解和掌握了怎么設(shè)計(jì)過(guò)濾注釋和分析程序中Token的DFA,于是開(kāi)始根據(jù)設(shè)計(jì)好的DFA進(jìn)行編碼,最后經(jīng)過(guò)調(diào)試已經(jīng)可以正確地完成詞法階段的任務(wù)了。明白任務(wù)的要求和內(nèi)容224。錯(cuò)誤信息在語(yǔ)法分析,語(yǔ)義分析,符號(hào)表檢錯(cuò)中添加。(2)程序中需要用到的主要變量為type和number 掃描子程序的算法思想:首先設(shè)置3個(gè)變量: [在此處鍵入]①token用來(lái)存放構(gòu)成單詞符號(hào)的字符串; ②number用來(lái)整型單詞;③type用來(lái)存放單詞符號(hào)的種別碼。[在此處鍵入] 詞法分析模塊 Lexical類(lèi)主要的工作是詞法分析獲取Token序列。Grammer類(lèi)的主要工作是根據(jù)Lexical類(lèi)詞法分析之后的Token進(jìn)行語(yǔ)法分析,生成語(yǔ)法樹(shù),最后并輸出語(yǔ)法樹(shù)。將不翻譯的注釋等符號(hào)先濾掉,只保留要翻譯的符號(hào)串,即要求設(shè)計(jì)一個(gè)供詞法分析調(diào)用的預(yù)處理子程序;; [在此處鍵入](種別碼,屬性值,行號(hào))。、體會(huì)和建議。return flag。for(int i = 0。){ temp = temp + ()。}} else { if(a == 39。if(a == 39。// (”關(guān)系符“+temp)。} //(”關(guān)系符“+temp)。} }}// (”數(shù)字:“+temp)。)|| (39。)){ temp = temp + ()。} }} else if((a)){ temp = temp + ()。j++。while(j ){ a = code[j]。()。foreach(string id in bsf){ (id)。i 。namespace LexicalAnalysis { class Program { static string[] keys = { “static”, “true”, “return”, “string”, “Length”, “break”, “Console”, “WriteLine”, “bool”, “false”, “ture”, “void”, “if”, “else”, “while”, “int”, “float”, “for”, “enum”, “default”, “case”, “double”, “do” }。詞法分析器的任務(wù)是把構(gòu)成源程序的字符流翻譯成詞法記號(hào)流。缺點(diǎn)是對(duì)文法要求高,必須是LL(1)文法,同時(shí)由于遞歸調(diào)用較多,影響分析器的效率。本人因?yàn)樯险n無(wú)法做到打醒十二分專(zhuān)心聽(tīng)課,經(jīng)常會(huì)分神,所以學(xué)習(xí)的效果也不怎么好?!?FT39。cout^”TE39。+39。void e1()。算術(shù)表達(dá)式文法如下: EE+T|ET|T TT*F|T/F|F F(E)| i 首先改寫(xiě)文法為L(zhǎng)L(1)文法;然后為每一個(gè)非終結(jié)符,構(gòu)造相應(yīng)的遞歸過(guò)程,過(guò)程的名字表示規(guī)則左部的非終結(jié)符;過(guò)程體按規(guī)則右部符號(hào)串的順序編寫(xiě)。即,若A174。如果我們走了一大段錯(cuò)路,最后必須回頭,那么,就應(yīng)把已經(jīng)做的一大堆語(yǔ)義工作(指中間代碼產(chǎn)生工作和各種表格的簿記工作)推倒重來(lái)。按照語(yǔ)法分析樹(shù)的建立方法,我們可以粗略地把語(yǔ)法分析辦法分成兩類(lèi),一類(lèi)是自上而下分析,另一類(lèi)是自下而上分析法。我們知道,語(yǔ)言的語(yǔ)法結(jié)構(gòu)是用上下文無(wú)關(guān)文法描述的。其次,由于回溯,就碰到一大堆麻煩問(wèn)題。對(duì)于文法中每一個(gè)非終結(jié)符A的各個(gè)產(chǎn)生式的候選首集符兩兩不相交。概要設(shè)計(jì)編程實(shí)現(xiàn)給定算術(shù)表達(dá)式的遞歸下降分析器。//判斷輸出信息 void e()?!眪void t(){} if(inputstream[temp]==39。){} else right=0。){} else cout/FT39。如果上課沒(méi)有好好的認(rèn)真聽(tīng)課,自己獨(dú)自學(xué)習(xí)就感到非常的吃力,而且效果也不好。通過(guò)本次課程設(shè)計(jì)清楚地了解到遞歸下降分析法的優(yōu)缺點(diǎn),其優(yōu)點(diǎn)是簡(jiǎn)單、直觀,易于構(gòu)造分析程序。構(gòu)成詞法分析器的一種簡(jiǎn)單方法是用狀態(tài)轉(zhuǎn)換圖來(lái)描述源語(yǔ)言詞法記號(hào)的結(jié)構(gòu),然后手工把這種狀態(tài)轉(zhuǎn)換圖翻譯成為識(shí)別詞法記號(hào)的程序。using 。//路徑,并存入datafor(int i = 0。//輸出所有的標(biāo)識(shí)符()。}(“算數(shù)運(yùn)算符,輸入回車(chē)”)。int j = 0。while((a)){ temp = temp + ()。(temp)。.39。E39。a = code[j]。a = code[j]。a = code[j]。a = code[j]。(temp)。*39。}} } }//判斷是不是保留字的IsKey方法static bool isKey(string key){bool flag = false。// (flag+”是不是key)。通過(guò)此次課程設(shè)計(jì),提高了我們的獨(dú)立分析問(wèn)題、解決問(wèn)題的能力,以及系統(tǒng)軟件設(shè)計(jì)的能力; 提高程序設(shè)計(jì)能力、程序調(diào)試能力,團(tuán)結(jié)協(xié)作能力關(guān)鍵詞:詞法分析,語(yǔ)法分析,四元式生成,錯(cuò)誤處理,符號(hào)表生成,語(yǔ)義動(dòng)作插入,中間代碼優(yōu)化,生成目標(biāo)代碼 [在此處鍵入]目錄摘要 設(shè)計(jì)任務(wù) 設(shè)計(jì)要求(流程) 詞法分析模塊 功能 數(shù)據(jù)結(jié)構(gòu) 算法 語(yǔ)法分析模塊 數(shù)據(jù)結(jié)構(gòu) 符號(hào)表模塊 數(shù)據(jù)結(jié)構(gòu) 四元式模塊[在此處鍵入] 數(shù)據(jù)結(jié)構(gòu) 語(yǔ)義動(dòng)作分析模塊 數(shù)據(jù)結(jié)構(gòu) 錯(cuò)誤處理模塊 數(shù)據(jù)結(jié)構(gòu) 目標(biāo)代碼模塊 數(shù)據(jù)結(jié)構(gòu) 程序流程圖 程序說(shuō)明 實(shí)驗(yàn)結(jié)果 。功能包括:。Lexical類(lèi)主要的工作是詞法分析獲取Token。同時(shí),這也是程序的流程。如能查到匹配的單詞,則該單詞為關(guān)鍵字,否則為一般標(biāo)識(shí)符。public static string PrintErrorList()把所有發(fā)現(xiàn)的錯(cuò)誤格式化后統(tǒng)一輸出。直接拷貝好歹也檢查一下錯(cuò)誤對(duì)于編譯原理的這次課程設(shè)計(jì),自己經(jīng)歷了從剛開(kāi)始的不懂224。充分了解了詞法分析的任務(wù)之后,就開(kāi)始理論知識(shí)的學(xué)習(xí)。由于在編寫(xiě)代碼的過(guò)程中需要確定分析是否正確或選擇多個(gè)文法中的某一個(gè)文法進(jìn)行分析,有時(shí)必須探測(cè)需要的或下一個(gè)Token的類(lèi)型,在這種情況下需要求First集合,在推導(dǎo)中若存在empty,又需要求Follow集合,所以這樣又需要我了解First集合和Follow集合,自己在程序中也根據(jù)求出的First集合和Follow集合進(jìn)行判斷,以確定程序的走向。由于以前編寫(xiě)代碼都是使用JAVA語(yǔ)言,所以C/C++很多內(nèi)容都忘記了,通過(guò)本次的實(shí)踐,自己又重新拾起了以前的知識(shí)。擴(kuò)充var數(shù)組:VAR (:)〈下界〉和〈上界〉可用常量標(biāo)識(shí)名。當(dāng)源程序編譯正確時(shí),PL/0編譯程序自動(dòng)調(diào)用解釋執(zhí)行程序,對(duì)目標(biāo)代碼進(jìn)行解釋執(zhí)行,并按用戶(hù)程序的要求輸入數(shù)據(jù)和輸出運(yùn)行結(jié)果。詞法分析器的分析過(guò)程:調(diào)用GETSYM時(shí),它通過(guò)GETCH過(guò)程從源程序中獲得一個(gè)字符。這些過(guò)程在結(jié)構(gòu)上構(gòu)成一個(gè)嵌套的層次結(jié)構(gòu)。then后的語(yǔ)句處理完后,如果遇到else,就調(diào)用語(yǔ)句處理過(guò)程處理else語(yǔ)句后面的語(yǔ)句或語(yǔ)句塊,這時(shí)當(dāng)前代碼段分配指針的位置就應(yīng)該是上面的jpc指令的轉(zhuǎn)移位置。// length of identifier table 標(biāo)示符表的長(zhǎng)度(容量)const int al = 10。// alfa類(lèi)型用于標(biāo)識(shí)符 typedef enum {CONSTANT,VARIABLE,PROCEDURE,ARRAY} obj0。t big than amax }。class PL0 {protected:bool listswitch,sourceEnd。int cx。// 保留字表symbol wsym[norw+1]。}void error(int n)。dx,int lev)。void listcode(int cx0)。 dx,int lev)?!? ”error 0018: while型循環(huán)語(yǔ)句中丟了do“, ”error 0019: 語(yǔ)句后的標(biāo)識(shí)符不正確“, ”error 0020: 應(yīng)為關(guān)系運(yùn)算符“, ”error 0021: 表達(dá)式內(nèi)標(biāo)識(shí)符屬性不能是過(guò)程“, ”error 0022: 表達(dá)式中漏掉了右括號(hào)‘)’“, ”error 0023: 因子后的非法符號(hào)“, ”error 0024: 表達(dá)式開(kāi)始符不能是此符號(hào)“, ”error 0025: 文件在不該結(jié)束的地方結(jié)束了“, ”error 0026: 結(jié)束符出現(xiàn)在不該結(jié)束的地方“, ”error 0027: “,”error 0028: “,”error 0029: “,”error 0030: “, ”error 0031: 數(shù)越界“, ”error 0032: read語(yǔ)句括號(hào)中標(biāo)識(shí)符不是變量“, ”error 0033: else附近錯(cuò)誤“ , ”error 0034: repeat附近錯(cuò)誤“}。strcpy(word[7],”if“)。strcpy(word[15],”while“)。wsym[7]= IFSYM。wsym[15]= WHILESYM。]= PLUS。/39。ssym[39。]= PERIOD。39。strcpy(mnemonic[JMP],” jmp “)。// 代碼分配指針,代碼生成模塊總在cx所指位置生成新的代碼ll= 0。sprintf(s,”第 %d 行:“,codeNo)。// cls space and tab if(isalpha(ch))// id or reserved word {k=0。else { do{a[kk]= 39。if(strcmp(id, word[k])j= k1。039。if(ch == 39。if(ch == 39。sourceEnd=true。cc= cc+1。symset::iterator it。// initial table index int cx0。while(sym == COMMA){}getsym()。vardeclaration(tx,dx,lev)。if(sym ==SEMICOLON)getsym()。i((symbol)i)。table[tx0].= cx。gen(OPR,0,0)。table[tx].kind=k。break。while(strcmp(table[i].name,id)!=0)i。getsym()。dx,int lev){ if(sym == IDENT){enter(VARIABLE,tx,dx,lev)。getsym()。getsym()。i= 0。if(sym!=LPAREN)error(34)。}while(sym == COMMA)。t((symbol)t)。if(sym!=IDENT)error(14)。for(int i = THENSYM。statement(tmp,tx,lev)。code[cx2].a=cx。while((sym)!=()){if(sourceEnd)return。if(sourceEnd)re
點(diǎn)擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1