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

正文內(nèi)容

編譯原理課程設(shè)計簡介-在線瀏覽

2024-11-14 22:22本頁面
  

【正文】 在此處鍵入]目錄摘要 設(shè)計任務(wù) 設(shè)計要求(流程) 詞法分析模塊 功能 數(shù)據(jù)結(jié)構(gòu) 算法 語法分析模塊 數(shù)據(jù)結(jié)構(gòu) 符號表模塊 數(shù)據(jù)結(jié)構(gòu) 四元式模塊[在此處鍵入] 數(shù)據(jù)結(jié)構(gòu) 語義動作分析模塊 數(shù)據(jù)結(jié)構(gòu) 錯誤處理模塊 數(shù)據(jù)結(jié)構(gòu) 目標(biāo)代碼模塊 數(shù)據(jù)結(jié)構(gòu) 程序流程圖 程序說明 實(shí)驗結(jié)果 。[在此處鍵入]編譯器是將C語言翻譯為匯編語言代碼的計算機(jī)程序。通常地,源程序為高級語言(highlevel language),C語言程序,而目標(biāo)則是 機(jī)器語言的目標(biāo)代碼(object code),也就是可以在計算機(jī)硬件中運(yùn)行的機(jī)器代碼軟件程序。 要求:(1)設(shè)計詞法分析器設(shè)計各單詞的狀態(tài)轉(zhuǎn)換圖,并為不同的單詞設(shè)計種別碼。功能包括:。(2)語法分析要求用學(xué)習(xí)過的自底向上或自頂向下的分析方法等,實(shí)現(xiàn)對表達(dá)式、各種說明語句、控制語句進(jìn)行語法分析。(流程)本節(jié)主要分析程序的代碼結(jié)構(gòu)和代碼工程文件的劃分。工程分為幾個文件:,Four_Yuan,cs,)。Lexical類主要的工作是詞法分析獲取Token。在處理過程中,Token類的對象作為Lexical類的一個成員變量,配合Grammer類進(jìn)行語法分析。,Four_Yuan,cs,,他們分別是Lexical類聲明文件、Lexical類實(shí)現(xiàn)文件、Grammer類聲明文件、Grammer類實(shí)現(xiàn)文件。它們的關(guān)系是這樣的:Grammer類的一個成員變量temp首先對源程序刪除注釋,然后進(jìn)行詞法分析獲取所有Token,并將獲取的Token存儲在Token對象的tokenList(List類型)中。同時,這也是程序的流程。詞法分析階段的代碼被封裝成一個類——Lexical,Token中主要是Lexical類的聲明代碼。Lexical類的代碼結(jié)構(gòu)和主要的成員變量和函數(shù)及其含義如下圖所示:算法的基本任務(wù)是從字符串表示的源程序中識別出具有獨(dú)立意義的單詞符號,其基本思想是[在此處鍵入]根據(jù)掃描到單詞符號的第一個字符的種類,拼出相應(yīng)的單詞符號。⑴ 關(guān)鍵字表的初值。如能查到匹配的單詞,則該單詞為關(guān)鍵字,否則為一般標(biāo)識符。Token定義Token定義:Token類型(TokenType): 語法分析模塊語法分析是編譯過程的一個邏輯階段。amp。 數(shù)據(jù)結(jié)構(gòu)在此處鍵入] 四元式模塊四元式為中間代碼,編譯程序進(jìn)行完語義分析后,先生成中間代碼作為過渡,此時中間代碼與目標(biāo)代碼已經(jīng)比較相似 數(shù)據(jù)結(jié)構(gòu)[ 在此處鍵入]在語法分析中嵌入相應(yī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,_,_,_) 錯誤處理模塊 保存運(yùn)行時發(fā)現(xiàn)的錯誤,儲存行號已經(jīng)詳細(xì)信息并輸出。public static string PrintErrorList()把所有發(fā)現(xiàn)的錯誤格式化后統(tǒng)一輸出。 目標(biāo)代碼模塊目標(biāo)代碼生成把優(yōu)化后的中間代碼變換成目標(biāo)代碼,此處的目標(biāo)代碼為匯編代碼,采用單寄存器生成目標(biāo)代碼 數(shù)據(jù)結(jié)構(gòu)[在此處鍵入]對于一個基本塊有如下流程圖W:操作符,B:第一操作數(shù),C:第二操作數(shù),R:寄存器網(wǎng)上找一段話抄上 [在此處鍵入]測試打開文件測試保存文件如果沒打開文件,直接敲代碼,點(diǎn)保存時會彈出另存為窗口[在此處鍵入]測試錯誤檢測,程序缺少main函數(shù)的類型,錯誤列表中顯示第一行函數(shù)缺少錯誤類型。39。[在此處鍵入]測試優(yōu)化,輸入課件中的代碼,結(jié)果與課件一樣。直接拷貝好歹也檢查一下錯誤對于編譯原理的這次課程設(shè)計,自己經(jīng)歷了從剛開始的不懂224。理論知識的了解224。完成基本功能224。自己著手寫詞法分析的時候還不清楚詞法分析的任務(wù)內(nèi)容,還不知道詞法分析的結(jié)果是什么,詞法分析出錯的情況和類型有哪些,也總是將詞法分析和語法分析混在一起,不明白哪些錯誤在詞法分析中報,哪些錯誤在語法分析中判斷,后來經(jīng)過查書、網(wǎng)上資料、請教同學(xué)等途徑逐步清晰了詞法分析的工作內(nèi)容是從源代碼文件中獲取出Token,供語法分析使用。充分了解了詞法分析的任務(wù)之后,就開始理論知識的學(xué)習(xí)。這只是詞法分析的原始代碼,在之后還進(jìn)行了兩次徹底的改動。再后來寫報告的時候,發(fā)現(xiàn)分析出Token的那個DFA并不是最簡的,有很多多余的狀態(tài),完全可以用一個flag標(biāo)志來標(biāo)識,從而簡化代碼結(jié)構(gòu),于是又重寫了一次詞法分析函數(shù)scan()的代碼,將狀態(tài)縮減為5個,且不再用15來表示,而是像書上那樣分別取了名字(START、INNUM、INID、INDBSYM、DONE),同時為了簡化代碼將輸出Token到文件的部分從scan()中剝離開來,而在Lexical類中加了一個printToken()的函數(shù),使scan()函數(shù)邏輯更加清晰,使讀者能夠容易地將代碼與DFA進(jìn)行查看比照。首先自己對遞歸向下分析法進(jìn)行了學(xué)習(xí),將書上的幾個遞歸向下分析的偽代碼看過之后,自己對遞歸向下的分析方法的原理有了初步的認(rèn)識,大概知道了根據(jù)文法怎么分析,但是對于如何編寫代碼卻還在此處鍵入]是難以下手,于是就對照TINY語言的文法看了幾遍書后面的TINY語言的遞歸向下分析的語法分析程序,這樣就基本知道了C語言的語法分析程序怎么寫。由于在編寫代碼的過程中需要確定分析是否正確或選擇多個文法中的某一個文法進(jìn)行分析,有時必須探測需要的或下一個Token的類型,在這種情況下需要求First集合,在推導(dǎo)中若存在empty,又需要求Follow集合,所以這樣又需要我了解First集合和Follow集合,自己在程序中也根據(jù)求出的First集合和Follow集合進(jìn)行判斷,以確定程序的走向。通過這次的編譯原理課程的學(xué)習(xí)和實(shí)踐,自己獲益良多。語法分析主要能根據(jù)遞歸向下的分析思想和C文法對詞法分析獲取的Token進(jìn)行語法分析,能夠構(gòu)造出語法樹,能夠判別語法分析過程中是否出錯以及出錯位置和錯誤類型。此外,對以前那些已掌握的知識有了溫習(xí)和動手鍛煉的機(jī)會。由于以前編寫代碼都是使用JAVA語言,所以C/C++很多內(nèi)容都忘記了,通過本次的實(shí)踐,自己又重新拾起了以前的知識。此外,對于文檔的編寫和美化自己也獲得了許多有用的經(jīng)驗。通過本次課程設(shè)計掌握編譯程序調(diào)試技巧和設(shè)計編譯程序一般的原則,加深對詞法分析、語法分析、語義分析等編譯階段及實(shí)用編譯系統(tǒng)的認(rèn)識。二、實(shí)驗內(nèi)容1)仔細(xì)閱讀PL/0編譯程序文本(編譯原理(第二版)張素琴 呂映芝 蔣維杜 戴桂蘭 主編清華大學(xué)出版社),并上機(jī)調(diào)試通過。擴(kuò)充var數(shù)組:VAR (:)〈下界〉和〈上界〉可用常量標(biāo)識名。}UNTIL 可根據(jù)自己具體情況從中選擇2個以上題目進(jìn)行擴(kuò)充。PL/0的目標(biāo)程序為假想棧式計算機(jī)的匯編語言,與具體計算機(jī)無關(guān)。其編譯過程采用一趟掃描方式,以語法分析程序為核心,詞法分析和代碼生成程序都作為一個獨(dú)立的過程,當(dāng)語法分析需要讀單詞時就調(diào)用詞法分析程序,而當(dāng)語法分析正確需要生成相應(yīng)的目標(biāo)代碼時,則調(diào)用代碼生成程序。當(dāng)源程序編譯正確時,PL/0編譯程序自動調(diào)用解釋執(zhí)行程序,對目標(biāo)代碼進(jìn)行解釋執(zhí)行,并按用戶程序的要求輸入數(shù)據(jù)和輸出運(yùn)行結(jié)果。詞法分析和代碼生成作為獨(dú)立的子程序供語法分析程序調(diào)用。在源程序沒有錯誤編譯通過的情況下,調(diào)用類PCODE解釋程序解釋執(zhí)行生成的類PCODE代碼。Getch過程通過反復(fù)調(diào)用Getch子過程從源程序過獲取字符,并把它們拼成單詞。詞法分析器的分析過程:調(diào)用GETSYM時,它通過GETCH過程從源程序中獲得一個字符。查保留字表時使用了二分法查找以提高效率。如果識別出其它合法的符號(比如:賦值號、大于號、小于等于號等),則把SYM則成相應(yīng)的類型。語法分析子程序分析:語法分析子程序采用了自頂向下的遞歸子程序法,語法分析同時也根據(jù)程序的語義生成相應(yīng)三元代碼,并提供了出錯處理的機(jī)制。這些過程在結(jié)構(gòu)上構(gòu)成一個嵌套的層次結(jié)構(gòu)。由PL/0的語法圖可知:一個完整的PL/0程序是由分程序和句號構(gòu)成的。如果是句號且分程序分析中未出錯,則是一個合法的PL/0程序,可以運(yùn)行生成的代碼,否則就說明源PL/0程序是不合法的,輸出出錯提示即可。接下去記錄下代碼段分配位置(即下面生成的jpc指令的位置),然后生成 條件轉(zhuǎn)移jpc指令(遇0或遇假轉(zhuǎn)移),轉(zhuǎn)移地址未知暫時填0。then后的語句處理完后,如果遇到else,就調(diào)用語句處理過程處理else語句后面的語句或語句塊,這時當(dāng)前代碼段分配指針的位置就應(yīng)該是上面的jpc指令的轉(zhuǎn)移位置。Repeat語句的處理:首先用CX1變量記下當(dāng)前代碼段分配位置,作為循環(huán)的開始位置。調(diào)用條件表達(dá)式處理過程生成相應(yīng)代碼把結(jié)果放在數(shù)據(jù)棧頂,再生成條件轉(zhuǎn)移指令,轉(zhuǎn)移位置為上面記錄的CX1。const int norw = 16。// length of identifier table 標(biāo)示符表的長度(容量)const int al = 10。// digits in numbers 數(shù)字的最大長度 const int amax = 2047。// maximum depth of block nesting 最大允許的塊嵌套層數(shù) const int cxmax = 200。// 行緩沖區(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。// alfa類型用于標(biāo)識符 typedef enum {CONSTANT,VARIABLE,PROCEDURE,ARRAY} obj0。// functions typedef set symset。// function code int l。t big than levmaxint a。t big than amax }。obj0 kind。}inOther。}other。class PL0 {protected:bool listswitch,sourceEnd。// last character read symbol sym。// last identifier read int num。// character count int ll。int cx。// code line string errStr[]。// code line vector errorString。// 詞法分析器中用于臨時存放正在分析的詞instruction code[cxmax+1]。// 保留字表symbol wsym[norw+1]。// 一些符號對應(yīng)的symbol類型表合 char mnemonic[8][6]。// 聲明開始、表達(dá)式開始和項開始符號集 Table table[txmax+1]。public:PL0(char* source,char*destination)。}void error(int n)。個單詞void getch()。程序區(qū)void test(symset s1,symset s2,int n)。void enter(obj0 k,int amp。dx,int lev)。的位置void constdeclaration(intamp。dx,int lev)。tx,intamp。void listcode(int cx0)。void expression(symset fsys,int tx,int lev)。void factor(symset fsys,int tx,int lev)。void arraydeclaration(intamp。 dx,int lev)。執(zhí)行程序int base(int l,int b,int s[])。// 構(gòu)造函數(shù)// 析構(gòu)函數(shù)// 出錯處理,打印出錯// 詞法分析,讀取一// 漏掉空格,讀取一// 生成目標(biāo)代碼,并送入目標(biāo)// 測試當(dāng)前單詞符號是否// 分程序分析處理過程// 登入名字表// 查找標(biāo)示符在名字表中// 常量定義處理// 變量說明處理// 列出目標(biāo)代碼清單// 語句部分處理// 表達(dá)式處理// 項處理// 因子處理// 條件處理// 數(shù)組說明處理// 對目標(biāo)代碼的解釋// 通過靜態(tài)鏈求出數(shù)據(jù)區(qū)的 // 保存代碼}?!? ”error 0006: 過程說明后的符號不正確(應(yīng)是語句開始符或過程開始符)“, ”error 0007: 應(yīng)是語句開始符“, ”error 0008: 過程體內(nèi)語句部分的后跟符不正確“, ”error 0009: 程序皆為丟了句號‘.’“, ”error 0010: 語句之間漏了‘?!? ”error 0018: while型循環(huán)語句中丟了do“, ”error 0019: 語句后的標(biāo)識符不正確“, ”error 0020: 應(yīng)為關(guān)系運(yùn)算符“, ”error 0021: 表達(dá)式內(nèi)標(biāo)識符屬性不能是過程“, ”error 0022: 表達(dá)式中漏掉了右括號‘)’“, ”error 0023: 因子后的非法符號“, ”error 0024: 表達(dá)式開始符不能是此符號“,
點(diǎn)擊復(fù)制文檔內(nèi)容
外語相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1