語法分析器yacc試驗(yàn)報(bào)告_第1頁
語法分析器yacc試驗(yàn)報(bào)告_第2頁
語法分析器yacc試驗(yàn)報(bào)告_第3頁
語法分析器yacc試驗(yàn)報(bào)告_第4頁
語法分析器yacc試驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

大學(xué)學(xué)院實(shí)驗(yàn)報(bào)告學(xué)號:姓名:專業(yè):班級:第周課程名稱?編譯原理課程設(shè)計(jì)實(shí)驗(yàn)課時(shí)實(shí)驗(yàn)項(xiàng)目基于YACC勺語法解析器實(shí)驗(yàn)時(shí)間實(shí)驗(yàn)?zāi)康膶?shí)驗(yàn)環(huán)境

1.學(xué)習(xí)基于YACC勺語法解析器的構(gòu)造方法。2.學(xué)習(xí)C-的語法構(gòu)造。?ParserGeneratorVC++基于YACC勾造詞法解析器的方法1YACC文件格式Lex文件分成三個(gè)部分,分別為definitions、rules以及auxiliaryroutines,中間用%切割開。實(shí)驗(yàn)內(nèi)容(算法、程序、步驟和方法)

Definitions包括要加入到生成的C程序的頭部的代碼,包括#include語句、#define語句及一些全局變量的定義。token也在Definitions部分定義,YACC?定,必定自己定義token,他將token定義為一系列從258開始的正整數(shù),如在Definition部分加入了以下定義:%tokenNUMBER則]在生成的C代碼中:#defineNUMBE。自然這個(gè)值也能夠由用戶定義。Definitions中同時(shí)還定義了YACC中的返回值種類,由于rules部分是由固疋符號來代替一個(gè)Symbol的返回值,其默認(rèn)種類為int,若是用戶布望返回其他種類的值(如ParseTree樹結(jié)點(diǎn)),則能夠在Definition中定義Symbol的返回值。第一使用一(%union{}包括所有需要的返回值種類,疋義%type<t>{}其中包括所有返回值為t的Symbol。Definitions中能夠定義語法的結(jié)合性來除掉二義性,包括兩個(gè)符號%left表示左結(jié)合和%right表示右結(jié)合。rules部分定義所有語法,以及語法鑒別出后執(zhí)行的操作。比方:declaration:var_declaration{$$=$1;}|fun_declaration{$$=$1;}J表示產(chǎn)生式左邊,$n表示產(chǎn)生式右邊第n個(gè)字符的返回值,這條規(guī)則表示var_declaration或fun_declaration鑒別出后,將其賦值給declaration。Auxiliary部分包括rules部分使用的一些輔助函數(shù),同時(shí),main函數(shù)也在其中定義。YACC中會自動(dòng)調(diào)用yylex()獲取token,默認(rèn)yylex()返回int,代表鑒別出的token,若是文件結(jié)束返回0。因此一般會進(jìn)行以下定義:staticTypeyylex(void){returngetToken();}Type就是int,特地代表token值。Auxiliary部分還可以夠定義YACC勺出錯(cuò)辦理函數(shù),yyerror(char*s),其中s是YAC(在遇到錯(cuò)誤時(shí)產(chǎn)生的錯(cuò)誤信息。YACC勺入口函數(shù)為:yyparse(),調(diào)用這個(gè)函數(shù)即開始語法解析過程。數(shù)據(jù)構(gòu)造我們需要再YACC中構(gòu)造ParseTree,必定定義樹結(jié)點(diǎn),觀察C-的語法,我們能夠?qū)⒄Z法分為三類:Declaration:包括函數(shù)與變量的聲明。Statement:包括各種語句,如循環(huán)語句,選擇語句等。Expression:包括各種表達(dá)式及各種變量、常量。我們也將節(jié)點(diǎn)種類分為Dec、Stmt、Exp。節(jié)點(diǎn)種類定義以下:typedefstructtreeNode{果有NUM則立刻用一個(gè)變量暫存,由于后邊的鑒別會把TokenValue覆蓋掉。女口:

type_specifieridLBRACKETNUM{/*

記錄

NUM*/currentNum=atoi(tokenString);}RBRACKETSEMICOLON若是有ID,與NU同理,用立刻一個(gè)字符串暫存。3.若是產(chǎn)生式右邊有節(jié)余一個(gè)的右邊的Symbo作為他的兒子,若是有字,則不需建立結(jié)點(diǎn),直接賦值給結(jié)點(diǎn)中明)。如:

Symbol,則必定為$$建立結(jié)點(diǎn),并將ID、NUMtype_specfier,和要點(diǎn)的變量或忽略(結(jié)點(diǎn)種類自動(dòng)說iteration_stmt:WHILELPARENTHESISexpressionRPARENTHESISstatement{$$=newStmtNode(WhileK);$$->child[0]=$3;$$->child[1]=$5;}4.若是右邊僅有一個(gè)Symbol,若是為Token,則返回Token值,若是為Nonterminal,直接$$=$1。如:statement:expression_stmt{$$=$1;}5.若是有左遞歸,則一致用下面代碼辦理,注意,左遞歸的結(jié)點(diǎn)儲藏在sibling中而不是child中。tatement_list:statement_liststatement{TreeNode*t=$1;if(t!=NULL){while(t->sibling!=NULL)t=t->sibling;t->sibling=$2;$$=$1;}else$$=$2;}|{$$=NULL;}YACC是由yylex()供應(yīng)Token,因此需要編寫getToken()函數(shù),使用lex或手工實(shí)現(xiàn)均可,但需注意,其返回的Token值必定是YACC中定義的int,也就是說,不能夠在別處定義TokenTypeo在main函數(shù)中調(diào)用yyparse()即可進(jìn)行編譯。實(shí)驗(yàn)源程序以下:數(shù)據(jù)記錄和計(jì)算

/*aprogramtoperformselectionsortona10elementarray.*/intx[10];intminioc(inta[],intlow,inthigh){inti;intx;intk;k=low;x=a[low];i=low+1;while(i<high){if(a[i]<x){x=a[i];k=i;}}returnk;}生成的ParseTree以下所示:|__Arrname:x,type:INT|__Numbertype:INT,value:10|__FunDecname:minioc,return:INT|__ArrParamname:a,type:INT|__ValParamname:low,type:INT|__ValParamname:high,type:INT|__Comp結(jié)論(結(jié)果)

|__Varname:i,type:INT|__Varname:x,type:INT|__Varname:k,type:INT|__Assign|__VarIdname:k|__VarIdname:low|__Assign|__VarIdname:x|__ArrIdname:low|__VarIdname:low|__Assign|__VarIdname:i|__Expressiontype:+|__VarIdname:low|__Numbertype:INT,value:1|__While|__Expressiontype:<|__VarIdname:i都被記錄在結(jié)點(diǎn)中。經(jīng)過本實(shí)驗(yàn),我熟悉了C-的語法規(guī)則,學(xué)習(xí)了ParseTree的構(gòu)造方法。2.學(xué)習(xí)了經(jīng)過

YACC

勾造語法解析器的方法,認(rèn)識了

YACC

勺三個(gè)部分:declarations

、rules

、auxiliary

的聲明、實(shí)現(xiàn)以及如

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論