




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度燒烤店品牌合作及店鋪轉(zhuǎn)讓合同
- 2025年度借條補(bǔ)充協(xié)議:個(gè)人創(chuàng)業(yè)貸款與政府補(bǔ)貼銜接
- 2025農(nóng)村住房安全責(zé)任追究及賠償合同
- 2025年商務(wù)、清洗服務(wù)項(xiàng)目建議書
- 2025年運(yùn)維軟件項(xiàng)目建議書
- 液體制劑機(jī)械項(xiàng)目績(jī)效評(píng)估報(bào)告
- 環(huán)境規(guī)制對(duì)企業(yè)綠色技術(shù)創(chuàng)新影響的研究
- H-CEUS聯(lián)合SWE對(duì)轉(zhuǎn)移性淋巴結(jié)的診斷效能分析
- 冷庫(kù)排管攀爬機(jī)器人自主運(yùn)動(dòng)規(guī)劃方法研究
- 高效率濾波功率放大器的研究與設(shè)計(jì)
- 2023-2024學(xué)年高中信息技術(shù)必修一滬科版(2019)第三單元項(xiàng)目六《 解決溫標(biāo)轉(zhuǎn)換問題-認(rèn)識(shí)程序和程序設(shè)計(jì)語(yǔ)言》教學(xué)設(shè)計(jì)
- 【湘教版】2024-2025學(xué)年七年級(jí)數(shù)學(xué)下冊(cè)教學(xué)工作計(jì)劃(及進(jìn)度表)
- 《急性左心衰》課件
- 二零二五版洗煤廠與礦業(yè)公司合作洗煤業(yè)務(wù)合同3篇
- 上海市第一至十八屆高一物理基礎(chǔ)知識(shí)競(jìng)賽試題及答案
- 2024李娜一建管理講義修訂版
- 2024院感培訓(xùn)課件
- 2024-2030年中國(guó)稅務(wù)師事務(wù)所行業(yè)管理模式及投資前景展望報(bào)告版
- 護(hù)理試講考核15分鐘
- 2024預(yù)防流感課件完整版
- 2025天貓服飾春夏趨勢(shì)白皮書
評(píng)論
0/150
提交評(píng)論