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

正文內(nèi)容

編譯原理課程設計要求-在線瀏覽

2024-11-14 22:27本頁面
  

【正文】 * k)等函數(shù)都被設計成有節(jié)點類型參數(shù)的函數(shù),目的就是將已經(jīng)生成的節(jié)點傳到下面的分析函數(shù)中去。首先最基本的成果是完成了課程設計的任務,實現(xiàn)了編譯器的詞法分析和語法分析階段的功能,詞法分析主要能過濾注釋、分析出語法分析階段需要的Token并滿足語法階段的所有要求,能夠判別詞法分析階段是否出錯和出錯類型和位置。由于在編寫程序過程中,涉及到了正則表達式、DFA、提取公共左因子、消除左遞歸、EBNF、求First集合和Follow集合、遞歸向下分析方法以及編程語言方面的知識,所以,通過本次的課程設計的實踐,使得自己對編譯原理這門課的許多知識點有了更加深刻和具體的理解,而不再只限制于做題。如:以前在編譯原理課上雖然知道First集合和Follow集合怎么求的,卻不知道First集合和Follow集合到底是干什么的,通過編寫程序自己明白了他們的實際作用,使得自己不僅知其然還知其所以然,從而使得自己加深了對知識點的理解和掌握。此外,由于在做報告的時候,需要描繪DFA和程序流程圖,使得自己初步掌握了使用visio和word畫圖的能力。[第四篇:編譯原理課程設計報告武 漢 紡 織 大 學編譯原理課程設計實驗報告學院:數(shù)學與計算機 專業(yè):計算機 姓名: 班級: 學號: 編譯原理編譯原理課設報告一、實驗目的加強對編譯程序的整體認識和了解,鞏固《編譯原理》課程所學知識。使學生能將編譯理論與實際應用結合起來,提高學生軟件開發(fā)的能力。2)對PL/0語言進行下列擴充(1)擴充一維整型數(shù)組。(2)擴充條件語句的功能使其為:IFTHEN[ELSE](3)增加repeat重復語句: REPEAT{。三、實驗原理PL/0語言可以看成PASCAL語言的子集,它的編譯程序是一個編譯解釋執(zhí)行系統(tǒng)。PL/0的編譯程序和目標程序的解釋執(zhí)行程序都是用PASCAL語言書寫的,因此PL/0語言可在配備PASCAL語言的任何機器上實現(xiàn)。用表格管理程序建立變量、常量和過程表示符的說明與引用之間的信息聯(lián)系。四、實驗分析PL/0語言編譯程序采用以語法分析為核心、一遍掃描的編譯方法。語法分析的同時,提供了出錯報告和出錯恢復的功能。詞法分析子程序分析:詞法分析子程序名為GETSYM,功能是從源程序中讀出一個單詞符號(TOTAKEN),把它的信息放入全局變量 SYM、ID和NUM中,字符變量放入CH中,語法分析器需要單詞時,直接從這三個變量中獲得。GETCH過程中使用了行緩沖區(qū)技術以提高程序運行效率。如果這個字符是字母,則繼續(xù)獲取字符或數(shù)字,最終可以拼成一個單詞,查保留字表,如果查到為保留字,則把SYM變量賦成相應的保留字類型值;如果沒有查到,則這個單詞應是一個用戶自定義的標識符(可能是變量名、常量名或是過程的名字),把SYM置為IDENT,把這個單詞存入ID變量。如果Getch獲得的字符是數(shù)字,則繼續(xù)用Getch獲取數(shù)字,并把它們拼成一個整數(shù)或實數(shù),然后把SYM置為 INTEGER或REAL,并把拼成的數(shù)值放入NUM變量。如果遇到不合法的字符,把SYM置成NUL。語法分析主要由分程序分析過程(BLOCK)、參數(shù)變量分析過程(ParaDeclaration)、參數(shù)變量處理過程(ParaGetSub)、數(shù)組處理過程(ParaGetSub)、常量定義分析過程(ConstDeclaration)、變量定義分析過程(Vardeclaration)、語句分析過程(Statement)、表達式處理過程(Expression)、項處理過程(Term)、因子處理過程(Factor)和條件處理過程(Condition)構成。除此之外,還有出錯報告過程(Error)、代碼生成過程(Gen)、測試單詞合法性及出錯恢復過程(Test)、登錄名字表過程(Enter)、查詢名字表函數(shù)(Position)以及列出類 PCODE代碼過程(Listcode)作過語法分析的輔助過程。因此,本編譯程序在運行的時候,通過主程序中調(diào)用分程序處理過程block來分析分程序部分(分程序分析過程中還可能會遞歸調(diào)用block過程),然后,判斷最后讀入的符號是否為句號。ifthenelse語句的處理:按if語句的語法,首先調(diào)用邏輯表達式處理過程處理if語句的條件,把相應的真假值放到數(shù)據(jù)棧頂。然后調(diào)用語句處理過程處理 then語句后面的語句或語句塊。通過前面記錄下的jpc指令的位置,把它的跳轉位置改成當前的代碼段指針位置,否則沒遇到else,那么此時的當前代碼段分配指針的位置也是上面jpc指令的轉移位置,也是通過前面記錄下的jpc位置指令的位置,把它的跳轉到當前的代碼段指針位置。然后通過遞歸調(diào)用語句分析過程分析,直到遇到until保留字,如果未對應until則出錯。五、相關代碼及運行結果實驗代碼; : 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 標示符的最大長度const int nmax = 14。// maximum address 尋址空間const int levmax = 3。// size of code array 類PCODE目標代碼數(shù)組長度(可容納代碼行數(shù))const int lineLength = 82。// symobl類型標識了不同類型的詞匯typedef char alfa[al+1]。// 三種標識符的類型 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]。// 保留字表中每一個保留字對應的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()。基地址void SaveCode()。endif : include “”// 錯誤字符串數(shù)組string PL0::errStr[]={“,”error 0001: 常數(shù)說明中“=”寫成“:=”“, ”error 0002: 常數(shù)說明中的“=”后應為數(shù)字“, ”error 0003: 常數(shù)說明中的標識符后應是“=”“, ”error 0004: const,var,procedure后應為標識符“, ”error 0005: 漏掉了‘,’或‘。’“, ”error 0011: 標識符沒說明“, ”error 0012: 賦值語句中,賦值號左部標識符屬性應是變量“, ”error 0013: 賦值語句左部標識符應是賦值號:=“, ”error 0014: call后應為標識符“, ”error 0015: call后標識符屬性應為過程“, ”error 0016: 條件語句中丟了then“, ”error 0017: 丟了end或。// PL0構造函數(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。// 初始化保留字表中每一個保// 初始化一些符號對應的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。// 判斷是否是關鍵字(二分搜索)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,li
點擊復制文檔內(nèi)容
物理相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1