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

正文內(nèi)容

編譯原理課程設(shè)計教學(xué)大綱優(yōu)秀范文5篇-閱讀頁

2024-10-20 16:03本頁面
  

【正文】 目標(biāo)代碼的生成的設(shè)計原理和實現(xiàn)方法,要求掌握四元式到匯編語言的目標(biāo)代碼生成方法。教學(xué)重點:簡單代碼生成器,寄存器分配策略。教學(xué)時間分配及進度安排:建議本章教學(xué)時數(shù)3學(xué)時。參考書:1)編譯原理, 何炎祥, 華中理工大學(xué)出版社, 2)編譯原理, 陳火旺等, 國防工業(yè)出版社, 3)編譯原理, 蔣立源, 西北工業(yè)大學(xué)出版社, 第五篇:編譯原理課程設(shè)計報告武 漢 紡 織 大 學(xué)編譯原理課程設(shè)計實驗報告學(xué)院:數(shù)學(xué)與計算機 專業(yè):計算機 姓名: 班級: 學(xué)號: 編譯原理編譯原理課設(shè)報告一、實驗?zāi)康募訌妼幾g程序的整體認(rèn)識和了解,鞏固《編譯原理》課程所學(xué)知識。使學(xué)生能將編譯理論與實際應(yīng)用結(jié)合起來,提高學(xué)生軟件開發(fā)的能力。2)對PL/0語言進行下列擴充(1)擴充一維整型數(shù)組。(2)擴充條件語句的功能使其為:IFTHEN[ELSE](3)增加repeat重復(fù)語句: REPEAT{。三、實驗原理PL/0語言可以看成PASCAL語言的子集,它的編譯程序是一個編譯解釋執(zhí)行系統(tǒng)。PL/0的編譯程序和目標(biāo)程序的解釋執(zhí)行程序都是用PASCAL語言書寫的,因此PL/0語言可在配備PASCAL語言的任何機器上實現(xiàn)。用表格管理程序建立變量、常量和過程表示符的說明與引用之間的信息聯(lián)系。四、實驗分析PL/0語言編譯程序采用以語法分析為核心、一遍掃描的編譯方法。語法分析的同時,提供了出錯報告和出錯恢復(fù)的功能。詞法分析子程序分析:詞法分析子程序名為GETSYM,功能是從源程序中讀出一個單詞符號(TOTAKEN),把它的信息放入全局變量 SYM、ID和NUM中,字符變量放入CH中,語法分析器需要單詞時,直接從這三個變量中獲得。GETCH過程中使用了行緩沖區(qū)技術(shù)以提高程序運行效率。如果這個字符是字母,則繼續(xù)獲取字符或數(shù)字,最終可以拼成一個單詞,查保留字表,如果查到為保留字,則把SYM變量賦成相應(yīng)的保留字類型值;如果沒有查到,則這個單詞應(yīng)是一個用戶自定義的標(biāo)識符(可能是變量名、常量名或是過程的名字),把SYM置為IDENT,把這個單詞存入ID變量。如果Getch獲得的字符是數(shù)字,則繼續(xù)用Getch獲取數(shù)字,并把它們拼成一個整數(shù)或?qū)崝?shù),然后把SYM置為 INTEGER或REAL,并把拼成的數(shù)值放入NUM變量。如果遇到不合法的字符,把SYM置成NUL。語法分析主要由分程序分析過程(BLOCK)、參數(shù)變量分析過程(ParaDeclaration)、參數(shù)變量處理過程(ParaGetSub)、數(shù)組處理過程(ParaGetSub)、常量定義分析過程(ConstDeclaration)、變量定義分析過程(Vardeclaration)、語句分析過程(Statement)、表達式處理過程(Expression)、項處理過程(Term)、因子處理過程(Factor)和條件處理過程(Condition)構(gòu)成。除此之外,還有出錯報告過程(Error)、代碼生成過程(Gen)、測試單詞合法性及出錯恢復(fù)過程(Test)、登錄名字表過程(Enter)、查詢名字表函數(shù)(Position)以及列出類 PCODE代碼過程(Listcode)作過語法分析的輔助過程。因此,本編譯程序在運行的時候,通過主程序中調(diào)用分程序處理過程block來分析分程序部分(分程序分析過程中還可能會遞歸調(diào)用block過程),然后,判斷最后讀入的符號是否為句號。ifthenelse語句的處理:按if語句的語法,首先調(diào)用邏輯表達式處理過程處理if語句的條件,把相應(yīng)的真假值放到數(shù)據(jù)棧頂。然后調(diào)用語句處理過程處理 then語句后面的語句或語句塊。通過前面記錄下的jpc指令的位置,把它的跳轉(zhuǎn)位置改成當(dāng)前的代碼段指針位置,否則沒遇到else,那么此時的當(dāng)前代碼段分配指針的位置也是上面jpc指令的轉(zhuǎn)移位置,也是通過前面記錄下的jpc位置指令的位置,把它的跳轉(zhuǎn)到當(dāng)前的代碼段指針位置。然后通過遞歸調(diào)用語句分析過程分析,直到遇到until保留字,如果未對應(yīng)until則出錯。五、相關(guān)代碼及運行結(jié)果實驗代碼; : include include include include include include ifndef WIRTH_ZYC_ define WIRTH_ZYC_ using namespace std。// reserved words 保留字的個數(shù)const int txmax = 100。// length of identifiers 標(biāo)示符的最大長度const int nmax = 14。// maximum address 尋址空間const int levmax = 3。// size of code array 類PCODE目標(biāo)代碼數(shù)組長度(可容納代碼行數(shù))const int lineLength = 82。// symobl類型標(biāo)識了不同類型的詞匯typedef char alfa[al+1]。// 三種標(biāo)識符的類型 typedef enum {LIT,OPR,LOD,STO,CAL,INT,JMP,JPC} fct。struct instruction{ fct f。// level,cann39。// displacement address,cann39。// 類PCODE指令類型,包含三個字段:指令f、層差l和另一個操作數(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。union {struct{int level,adr,size。int val。} Table。char ch。// last symbol read alfa id。// last number readint cc。// line length int kk,err。// code allocation index int codeNo。// error stringchar line[lineLength]。// error array alfa a。// destination code arrayalfa word[norw+1]。// 保留字表中每一個保留字對應(yīng)的symbol類型symbol ssym[100]。// 類PCODE指令助記符表symset declbegsys,statbegsys,facbegsys。// 符號表FILE* fin,*fout。~PL0(){fclose(fin),fclose(fout)。位置和出錯代碼void getsym()。個字符void gen(fct x,int y,int z)。合法void block(int lev,int tx,symset fsys)。tx,int amp。int position(alfa id,int tx)。tx,intamp。void vardeclaration(intamp。dx,int lev)。void statement(symset fsys,int tx,int lev)。void term(symset fsys,int tx,int lev)。void condition(symset fsys,int tx,int lev)。 tx,intamp。void interpret()?;刂穠oid SaveCode()。endif : include “”// 錯誤字符串?dāng)?shù)組string PL0::errStr[]={“,”error 0001: 常數(shù)說明中“=”寫成“:=”“, ”error 0002: 常數(shù)說明中的“=”后應(yīng)為數(shù)字“, ”error 0003: 常數(shù)說明中的標(biāo)識符后應(yīng)是“=”“, ”error 0004: const,var,procedure后應(yīng)為標(biāo)識符“, ”error 0005: 漏掉了‘,’或‘。’“, ”error 0011: 標(biāo)識符沒說明“, ”error 0012: 賦值語句中,賦值號左部標(biāo)識符屬性應(yīng)是變量“, ”error 0013: 賦值語句左部標(biāo)識符應(yīng)是賦值號:=“, ”error 0014: call后應(yīng)為標(biāo)識符“, ”error 0015: call后標(biāo)識符屬性應(yīng)為過程“, ”error 0016: 條件語句中丟了then“, ”error 0017: 丟了end或。// PL0構(gòu)造函數(shù)PL0::PL0(char* source,char*destination){ listswitch=true,sourceEnd=false。// 初始化存儲保留字strcpy(word[2],”call“)。strcpy(word[4],”do“)。strcpy(word[6],”end“)。strcpy(word[8],”odd“)。strcpy(word[10],”read“)。strcpy(word[12],”then“)。strcpy(word[14],”var“)。strcpy(word[16],”write“)。wsym[2]= CALLSYM。wsym[4]= DOSYM。wsym[6]= ENDSYM。wsym[8]= ODDSYM。wsym[10]= READSYM。wsym[12]= THENSYM。wsym[14]= VARSYM。wsym[16]= WRITESYM。memset(ssym,0,100*sizeof(symbol))。memset(line,0,sizeof(line))。+39。類型表ssym[39。]= MINUS。*39。ssym[39。]= SLASH。(39。ssym[39。]= RPAREN。=39。ssym[39。]= COMMA。.39。// 初始化保留字表中每一個保// 初始化一些符號對應(yīng)的symbolssym[39。]= NEQ。39。ssym[39。]= SEMICOLON。// 初始化類PCODE指令助記符表strcpy(mnemonic[OPR],” opr “)。strcpy(mnemonic[STO],” sto “)。strcpy(mnemonic[INT],” int “)。strcpy(mnemonic[JPC],” jpc “)。// 初始化聲明開始符號集合 (BEGINSYM),(CALLSYM),(IFSYM),(WHILESYM)。// 初始化項開始符號集合err= 0。// 行緩沖區(qū)指針cx= 0。// 行緩沖區(qū)長度ch= 39。// last character read}kk= al。// code line =fopen(source,”r“)。// 出錯處理,打印出錯位置和出錯代碼 void PL0::error(int n){ char s[10]。(s+errStr[n])。//error count }//error end // 詞法分析,讀取一個單詞void PL0::getsym(){ if(sourceEnd)return。while(ch ==39。||ch==9)getch()。memset(a,0,al+1)。k= k+1。if(sourceEnd)return。if(k = kk)kk = k。 39。}while(kk k)。i= 1。// 判斷是否是關(guān)鍵字(二分搜索)do{ k=(i+j)/ 2。if(strcmp(id,word[k])=0)i= k+1。elsesym= IDENT。num= 0。do{num= 10 * num + ch39。k= k+1。}while(isdigit(ch))。} else if(ch == 39。){ getch()。=39。getch()。} else if(ch == 39。){ getch()。=39。getch()。} else// end of extra stuff { sym= ssym[ch]。} }// 漏掉空格,讀取一個字符void PL0::getch(){ if(cc == ll){if(feof(fin)){if(sym!=PERIOD)error(25)。return。fgets(line,lineLength,fin)。ll=strlen(line)。} ch= line[cc]。}// 生成目標(biāo)代碼,并送入目標(biāo)程序區(qū)void PL0::gen(fct x,int y,int z){ if(cx cxmax){coutreturn。code[cx].l= y。cx= cx+1。if((sym)==()){error(n)。for(it=()。it++)(*it)。} }//test end// 分程序分析處理過程void PL0::block(int lev,int tx,symset fsys){ if(sourceEnd)return。// data allocation index int tx0。// initial code indexdx
點擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1