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

正文內(nèi)容

99《編譯原理》課程設(shè)計(jì)(最終定稿)-預(yù)覽頁

2024-11-10 00:52 上一頁面

下一頁面
 

【正文】 型(TokenType): 語法分析模塊語法分析是編譯過程的一個(gè)邏輯階段。 數(shù)據(jù)結(jié)構(gòu)在此處鍵入] 四元式模塊四元式為中間代碼,編譯程序進(jìn)行完語義分析后,先生成中間代碼作為過渡,此時(shí)中間代碼與目標(biāo)代碼已經(jīng)比較相似 數(shù)據(jù)結(jié)構(gòu)[ 在此處鍵入]在語法分析中嵌入相應(yīng)的語義動(dòng)作,生成四元式 數(shù)據(jù)結(jié)構(gòu)[[在此處鍵入] GEQ(+)()(*)(/)(+,i1,i2,t)PUSH(i)ASSI(=)(=,t,_,POP)LABER(i)(lb,_,_,i)GOTO(i)(gt,_,_,i)IF(if)(if,a,_,_)EL(el)(el,_,_,_)IE(ie)(ie,_,_,_)WH()(wh,_,_,_)DO()(do,a,_,_)WE(we)(we,_,_,_) 錯(cuò)誤處理模塊 保存運(yùn)行時(shí)發(fā)現(xiàn)的錯(cuò)誤,儲(chǔ)存行號(hào)已經(jīng)詳細(xì)信息并輸出。 目標(biāo)代碼模塊目標(biāo)代碼生成把優(yōu)化后的中間代碼變換成目標(biāo)代碼,此處的目標(biāo)代碼為匯編代碼,采用單寄存器生成目標(biāo)代碼 數(shù)據(jù)結(jié)構(gòu)[在此處鍵入]對(duì)于一個(gè)基本塊有如下流程圖W:操作符,B:第一操作數(shù),C:第二操作數(shù),R:寄存器網(wǎng)上找一段話抄上 [在此處鍵入]測(cè)試打開文件測(cè)試保存文件如果沒打開文件,直接敲代碼,點(diǎn)保存時(shí)會(huì)彈出另存為窗口[在此處鍵入]測(cè)試錯(cuò)誤檢測(cè),程序缺少main函數(shù)的類型,錯(cuò)誤列表中顯示第一行函數(shù)缺少錯(cuò)誤類型。[在此處鍵入]測(cè)試優(yōu)化,輸入課件中的代碼,結(jié)果與課件一樣。理論知識(shí)的了解224。自己著手寫詞法分析的時(shí)候還不清楚詞法分析的任務(wù)內(nèi)容,還不知道詞法分析的結(jié)果是什么,詞法分析出錯(cuò)的情況和類型有哪些,也總是將詞法分析和語法分析混在一起,不明白哪些錯(cuò)誤在詞法分析中報(bào),哪些錯(cuò)誤在語法分析中判斷,后來經(jīng)過查書、網(wǎng)上資料、請(qǐng)教同學(xué)等途徑逐步清晰了詞法分析的工作內(nèi)容是從源代碼文件中獲取出Token,供語法分析使用。這只是詞法分析的原始代碼,在之后還進(jìn)行了兩次徹底的改動(dòng)。首先自己對(duì)遞歸向下分析法進(jìn)行了學(xué)習(xí),將書上的幾個(gè)遞歸向下分析的偽代碼看過之后,自己對(duì)遞歸向下的分析方法的原理有了初步的認(rèn)識(shí),大概知道了根據(jù)文法怎么分析,但是對(duì)于如何編寫代碼卻還在此處鍵入]是難以下手,于是就對(duì)照TINY語言的文法看了幾遍書后面的TINY語言的遞歸向下分析的語法分析程序,這樣就基本知道了C語言的語法分析程序怎么寫。通過這次的編譯原理課程的學(xué)習(xí)和實(shí)踐,自己獲益良多。此外,對(duì)以前那些已掌握的知識(shí)有了溫習(xí)和動(dòng)手鍛煉的機(jī)會(huì)。此外,對(duì)于文檔的編寫和美化自己也獲得了許多有用的經(jīng)驗(yàn)。二、實(shí)驗(yàn)內(nèi)容1)仔細(xì)閱讀PL/0編譯程序文本(編譯原理(第二版)張素琴 呂映芝 蔣維杜 戴桂蘭 主編清華大學(xué)出版社),并上機(jī)調(diào)試通過。}UNTIL 可根據(jù)自己具體情況從中選擇2個(gè)以上題目進(jìn)行擴(kuò)充。其編譯過程采用一趟掃描方式,以語法分析程序?yàn)楹诵?,詞法分析和代碼生成程序都作為一個(gè)獨(dú)立的過程,當(dāng)語法分析需要讀單詞時(shí)就調(diào)用詞法分析程序,而當(dāng)語法分析正確需要生成相應(yīng)的目標(biāo)代碼時(shí),則調(diào)用代碼生成程序。詞法分析和代碼生成作為獨(dú)立的子程序供語法分析程序調(diào)用。Getch過程通過反復(fù)調(diào)用Getch子過程從源程序過獲取字符,并把它們拼成單詞。查保留字表時(shí)使用了二分法查找以提高效率。語法分析子程序分析:語法分析子程序采用了自頂向下的遞歸子程序法,語法分析同時(shí)也根據(jù)程序的語義生成相應(yīng)三元代碼,并提供了出錯(cuò)處理的機(jī)制。由PL/0的語法圖可知:一個(gè)完整的PL/0程序是由分程序和句號(hào)構(gòu)成的。接下去記錄下代碼段分配位置(即下面生成的jpc指令的位置),然后生成 條件轉(zhuǎn)移jpc指令(遇0或遇假轉(zhuǎn)移),轉(zhuǎn)移地址未知暫時(shí)填0。Repeat語句的處理:首先用CX1變量記下當(dāng)前代碼段分配位置,作為循環(huán)的開始位置。const int norw = 16。// digits in numbers 數(shù)字的最大長度 const int amax = 2047。// 行緩沖區(qū)長度typedef enum {NUL,IDENT,NUMBER,PLUS,MINUS,TIMES,SLASH,ODDSYM,EQL,NEQ,LSS,LEQ,GTR,GEQ,LPAREN,RPAREN,COMMA,SEMICOLON,PERIOD,BECOMES,BEGINSYM,ENDSYM,IFSYM,THENSYM,WHILESYM,WRITESYM,READSYM,DOSYM,CALLSYM,CONSTSYM,VARSYM,PROCSYM,ELSESYM,REPEATSYM,UNTILSYM} symbol。// functions typedef set symset。t big than levmaxint a。obj0 kind。}other。// last character read symbol sym。// character count int ll。// code line string errStr[]。// 詞法分析器中用于臨時(shí)存放正在分析的詞instruction code[cxmax+1]。// 一些符號(hào)對(duì)應(yīng)的symbol類型表合 char mnemonic[8][6]。public:PL0(char* source,char*destination)。個(gè)單詞void getch()。void enter(obj0 k,int amp。的位置void constdeclaration(intamp。tx,intamp。void expression(symset fsys,int tx,int lev)。void arraydeclaration(intamp。執(zhí)行程序int base(int l,int b,int s[])?!? ”error 0006: 過程說明后的符號(hào)不正確(應(yīng)是語句開始符或過程開始符)“, ”error 0007: 應(yīng)是語句開始符“, ”error 0008: 過程體內(nèi)語句部分的后跟符不正確“, ”error 0009: 程序皆為丟了句號(hào)‘.’“, ”error 0010: 語句之間漏了‘。strcpy(word[1],”begin“)。strcpy(word[5],”else“)。strcpy(word[9],”procedure“)。strcpy(word[13],”until“)。wsym[1]= BEGINSYM。wsym[5]= ELSESYM。wsym[9]= PROCSYM。wsym[13]= UNTILSYM。memset(code,0,sizeof(code))。ssym[39。39。]= TIMES。ssym[39。)39。]= EQL。ssym[39。39。]= GTR。strcpy(mnemonic[LIT],” lit “)。strcpy(mnemonic[CAL],” cal “)。(CONSTSYM),(VARSYM),(PROCSYM)。cc= 0。 39。fout=fopen(destination,”w“)。err= err+1。 39。// 檢測(cè)一個(gè)單詞長度 do{ if(k al){a[k]= ch。}while(isalpha(ch)||isdigit(ch))。kk= kk1。j= norw。}while(i j)sym= wsym[k]。sym= NUMBER。getch()。:39。){sym= BECOMES。// extra stuff added to support 39。){sym= GEQ。// 其它符號(hào)的賦值getch()。}cc= 0。if(line[ll1]==10)ll。}code[cx].f= x。}//gen end// 測(cè)試當(dāng)前單詞符號(hào)是否合法void PL0::test(symset s1,symset s2,int n){ if(sourceEnd)return。it!=()。int dx。// 變量的個(gè)數(shù) tx0= tx。do{if(sym == CONSTSYM)// 處理常量聲明{getsym()。} if(sym ==SEMICOLON)getsym()。do{vardeclaration(tx,dx,lev)。elseerror(5)。getsym()。symset tmp = fsys。symset tmp = statbegsys。}elseerror(5)。}while((sym)!=())。cx0= cx。i ((symbol)i)。test(fsys,s2,8)。dx,int lev){ tx= tx+1。num=0。table[tx].=dx。break。strcpy(table[0].name, id)。}//position end// 常量定義處理void PL0::constdeclaration(intamp。amp。getsym()。}// constdeclaration end// 變量說明處理void PL0::vardeclaration(intamp。} elseerror(4)。getsym()。} if(sym == COMMA)getsym()。} if(sym!= RPAREN)} error(32)。if(listswitch)for(i= cx0。if(i == 0)error(11)。if(sym ==BECOMES)getsym()。if(i!= 0)gen(STO,levtable[i].,table[i].)。if(sym==IDENT)i=position(id,tx)。gen(STO,levtable[i].,table[i].)。while((sym)!=())getsym()。symset tmp=fsys。gen(OPR,0,14)。} gen(OPR,0,15)。if(i == 0)error(11)。} } else if(sym ==IFSYM){ getsym()。condition(tmp,tx,lev)。gen(JPC,0,0)。code[cx1].a= cx。code[cx1].a=cx。symset tmp=fsys。tmp=statbegsys。else if(sym=PERIOD){error(26)。for(i=SEMICOLON。statement(tmp,tx,lev)。// 記下當(dāng)前代碼分配位置,這是while循環(huán)的開始位置getsym()。cx2= cx。statement(fsys,tx,lev)。temp1= fsys,(SEMICOLON),(UNTILSYM)。temp2 = statbegsys。statement(temp1,tx,lev)。}elseerror(34)。symset tmp=fsys。amp。if(addop ==MINUS)gen(OPR,0,1)。symaddop= sym。elsegen(OPR,0,3)。for(int t=TIMES。amp。if(mulop ==TIMES)gen(OPR,0,4)。while((sym)!=()){if(sym ==IDENT){i= position(id,tx)。case VARIABLE:gen(LOD,levtable[i].,table[i].)。}getsym()。getsym()。expression(tmp,tx,lev)。} }//factor end// 條件處理void PL0::condition(symset fsys,int tx,int lev){ symbol relop。expression(fsys,tx,lev)。else{relop= sym。break。break。break。if(err10){coutcoutt= t+1。p= s[t+3]。break。case 3: t= t1。s[t]= s[t]*s[t+1]。break。case 8: t= t1。case 9: t= t1。case 10: t= t1。case 11: t= t1。case 12: t= t1。case 13: t= t1。case 14: couts[t]。case LOD:t= t+1。t= t1。s[t+3]= p。case INT:t= t+。case JPC:if(s[t] == 0)p= 。cout// 通過靜態(tài)鏈求出數(shù)據(jù)區(qū)的基地址int PL0::base(int l,int b,int s[]){ int b1。} return b1。symset fsys。()。// 對(duì)目標(biāo)代碼的解釋執(zhí)行程序} 實(shí)驗(yàn)運(yùn)行結(jié)果:運(yùn)行的的文件見下圖右側(cè):實(shí)驗(yàn)中我是固定了文件名的,可以是改寫成動(dòng)態(tài)輸入,由于在測(cè)試中我把所有的測(cè)試語句都放在同一個(gè)文件中了,沒有太多的必要。通過本次的課設(shè)我知道了一個(gè)算法的設(shè)計(jì)是需要靜下心來仔細(xì)的研究的,且實(shí)現(xiàn)中必須先了解程序的整個(gè)流程,也就是說在編程中首先必須看懂那些對(duì)應(yīng)的UML圖,只有在圖的指導(dǎo)下,編程中才不會(huì)盲目,也有一定的方向性。要求用C或C++語言描述及上機(jī)調(diào)試,實(shí)現(xiàn)一個(gè)小編譯器(詞法分析,語法分析,中間代碼產(chǎn)生,優(yōu)化,目標(biāo)代碼生成等重要子程序,其中詞法分析、語法分析及語義分析功能必須完成),使學(xué)生將理論與實(shí)際應(yīng)用結(jié)合起來,受到軟件設(shè)計(jì)等開發(fā)過程的全面訓(xùn)練,從而提高學(xué)生軟件開發(fā)的能力。(2)設(shè)計(jì)詞法分析器設(shè)計(jì)各單詞的狀態(tài)轉(zhuǎn)換圖,并為不同的單詞設(shè)計(jì)種別碼。(3)語法分析與中間代碼產(chǎn)生器要求用預(yù)測(cè)分析法、遞歸下降分析法、算符優(yōu)先分析法、SL
點(diǎn)擊復(fù)制文檔內(nèi)容
規(guī)章制度相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1