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

正文內(nèi)容

合肥工業(yè)大學(xué)編譯原理課程設(shè)計(jì)-預(yù)覽頁(yè)

 

【正文】 的DAG按一定格式存于指定文件中,輸出的基本塊四元式代碼按一定格式輸出到指定文件中。(待續(xù))。將不翻譯的注釋等符號(hào)先濾掉,只保留要翻譯的符號(hào)串,即要求設(shè)計(jì)一個(gè)供詞法分析調(diào)用的預(yù)處理子程序;第二部分,語(yǔ)法分析,用遞歸下降法,實(shí)現(xiàn)對(duì)表達(dá)式、各種說(shuō)明語(yǔ)句、控制語(yǔ)句進(jìn)行語(yǔ)法分析。、體會(huì)和建議。這一過(guò)程可以表示為:源程序→編譯器 →目標(biāo)機(jī)器代碼程序?qū)W生在學(xué)習(xí)《編譯原理》課程過(guò)程中,結(jié)合各章節(jié)的構(gòu)造編譯程序的基本理論,要求用C語(yǔ)言描述及上機(jī)調(diào)試,實(shí)現(xiàn)一個(gè) C編譯程序(包括詞法分析,語(yǔ)法分析等重要子程序),使學(xué)生將理論與實(shí)際應(yīng)用結(jié)合起來(lái),受到軟件設(shè)計(jì)等開發(fā)過(guò)程的全面訓(xùn)練,從而提高學(xué)生軟件開發(fā)的能力。將不翻譯的注釋等符號(hào)先濾掉,只保留要翻譯的符號(hào)串,即要求設(shè)計(jì)一個(gè)供詞法分析調(diào)用的預(yù)處理子程序;; [在此處鍵入](種別碼,屬性值,行號(hào))。(程序由幾個(gè)類組成: Token類和Variable類SymbolTable類ObjectCode類Lexical類Grammar類Four_Yuan類Action類ErrorItem類,分別為詞法分析和語(yǔ)法分析類。Grammer類的主要工作是根據(jù)Lexical類詞法分析之后的Token進(jìn)行語(yǔ)法分析,生成語(yǔ)法樹,最后并輸出語(yǔ)法樹。[在此處鍵入]程序流程在程序中,Lexical類的對(duì)象(Token)作為Grammer類中的一個(gè)成員變量,配合Grammer類進(jìn)行語(yǔ)法分析。[在此處鍵入] 詞法分析模塊 Lexical類主要的工作是詞法分析獲取Token序列。主程序示意圖:主程序示意圖如圖31所示。(2)程序中需要用到的主要變量為type和number 掃描子程序的算法思想:首先設(shè)置3個(gè)變量: [在此處鍵入]①token用來(lái)存放構(gòu)成單詞符號(hào)的字符串; ②number用來(lái)整型單詞;③type用來(lái)存放單詞符號(hào)的種別碼。Q|L||i|(E)|!Q對(duì)應(yīng)于每個(gè)文法編寫如下遞歸下降子程序主程序(B)[在此處鍵入] [在此處鍵入] 符號(hào)表模塊進(jìn)行符號(hào)表的儲(chǔ)存,添加,更新,查找,保存標(biāo)識(shí)符活躍信息以及輸出。錯(cuò)誤信息在語(yǔ)法分析,語(yǔ)義分析,符號(hào)表檢錯(cuò)中添加。 單擊錯(cuò)誤列表,會(huì)自動(dòng)選定錯(cuò)誤行編譯成功,生成并顯示token串、符號(hào)表、四元式與目標(biāo)代碼 [在此處鍵入]測(cè)試if與while語(yǔ)句,而且while嵌套在if當(dāng)中測(cè)試goto語(yǔ)句,結(jié)果正確。明白任務(wù)的要求和內(nèi)容224。根據(jù)DFA及自頂向下等理論修改完善代碼等這些過(guò)程。經(jīng)過(guò)揣摩書上的例子,自己理解和掌握了怎么設(shè)計(jì)過(guò)濾注釋和分析程序中Token的DFA,于是開始根據(jù)設(shè)計(jì)好的DFA進(jìn)行編碼,最后經(jīng)過(guò)調(diào)試已經(jīng)可以正確地完成詞法階段的任務(wù)了。在寫語(yǔ)法分析的時(shí)候,已經(jīng)對(duì)編譯器的語(yǔ)法分析的內(nèi)容有了一定的了解,所以直接進(jìn)行了理論的學(xué)習(xí)。在編寫過(guò)程中,還有一類問題,就是存在公共左因子,如文法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)類型參數(shù)的函數(shù),目的就是將已經(jīng)生成的節(jié)點(diǎn)傳到下面的分析函數(shù)中去。由于在編寫程序過(guò)程中,涉及到了正則表達(dá)式、DFA、提取公共左因子、消除左遞歸、EBNF、求First集合和Follow集合、遞歸向下分析方法以及編程語(yǔ)言方面的知識(shí),所以,通過(guò)本次的課程設(shè)計(jì)的實(shí)踐,使得自己對(duì)編譯原理這門課的許多知識(shí)點(diǎn)有了更加深刻和具體的理解,而不再只限制于做題。此外,由于在做報(bào)告的時(shí)候,需要描繪DFA和程序流程圖,使得自己初步掌握了使用visio和word畫圖的能力。使學(xué)生能將編譯理論與實(shí)際應(yīng)用結(jié)合起來(lái),提高學(xué)生軟件開發(fā)的能力。(2)擴(kuò)充條件語(yǔ)句的功能使其為:IFTHEN[ELSE](3)增加repeat重復(fù)語(yǔ)句: REPEAT{。PL/0的編譯程序和目標(biāo)程序的解釋執(zhí)行程序都是用PASCAL語(yǔ)言書寫的,因此PL/0語(yǔ)言可在配備PASCAL語(yǔ)言的任何機(jī)器上實(shí)現(xiàn)。四、實(shí)驗(yàn)分析PL/0語(yǔ)言編譯程序采用以語(yǔ)法分析為核心、一遍掃描的編譯方法。詞法分析子程序分析:詞法分析子程序名為GETSYM,功能是從源程序中讀出一個(gè)單詞符號(hào)(TOTAKEN),把它的信息放入全局變量 SYM、ID和NUM中,字符變量放入CH中,語(yǔ)法分析器需要單詞時(shí),直接從這三個(gè)變量中獲得。如果這個(gè)字符是字母,則繼續(xù)獲取字符或數(shù)字,最終可以拼成一個(gè)單詞,查保留字表,如果查到為保留字,則把SYM變量賦成相應(yīng)的保留字類型值;如果沒有查到,則這個(gè)單詞應(yīng)是一個(gè)用戶自定義的標(biāo)識(shí)符(可能是變量名、常量名或是過(guò)程的名字),把SYM置為IDENT,把這個(gè)單詞存入ID變量。如果遇到不合法的字符,把SYM置成NUL。除此之外,還有出錯(cuò)報(bào)告過(guò)程(Error)、代碼生成過(guò)程(Gen)、測(cè)試單詞合法性及出錯(cuò)恢復(fù)過(guò)程(Test)、登錄名字表過(guò)程(Enter)、查詢名字表函數(shù)(Position)以及列出類 PCODE代碼過(guò)程(Listcode)作過(guò)語(yǔ)法分析的輔助過(guò)程。ifthenelse語(yǔ)句的處理:按if語(yǔ)句的語(yǔ)法,首先調(diào)用邏輯表達(dá)式處理過(guò)程處理if語(yǔ)句的條件,把相應(yīng)的真假值放到數(shù)據(jù)棧頂。通過(guò)前面記錄下的jpc指令的位置,把它的跳轉(zhuǎn)位置改成當(dāng)前的代碼段指針位置,否則沒遇到else,那么此時(shí)的當(dāng)前代碼段分配指針的位置也是上面jpc指令的轉(zhuǎn)移位置,也是通過(guò)前面記錄下的jpc位置指令的位置,把它的跳轉(zhuǎn)到當(dāng)前的代碼段指針位置。五、相關(guān)代碼及運(yùn)行結(jié)果實(shí)驗(yàn)代碼; : include include include include include include ifndef WIRTH_ZYC_ define WIRTH_ZYC_ using namespace std。// length of identifiers 標(biāo)示符的最大長(zhǎng)度const int nmax = 14。// size of code array 類PCODE目標(biāo)代碼數(shù)組長(zhǎng)度(可容納代碼行數(shù))const int lineLength = 82。// 三種標(biāo)識(shí)符的類型 typedef enum {LIT,OPR,LOD,STO,CAL,INT,JMP,JPC} fct。// level,cann39。// 類PCODE指令類型,包含三個(gè)字段:指令f、層差l和另一個(gè)操作數(shù)a/******************************************* * lit 0,a: load constant 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。int val。char ch。// last number readint cc。// code allocation index int codeNo。// error array alfa a。// 保留字表中每一個(gè)保留字對(duì)應(yīng)的symbol類型symbol ssym[100]。// 符號(hào)表FILE* fin,*fout。位置和出錯(cuò)代碼void getsym()。合法void block(int lev,int tx,symset fsys)。int position(alfa id,int tx)。void vardeclaration(intamp。void statement(symset fsys,int tx,int lev)。void condition(symset fsys,int tx,int lev)。void interpret()。endif : include “”// 錯(cuò)誤字符串?dāng)?shù)組string PL0::errStr[]={“,”error 0001: 常數(shù)說(shuō)明中“=”寫成“:=”“, ”error 0002: 常數(shù)說(shuō)明中的“=”后應(yīng)為數(shù)字“, ”error 0003: 常數(shù)說(shuō)明中的標(biāo)識(shí)符后應(yīng)是“=”“, ”error 0004: const,var,procedure后應(yīng)為標(biāo)識(shí)符“, ”error 0005: 漏掉了‘,’或‘。// PL0構(gòu)造函數(shù)PL0::PL0(char* source,char*destination){ listswitch=true,sourceEnd=false。strcpy(word[4],”do“)。strcpy(word[8],”odd“)。strcpy(word[12],”then“)。strcpy(word[16],”write“)。wsym[4]= DOSYM。wsym[8]= ODDSYM。wsym[12]= THENSYM。wsym[16]= WRITESYM。memset(line,0,sizeof(line))。類型表ssym[39。*39。]= SLASH。ssym[39。=39。]= COMMA。// 初始化保留字表中每一個(gè)保// 初始化一些符號(hào)對(duì)應(yīng)的symbolssym[39。39。]= SEMICOLON。strcpy(mnemonic[STO],” sto “)。strcpy(mnemonic[JPC],” jpc “)。// 初始化項(xiàng)開始符號(hào)集合err= 0。// 行緩沖區(qū)長(zhǎng)度ch= 39。// code line =fopen(source,”r“)。(s+errStr[n])。while(ch ==39。memset(a,0,al+1)。if(sourceEnd)return。 39。i= 1。if(strcmp(id,word[k])=0)i= k+1。num= 0。k= k+1。} else if(ch == 39。=39。} else if(ch == 39。=39。} else// end of extra stuff { sym= ssym[ch]。return。ll=strlen(line)。}// 生成目標(biāo)代碼,并送入目標(biāo)程序區(qū)void PL0::gen(fct x,int y,int z){ if(cx cxmax){coutreturn。cx= cx+1。for(it=()。} }//test end// 分程序分析處理過(guò)程void PL0::block(int lev,int tx,symset fsys){ if(sourceEnd)return。// initial code indexdx= 3。if(levlevmax)error(32)。constdeclaration(tx,dx,lev)。if(sym == VARSYM)// 處理變量聲明 { getsym()。}if(sym ==SEMICOLON)getsym()。if(sym ==IDENT){enter(PROCEDURE,tx,dx,lev)。elseerror(5)。if(sym == SEMICOLON){getsym()。test(tmp,fsys,6)。test(tmp,declbegsys,7)。// start adr of code table[tx0].=dx。for(int i=SEMICOLON。// return symset s2。tx,int amp。switch(k){ case CONSTANT:if(numamax){error(31)。case VARIABLE:table[tx].=lev。case PROCEDURE:table[tx].=lev。} }//enter end// 查找標(biāo)示符在名字表中的位置int PL0::position(alfa id,int tx)//find identifier id in table { int i。return i。if(sym=EQLamp。if(sym == NUMBER){enter(CONSTANT,tx,dx,lev)。} elseerror(4)。getsym()。dx,int lev){int upscript=0,downscript=0。}elseerror(32)。getsym()。} // 列出目標(biāo)代碼清單void PL0::listcode(int cx0)//list code generated for this block { int i。if(sym ==IDENT){i= position(id,tx)。}getsym()。if(sym!= SEMICOLON)error(10)。elsedo{getsym()。else{gen(OPR,0,16)。if(sym!= RPAREN){error(33)。if(sym==LPAREN){do{getsym()。expression(tmp,tx,lev)
點(diǎn)擊復(fù)制文檔內(nèi)容
研究報(bào)告相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1