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

正文內(nèi)容

編譯原理課程設(shè)計(jì)ll遞歸下降分析器(存儲(chǔ)版)

  

【正文】 irst集合和Follow集合、遞歸向下分析方法以及編程語(yǔ)言方面的知識(shí),所以,通過本次的課程設(shè)計(jì)的實(shí)踐,使得自己對(duì)編譯原理這門課的許多知識(shí)點(diǎn)有了更加深刻和具體的理解,而不再只限制于做題。使學(xué)生能將編譯理論與實(shí)際應(yīng)用結(jié)合起來(lái),提高學(xué)生軟件開發(fā)的能力。PL/0的編譯程序和目標(biāo)程序的解釋執(zhí)行程序都是用PASCAL語(yǔ)言書寫的,因此PL/0語(yǔ)言可在配備PASCAL語(yǔ)言的任何機(jī)器上實(shí)現(xiàn)。詞法分析子程序分析:詞法分析子程序名為GETSYM,功能是從源程序中讀出一個(gè)單詞符號(hào)(TOTAKEN),把它的信息放入全局變量 SYM、ID和NUM中,字符變量放入CH中,語(yǔ)法分析器需要單詞時(shí),直接從這三個(gè)變量中獲得。如果遇到不合法的字符,把SYM置成NUL。ifthenelse語(yǔ)句的處理:按if語(yǔ)句的語(yǔ)法,首先調(diào)用邏輯表達(dá)式處理過程處理if語(yǔ)句的條件,把相應(yīng)的真假值放到數(shù)據(jù)棧頂。五、相關(guān)代碼及運(yùn)行結(jié)果實(shí)驗(yàn)代碼; : include include include include include include ifndef WIRTH_ZYC_ define WIRTH_ZYC_ using namespace std。// size of code array 類PCODE目標(biāo)代碼數(shù)組長(zhǎng)度(可容納代碼行數(shù))const int lineLength = 82。// level,cann39。int val。// last number readint cc。// error array alfa a。// 符號(hào)表FILE* fin,*fout。合法void block(int lev,int tx,symset fsys)。void vardeclaration(intamp。void condition(symset fsys,int tx,int lev)。endif : include “”// 錯(cuò)誤字符串?dāng)?shù)組string PL0::errStr[]={“,”error 0001: 常數(shù)說明中“=”寫成“:=”“, ”error 0002: 常數(shù)說明中的“=”后應(yīng)為數(shù)字“, ”error 0003: 常數(shù)說明中的標(biāo)識(shí)符后應(yīng)是“=”“, ”error 0004: const,var,procedure后應(yīng)為標(biāo)識(shí)符“, ”error 0005: 漏掉了‘,’或‘。strcpy(word[4],”do“)。strcpy(word[12],”then“)。wsym[4]= DOSYM。wsym[12]= THENSYM。memset(line,0,sizeof(line))。*39。ssym[39。]= COMMA。39。strcpy(mnemonic[STO],” sto “)。// 初始化項(xiàng)開始符號(hào)集合err= 0。// code line =fopen(source,”r“)。while(ch ==39。if(sourceEnd)return。i= 1。num= 0。} else if(ch == 39。} else if(ch == 39。} else// end of extra stuff { sym= ssym[ch]。ll=strlen(line)。cx= cx+1。} }//test end// 分程序分析處理過程void PL0::block(int lev,int tx,symset fsys){ if(sourceEnd)return。if(levlevmax)error(32)。if(sym == VARSYM)// 處理變量聲明 { getsym()。if(sym ==IDENT){enter(PROCEDURE,tx,dx,lev)。if(sym == SEMICOLON){getsym()。test(tmp,declbegsys,7)。for(int i=SEMICOLON。tx,int amp。case VARIABLE:table[tx].=lev。} }//enter end// 查找標(biāo)示符在名字表中的位置int PL0::position(alfa id,int tx)//find identifier id in table { int i。if(sym=EQLamp。} elseerror(4)。dx,int lev){int upscript=0,downscript=0。getsym()。if(sym ==IDENT){i= position(id,tx)。if(sym!= SEMICOLON)error(10)。else{gen(OPR,0,16)。if(sym==LPAREN){do{getsym()。elsegetsym()。getsym()。cx1= cx。gen(JMP,0,0)。statement(tmp,tx,lev)。tmp=fsys。getsym()。for(int i=SEMICOLON。if(sym == ELSESYM){getsym()。if(sym == THENSYM)getsym()。else if(table[i].kind = PROCEDURE)gen(CAL,levtable[i].,table[i].)。}while(sym==COMMA)。}elsegetsym()。elsei=0。elseerror(13)。icout// 語(yǔ)句部分處理void PL0::statement(symset fsys,int tx,int lev){ if(sourceEnd)return。elseerror(32)。}//vardeclaration end// 數(shù)組說明處理void PL0::arraydeclaration(intamp。}elseerror(2)。tx,intamp。case ARRAY:table[tx]. = lev。}table[tx].=num。listcode(cx0)。gen(INT,0,dx)。}symset tmp=statbegsys。(SEMICOLON)。}while(sym==IDENT)。elseerror(5)。// 表指針table[tx].= cx。it++)(*it)。code[cx].l= y。fgets(line,lineLength,fin)。getch()。getch()。}while(isdigit(ch))。elsesym= IDENT。}while(kk k)。k= k+1。//error count }//error end // 詞法分析,讀取一個(gè)單詞void PL0::getsym(){ if(sourceEnd)return。// last character read}kk= al。// 初始化聲明開始符號(hào)集合 (BEGINSYM),(CALLSYM),(IFSYM),(WHILESYM)。// 初始化類PCODE指令助記符表strcpy(mnemonic[OPR],” opr “)。]= NEQ。ssym[39。(39。]= MINUS。memset(ssym,0,100*sizeof(symbol))。wsym[10]= READSYM。wsym[2]= CALLSYM。strcpy(word[10],”read“)。// 初始化存儲(chǔ)保留字strcpy(word[2],”call“)?;刂穠oid SaveCode()。void term(symset fsys,int tx,int lev)。tx,intamp。個(gè)字符void gen(fct x,int y,int z)。// 類PCODE指令助記符表symset declbegsys,statbegsys,facbegsys。// error stringchar line[lineLength]。// last symbol read alfa id。union {struct{int level,adr,size。struct instruction{ fct f。// maximum address 尋址空間const int levmax = 3。然后通過遞歸調(diào)用語(yǔ)句分析過程分析,直到遇到until保留字,如果未對(duì)應(yīng)until則出錯(cuò)。因此,本編譯程序在運(yùn)行的時(shí)候,通過主程序中調(diào)用分程序處理過程block來(lái)分析分程序部分(分程序分析過程中還可能會(huì)遞歸調(diào)用block過程),然后,判斷最后讀入的符號(hào)是否為句號(hào)。如果Getch獲得的字符是數(shù)字,則繼續(xù)用Getch獲取數(shù)字,并把它們拼成一個(gè)整數(shù)或?qū)崝?shù),然后把SYM置為 INTEGER或REAL,并把拼成的數(shù)值放入NUM變量。語(yǔ)法分析的同時(shí),提供了出錯(cuò)報(bào)告和出錯(cuò)恢復(fù)的功能。三、實(shí)驗(yàn)原理PL/0語(yǔ)言可以看成PASCAL語(yǔ)言的子集,它的編譯程序是一個(gè)編譯解釋執(zhí)行系統(tǒng)。[第四篇:編譯原理課程設(shè)計(jì)報(bào)告武 漢 紡 織 大 學(xué)編譯原理課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告學(xué)院:數(shù)學(xué)與計(jì)算機(jī) 專業(yè):計(jì)算機(jī) 姓名: 班級(jí): 學(xué)號(hào): 編譯原理編譯原理課設(shè)報(bào)告一、實(shí)驗(yàn)?zāi)康募訌?qiáng)對(duì)編譯程序的整體認(rèn)識(shí)和了解,鞏固《編譯原理》課程所學(xué)知識(shí)。首先最基本的成果是完成了課程設(shè)計(jì)的任務(wù),實(shí)現(xiàn)了編譯器的詞法分析和語(yǔ)法分析階段的功能,詞法分析主要能過濾注釋、分析出語(yǔ)法分析階段需要的Token并滿足語(yǔ)法階段的所有要求,能夠判別詞法分析階段是否出錯(cuò)和出錯(cuò)類型和位置。雖然之前寫的詞法分析的代碼已經(jīng)完成了詞法分析的需求,也是根據(jù)DFA的原理編寫的,但是在代碼結(jié)構(gòu)上卻難以體現(xiàn),在對(duì)書上的根據(jù)已知DFA寫代碼的例子進(jìn)行了詳細(xì)的研究之后,發(fā)現(xiàn)自己的代碼并沒有像書上那樣完全按照所依據(jù)的DFA各狀態(tài)轉(zhuǎn)移的關(guān)系進(jìn)行編寫,所以對(duì)代碼進(jìn)行了重寫,像書上一樣嚴(yán)格按照狀態(tài)之間轉(zhuǎn)移的方式進(jìn)行編寫,將狀態(tài)劃分成11個(gè)狀態(tài),狀態(tài)分別按1~11進(jìn)行標(biāo)注,程序也按照DFA來(lái)編寫,也實(shí)現(xiàn)了詞法分析的功能。開始著手寫代碼224。測(cè)試錯(cuò)誤檢測(cè),程序缺少分號(hào),錯(cuò)誤列表中顯示該行缺少語(yǔ)句結(jié)束標(biāo)志39。語(yǔ)法分析的功能是在詞法分析的基礎(chǔ)上將單詞序列組合成各類語(yǔ)法短語(yǔ),如“程序”,“語(yǔ)句”,“表達(dá)式” 數(shù)據(jù)結(jié)構(gòu)下圖為實(shí)現(xiàn)語(yǔ)法分析的類Grammar,屬性與方法的作用都已說明 在此處鍵入]下面終結(jié)符與非終結(jié)符意義B程序開始Z 數(shù)據(jù)類型,如int,char,float等V 標(biāo)識(shí)符S 語(yǔ)句P 語(yǔ)句塊E 加減算術(shù)表達(dá)式D 逗號(hào)表達(dá)式T 乘除算術(shù)表達(dá)式C 關(guān)系表達(dá)式L 邏輯表達(dá)式Q 標(biāo)識(shí)符或圓括號(hào)e 表示空i 表示標(biāo)識(shí)符 a)函數(shù)文法BZV()S[[在此處鍵入]b)語(yǔ)句塊文法PSP|eS{P} c)語(yǔ)句文法表達(dá)式語(yǔ)句文法SV=Egoto語(yǔ)句文法Si:SSgoto iif語(yǔ)句文法Sif(E)S[else S]while語(yǔ)句文法Swhile(E)S聲明語(yǔ)句文法SZVDD,VD|=ED|e d)表達(dá)式文法ET|E+T|ETTF|T*F|T/FCC|CL|C==C|C=LLQ|Lamp。Lexical類對(duì)外提供的函數(shù)主要有:static public int RecogId(string str, int i),static public int RecogDig(string str,int i),static public int RecogOperator(string str, int i),static public int RecogBound(string str, int i),以上幾個(gè)函數(shù)構(gòu)成了詞法分析的骨架,在Lexical類中還有其他成員變量和函數(shù),主要作為這三個(gè)函數(shù)處理過程的中間步驟,為這三個(gè)函數(shù)服務(wù)。工程文件總體上是按照九個(gè)類的格局分為十個(gè)文件,分別是九個(gè)類的聲明文件和實(shí)現(xiàn)文件。若語(yǔ)法正確,則用語(yǔ)法制導(dǎo)翻譯法進(jìn)行語(yǔ)義翻譯;生成并打印出語(yǔ)法樹;若語(yǔ)法錯(cuò)誤,要求指出出錯(cuò)性質(zhì)和出錯(cuò)位置(行號(hào))。編譯器將源程序(source language)編寫的程序作為輸入,翻譯產(chǎn)生目標(biāo)語(yǔ)言(target language)機(jī)器代碼的等價(jià)程序。將詞法分析器設(shè)計(jì)成供語(yǔ)法分析器調(diào)用的子程序。i++)if(keys[i] == key){ flag = true。a = code[j]。 || a == 39。){ temp = temp + ()。(temp)。(temp)。(temp)。)){ temp = temp + ()。a = code[j]。a = code[j]。} if(isKey(temp)){//(”保留字:“+temp)。if((a)|| a == 39。}(“輸入回車退出”)。()。analysisByLine(date[i])。//保存關(guān)鍵字static List bsf = new List()。通過本次試驗(yàn),不僅僅是我學(xué)會(huì)了C基礎(chǔ)知識(shí),而且還是我對(duì)詞法分析器有了更深入的認(rèn)識(shí),雖然在編寫詞法分析器過程中遇到了很多困難,例如:C語(yǔ)言不熟悉,對(duì)此法分析器的工作原理分析的不透徹,但在老師和同學(xué)的幫助下,我有了很大的提高,通過不斷的努力最終順利的完成了課程設(shè)計(jì),很感謝幫助我的XX同學(xué)和XX老師。今后學(xué)習(xí)的日子還很長(zhǎng),希望通過這次編譯原理的課程設(shè)計(jì),不僅對(duì)編程語(yǔ)言的進(jìn)一步復(fù)習(xí),還是對(duì)更深層次的學(xué)習(xí)作一個(gè)簡(jiǎn)單的準(zhǔn)備。本次課程設(shè)計(jì),我選的課程設(shè)計(jì)題目是LL(1)遞歸下降分析器,這個(gè)題目涉及的內(nèi)容有關(guān)課本第四章 語(yǔ)法分析——自上而下分析里面的內(nèi)容。(39?!盕T39。39。void t1()。需要先將原算術(shù)表達(dá)式方法改寫為L(zhǎng)L(1)文法為:ETE’E’+TE’|TE’| ε TFT’
點(diǎn)擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1