實(shí)驗(yàn)四編譯用Yacc工具構(gòu)造語(yǔ)法分析器_第1頁(yè)
實(shí)驗(yàn)四編譯用Yacc工具構(gòu)造語(yǔ)法分析器_第2頁(yè)
實(shí)驗(yàn)四編譯用Yacc工具構(gòu)造語(yǔ)法分析器_第3頁(yè)
實(shí)驗(yàn)四編譯用Yacc工具構(gòu)造語(yǔ)法分析器_第4頁(yè)
實(shí)驗(yàn)四編譯用Yacc工具構(gòu)造語(yǔ)法分析器_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、實(shí)驗(yàn)4 用Yacc工具構(gòu)造語(yǔ)法分析器一、實(shí)驗(yàn)?zāi)康恼莆找七M(jìn)-歸約技術(shù)語(yǔ)法分析技術(shù),利用語(yǔ)法分析器生成工具Yacc/Bison實(shí)現(xiàn)語(yǔ)法分析器的構(gòu)造。二、實(shí)驗(yàn)內(nèi)容利用語(yǔ)法分析器生成工具Yacc/Bison編寫一個(gè)語(yǔ)法分析程序,與詞法分析器結(jié)合,能夠根據(jù)語(yǔ)言的上下文無關(guān)文法,識(shí)別輸入的單詞序列是否文法的句子。源語(yǔ)言的文法定義見教材附錄 A.1,p394,要求實(shí)現(xiàn)完整的語(yǔ)言。三、實(shí)驗(yàn)要求個(gè)人完成,提交實(shí)驗(yàn)報(bào)告。實(shí)驗(yàn)報(bào)告中給出采用測(cè)試源代碼片斷,及其對(duì)應(yīng)的最右推導(dǎo)過程(形式可以自行考慮,如依次給出推導(dǎo)使用的產(chǎn)生式)。例如,程序片斷四、實(shí)驗(yàn)思路本次實(shí)驗(yàn)是一次實(shí)現(xiàn)詞法分析和語(yǔ)法分析的過程,詞法分析的內(nèi)容與第二

2、次實(shí)驗(yàn)類似,對(duì)關(guān)鍵詞,數(shù)字,標(biāo)識(shí)符以及其他類型的字符進(jìn)行識(shí)別,分別返回對(duì)應(yīng)的數(shù)據(jù)類型,這個(gè)過程相對(duì)來說是比較簡(jiǎn)單的,由于有特定的詞法分析過程的格式,很容易將代碼編寫出來。語(yǔ)法分析的過程則給出了文法以及相應(yīng)的語(yǔ)義動(dòng)作,代碼的編寫相對(duì)比較復(fù)雜。首先,在D:FlexBison的目錄下建立一個(gè)文件夾,我命名為expmt3,將bison.exe和flex.exe放到expmt3目錄下。然后編寫mylex.l文件和myyacc.y文件,在dos下切換到expmt3目錄下,先用命令flex mylex.l生成lex.yy.c文件,再用命令bison d myyacc.y生成myyacc.tab.c文件和my

3、yacc.tab.h文件,在這個(gè)目錄中再新建一個(gè)example.c文件,用vc+打開這個(gè)文件,然后編譯這個(gè)文件,再將前兩步生成的lex.yy.c、myyacc.tab.c和myyacc.tab.h文件加入到工程中,再編譯并連接生成可執(zhí)行文件。最后測(cè)試程序的正確性要在expmt3的debug目錄下創(chuàng)建一個(gè)測(cè)試文件test.txt,將測(cè)試片段放入其中,然后在dos界面運(yùn)行程序,知道產(chǎn)生正確的結(jié)果,實(shí)驗(yàn)就完成了。五、具體代碼Mylex.l%option noyywrap%#include#include#include#include#include myYacc.tab.h%delim tnws

4、delim+letter A-Za-zdigit 0-9%ws if printf(IF );return(IF);else printf(ELSE );return(ELSE);int printf(INT ); return(BASIC);float printf(FLOAT ); return(BASIC);break printf(BREAK);return(BREAK);do printf(DO );return(DO);while printf(WHILE );return(WHILE);true printf(TRUE );return(TRUE);index printf(IN

5、DEX ); return(INDEX);bool printf(BOOL ); return(BASIC);char printf(CHAR ); return(BASIC);real printf(real);return(REAL);false printf(FLASE ); return(FALSE);a-zA-Z_a-zA-Z0-9_* printf(ID);return(ID);+-?0-9+ printf(NUM);return(NUM);+-?0-9*.0-9+ printf(NUM);return(NUM); printf(LT );return(); printf(GT )

6、;return();= printf(GE );return(GE);+ printf(+ );return(+);- printf(- );return(-); printf( );return(); printf( );return(); printf();return(); printf();return();( printf();return();) printf();return(); printf(;);return(;);, printf(,);return(,);& printf(&);return(AND);| printf(|);return(OR);%Myyacc.y%#

7、include#includeextern int yylex();extern int yyerror();%token NUM%token ID %token IF WHILE DO BREAK REAL TRUE FALSE BASIC ELSE INDEX GE LE NE EQ AND OR%program : block printf(program-blockn); ;block : decls stmts printf(block-decls stmtsn); ;decls : | decls decl printf(decls-decls decln); ;decl : ty

8、pe ID ; printf(decl-type id;n); ;type : type NUM printf(type-typenumn); | BASIC printf(type-basicn); ;stmts : | stmts stmt printf(stmts-stmts stmtn); ;stmt : matched_stmt printf(stmt-matched_stmtn); | open_stmt printf(stmt-open_stmtn); ;open_stmt: IF ( booL ) stmt printf(open_stmt-if(bool)stmtn); |

9、IF ( booL ) matched_stmt ELSE open_stmt printf(open_stmt-if(bool) matched_stmt else open_stmtn); ;matched_stmt: IF ( booL ) matched_stmt ELSE matched_stmt printf(matched_stmt-if(bool) matched_stmt else matched_stmtn); | other printf(matched_stmt-othern); ;other: loc = booL ; printf(stmt-loc=bool;n);

10、 | WHILE ( booL ) stmt printf(stmt-while(bool)stmtn); | DO stmt WHILE ( booL ) ; printf(stmt-do stmt while(bool);n); | BREAK ; printf(stmt-break;n); | block printf(stmt-blockn); ;loc : loc booL printf(loc-locbooln); | ID printf(loc-idn); ;booL : booL OR join printf(bool-bool|joinn); | join printf(bo

11、ol-joinn); ;join : join AND equality printf(join-join&equalityn); | equality printf(join-equalityn); ;equality : equality EQ rel printf(equality-equality=reln); | equality NE rel printf(equality-equality!=reln); | rel printf(equality-reln); ;rel : expr exprexprexpr=exprn); | expr expr printf(rel-exp

12、rexprn); | expr printf(rel-exprn); ;expr : expr + term printf(expr-expr+termn); | expr - term printf(expr-expr-termn); | term printf(expr-termn); ;term : term * unary printf(term-term*unaryn); | term / unary printf(term-term/unaryn); | unary printf(term-unaryn); ;unary : ! unary printf(unary-!unaryn

13、); | - unary printf(unary-unaryn); | factor printf(unary-factorn); ;factor : ( booL ) printf(factor-(bool)n); | loc printf(factor-locn); | NUM printf(factor-numn); | REAL printf(factor-realn); | TRUE printf(factor-truen); | FALSE printf(factor-falsen); ;%int yyerror(s)char *s; fprintf(stderr,syntact

14、ic error:%sn,s); return 0;6、 實(shí)驗(yàn)結(jié)果7、 實(shí)驗(yàn)總結(jié)實(shí)驗(yàn)中的注意事項(xiàng):(1)一個(gè)由 Yacc 生成的解析器調(diào)用 yylex() 函數(shù)來獲得標(biāo)記。對(duì)于由 Lex 生成的 lexer 來說,要和 Yacc 結(jié)合使用,每當(dāng) Lex 中匹配一個(gè)模式時(shí)都必須返回一個(gè)標(biāo)記。 因此 Lex 中匹配模式時(shí)的動(dòng)作一般格式為: pattern /* do smthg*/ return TOKEN_NAME; 于是 Yacc 就會(huì)獲得返回的標(biāo)記。當(dāng) Yacc 編譯一個(gè)帶有 _d 標(biāo)記的myyacc .y文件時(shí),會(huì)生成一個(gè)頭文件myyacc.tab.h,它對(duì)每個(gè)標(biāo)記都有 #define 的定義。 如果 Lex 和

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論