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

正文內容

編譯原理課程設計ll遞歸下降分析器-文庫吧在線文庫

2024-10-29 06:36上一頁面

下一頁面
  

【正文】 T’*FT’|/FT’| ε F(E)| i 然后再為每個非終結符設計一個對應的函數(shù),通過各函數(shù)之間的遞歸調用從而實現(xiàn)遞歸下降語法分析的功能。FIRST(aj)=f (i185。第三,在自上而下分析過程中,當一個非終結符用某一候選匹配成功時,這種成功可能僅是暫時的。首先,是文法的左遞歸性問題。語法分析器的任務是識別和處理比單詞更大的語法單位。即,當試圖用P去匹配輸入串時,我們會發(fā)現(xiàn),在沒有識別任何輸入符號的情況下,有得重新要求P去進行新的匹配。嚴重的低效使得這種分析法只有理論意義,而在實踐上價值不大。當一個文法滿足LL(1)條件時,我們就可以為它構造一個不帶回溯的自上而下分析程序,這個分析程序是由一組遞歸過程組成的,每個過程對應文法的一個非終結符。//存儲輸入句子 int temp=0。coutinputstream。||inputstream[temp]!=39。){} else if(inputstream[temp]==39。課程總結通過一個星期的努力,終于把編譯原理課程設計給完成了。在用C++編程時,基本上沒有遇到什么困難,只需把所有遞歸過程都寫出就行了。學習更好的知識重在基礎,編譯原理的學習為我們提供非常好的橋梁和道路。using 。//保存關系運算符static List ys = new List()。foreach(string id in key){ (id)。()。 39。j++。}} else {//(”標識符:“+temp)。a = code[j]。a = code[j]。while((a)){temp = temp + ()。){ temp = temp + ()。){ temp = temp + ()。){ temp = temp + ()。}// (”關系符“+temp)。/39。(temp)。} else { flag = false。若語法正確,則用語法制導翻譯法進行語義翻譯;生成并打印出語法樹;若語法錯誤,要求指出出錯性質和出錯位置(行號)。 要求:(1)設計詞法分析器設計各單詞的狀態(tài)轉換圖,并為不同的單詞設計種別碼。工程分為幾個文件:,Four_Yuan,cs,)。它們的關系是這樣的:Grammer類的一個成員變量temp首先對源程序刪除注釋,然后進行詞法分析獲取所有Token,并將獲取的Token存儲在Token對象的tokenList(List類型)中。⑴ 關鍵字表的初值。 數(shù)據(jù)結構在此處鍵入] 四元式模塊四元式為中間代碼,編譯程序進行完語義分析后,先生成中間代碼作為過渡,此時中間代碼與目標代碼已經(jīng)比較相似 數(shù)據(jù)結構[ 在此處鍵入]在語法分析中嵌入相應的語義動作,生成四元式 數(shù)據(jù)結構[[在此處鍵入] 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,_,_,_) 錯誤處理模塊 保存運行時發(fā)現(xiàn)的錯誤,儲存行號已經(jīng)詳細信息并輸出。[在此處鍵入]測試優(yōu)化,輸入課件中的代碼,結果與課件一樣。自己著手寫詞法分析的時候還不清楚詞法分析的任務內容,還不知道詞法分析的結果是什么,詞法分析出錯的情況和類型有哪些,也總是將詞法分析和語法分析混在一起,不明白哪些錯誤在詞法分析中報,哪些錯誤在語法分析中判斷,后來經(jīng)過查書、網(wǎng)上資料、請教同學等途徑逐步清晰了詞法分析的工作內容是從源代碼文件中獲取出Token,供語法分析使用。首先自己對遞歸向下分析法進行了學習,將書上的幾個遞歸向下分析的偽代碼看過之后,自己對遞歸向下的分析方法的原理有了初步的認識,大概知道了根據(jù)文法怎么分析,但是對于如何編寫代碼卻還在此處鍵入]是難以下手,于是就對照TINY語言的文法看了幾遍書后面的TINY語言的遞歸向下分析的語法分析程序,這樣就基本知道了C語言的語法分析程序怎么寫。此外,對以前那些已掌握的知識有了溫習和動手鍛煉的機會。二、實驗內容1)仔細閱讀PL/0編譯程序文本(編譯原理(第二版)張素琴 呂映芝 蔣維杜 戴桂蘭 主編清華大學出版社),并上機調試通過。其編譯過程采用一趟掃描方式,以語法分析程序為核心,詞法分析和代碼生成程序都作為一個獨立的過程,當語法分析需要讀單詞時就調用詞法分析程序,而當語法分析正確需要生成相應的目標代碼時,則調用代碼生成程序。Getch過程通過反復調用Getch子過程從源程序過獲取字符,并把它們拼成單詞。語法分析子程序分析:語法分析子程序采用了自頂向下的遞歸子程序法,語法分析同時也根據(jù)程序的語義生成相應三元代碼,并提供了出錯處理的機制。接下去記錄下代碼段分配位置(即下面生成的jpc指令的位置),然后生成 條件轉移jpc指令(遇0或遇假轉移),轉移地址未知暫時填0。const int norw = 16。// 行緩沖區(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。t big than levmaxint a。}other。// character count int ll。// 詞法分析器中用于臨時存放正在分析的詞instruction code[cxmax+1]。public:PL0(char* source,char*destination)。void enter(obj0 k,int amp。tx,intamp。void arraydeclaration(intamp?!? ”error 0006: 過程說明后的符號不正確(應是語句開始符或過程開始符)“, ”error 0007: 應是語句開始符“, ”error 0008: 過程體內語句部分的后跟符不正確“, ”error 0009: 程序皆為丟了句號‘.’“, ”error 0010: 語句之間漏了‘。strcpy(word[5],”else“)。strcpy(word[13],”until“)。wsym[5]= ELSESYM。wsym[13]= UNTILSYM。ssym[39。]= TIMES。)39。ssym[39。]= GTR。strcpy(mnemonic[CAL],” cal “)。cc= 0。fout=fopen(destination,”w“)。 39。}while(isalpha(ch)||isdigit(ch))。j= norw。sym= NUMBER。:39。// extra stuff added to support 39。// 其它符號的賦值getch()。if(line[ll1]==10)ll。}//gen end// 測試當前單詞符號是否合法void PL0::test(symset s1,symset s2,int n){ if(sourceEnd)return。int dx。do{if(sym == CONSTSYM)// 處理常量聲明{getsym()。do{vardeclaration(tx,dx,lev)。getsym()。symset tmp = statbegsys。}while((sym)!=())。i ((symbol)i)。dx,int lev){ tx= tx+1。table[tx].=dx。strcpy(table[0].name, id)。amp。}// constdeclaration end// 變量說明處理void PL0::vardeclaration(intamp。getsym()。} if(sym!= RPAREN)} error(32)。if(i == 0)error(11)。if(i!= 0)gen(STO,levtable[i].,table[i].)。gen(STO,levtable[i].,table[i].)。symset tmp=fsys。} gen(OPR,0,15)。} } else if(sym ==IFSYM){ getsym()。gen(JPC,0,0)。code[cx1].a=cx。tmp=statbegsys。for(i=SEMICOLON。else if(sym=PERIOD){error(26)。symset tmp=fsys。code[cx1].a= cx。condition(tmp,tx,lev)。if(i == 0)error(11)。gen(OPR,0,14)。while((sym)!=())getsym()。if(sym==IDENT)i=position(id,tx)。if(sym ==BECOMES)getsym()。if(listswitch)for(i= cx0。} if(sym == COMMA)getsym()。} elseerror(4)。getsym()。}//position end// 常量定義處理void PL0::constdeclaration(intamp。break。num=0。test(fsys,s2,8)。cx0= cx。}elseerror(5)。symset tmp = fsys。elseerror(5)。} if(sym ==SEMICOLON)getsym()。// 變量的個數(shù) tx0= tx。it!=()。}code[cx].f= x。}cc= 0。){sym= GEQ。){sym= BECOMES。getch()。}while(i j)sym= wsym[k]。kk= kk1。// 檢測一個單詞長度 do{ if(k al){a[k]= ch。err= err+1。 39。(CONSTSYM),(VARSYM),(PROCSYM)。strcpy(mnemonic[LIT],” lit “)。39。]= EQL。ssym[39。39。memset(code,0,sizeof(code))。wsym[9]= PROCSYM。wsym[1]= BEGINSYM。strcpy(word[9],”procedure“)。strcpy(word[1],”begin“)。執(zhí)行程序int base(int l,int b,int s[])。void expression(symset fsys,int tx,int lev)。的位置void constdeclaration(intamp。個單詞void getch()。// 一些符號對應的symbol類型表合 char mnemonic[8][6]。// code line string errStr[]。// last character read symbol sym。obj0 kind。// functions typedef set symset。// digits in numbers 數(shù)字的最大長度 const int amax = 2047。Repeat語句的處理:首先用CX1變量記下當前代碼段分配位置,作為循環(huán)的開始位置。由PL/0的語法圖可知:一個完整的PL/0程序是由分程序和句號構成的。查保留字表時使用了二分法查找以提高效率。詞法分析和代碼生成作為獨立的子程序供語法分析程序調用。}UNTIL 可根據(jù)自己具體情況從中選擇2個以上題目進行擴充。此外,對于文檔的編寫和美化自己也獲得了許多有用的經(jīng)驗。通過這次的編譯原理課程的學習和實踐,自己獲益良多。這只是詞法分析的原始代碼,在之后還進行了兩次徹底的改動。理論知識的了解224。 目標代碼模塊目標代碼生成把優(yōu)化后的中間代碼變換成目標代碼,此處的目標代碼為匯編代碼,采用單寄存器生成目標代碼 數(shù)據(jù)結構[在此處鍵入]對于一個基本塊有如下流程圖W:操作符,B:第一操作數(shù),C:第二操作數(shù),R:寄存器網(wǎng)上找一段話抄上 [在此處鍵入]測試打開文件測試保存文件如果沒打開文件,直接敲代碼,點保存時會彈出另存為窗口[在此處鍵入]測試錯誤檢測,程序缺少main函數(shù)的類型,錯誤列表中顯示第一行函數(shù)缺少錯誤類型。Token定義Token定義:Token類型(TokenType): 語法分析模塊語法分析是編譯過程的一個邏輯階段。詞法分析階段的代碼被封裝成一個類——Lexical,Token中主要是Lexical類的聲明代碼。在處理過程中,Token類的對象作為Lexical類的一個成員變量,配合Grammer類進行語法分析。(2)語法分析要求用學習過的自底向上或自頂向下的分析方法等,實現(xiàn)對表達式、各種說明語句、控制語句進行語法分析。[在此處鍵入]編譯器是將C語言翻譯為匯編語言代碼的計算機程序。} } }第三篇:編譯原理課程設計課 程 設 計 報 告設計題目:一個簡單文法的編譯器前端的設計與實現(xiàn)班級: 計算機1206 組長學號:201239 組長姓名:閆智宣 指導教師:李曉華 設計時間:2014年12月[在此處鍵入]設計分工組長學號及姓名: 20123974閆智宣分工:語法分析,四元式生成,目標代碼優(yōu)化及生成 組員1學號及姓
點擊復制文檔內容
黨政相關相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1