![語義分析程序的設(shè)計(jì)與實(shí)現(xiàn)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/11/41f4bb38-13af-487d-bdfb-c332e647ce4a/41f4bb38-13af-487d-bdfb-c332e647ce4a1.gif)
![語義分析程序的設(shè)計(jì)與實(shí)現(xiàn)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/11/41f4bb38-13af-487d-bdfb-c332e647ce4a/41f4bb38-13af-487d-bdfb-c332e647ce4a2.gif)
![語義分析程序的設(shè)計(jì)與實(shí)現(xiàn)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/11/41f4bb38-13af-487d-bdfb-c332e647ce4a/41f4bb38-13af-487d-bdfb-c332e647ce4a3.gif)
![語義分析程序的設(shè)計(jì)與實(shí)現(xiàn)_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/11/41f4bb38-13af-487d-bdfb-c332e647ce4a/41f4bb38-13af-487d-bdfb-c332e647ce4a4.gif)
![語義分析程序的設(shè)計(jì)與實(shí)現(xiàn)_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/11/41f4bb38-13af-487d-bdfb-c332e647ce4a/41f4bb38-13af-487d-bdfb-c332e647ce4a5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、語義分析程序的設(shè)計(jì)與實(shí)現(xiàn)(共17頁)-本頁僅作為文檔封面,使用時請直接刪除即可-內(nèi)頁可以根據(jù)需求調(diào)整合適字體及大小-17語義分析程序的設(shè)計(jì)與實(shí)現(xiàn)學(xué)號:學(xué)211627序號:26班號:16姓名:m實(shí)驗(yàn)日期:2010-11-23一:實(shí)驗(yàn)內(nèi)容:錯誤!未定義書簽二:實(shí)驗(yàn)要求:錯誤!未定義書簽三:實(shí)驗(yàn)方法:錯誤!未定義書簽由LEX建立YACC的詞法分析程序錯誤!未定義書簽yacc原理介紹錯誤!未定義書簽詞法分析錯誤!未定義書簽解析器如何工作錯誤!未定義書簽Yacc環(huán)境錯誤!未定義書簽常用代碼錯誤!未定義書簽第四:YAC加部名稱:錯誤!未定義書簽第五:運(yùn)行結(jié)果(源代碼見附錄)錯誤!未定義書簽第六:實(shí)驗(yàn)總結(jié)錯
2、誤!未定義書簽第七:附錄錯誤!未定義書簽附錄一:yacc程序,加注釋錯誤!未定義書簽附錄二:詞法分析器的工作原理錯誤!未定義書簽一:實(shí)驗(yàn)內(nèi)容:編寫語法分析程序,實(shí)現(xiàn)對算術(shù)表達(dá)式的語法分析,要求所分析的算術(shù)表達(dá)式由如下的文法產(chǎn)生。 E->E+T|E-T|T T->T*F|T/F|F F->id|(E)|num二:實(shí)驗(yàn)要求:在對表達(dá)式進(jìn)行分析的同時,輸出所采用的產(chǎn)生式??梢圆捎枚喾N方法 編寫遞歸調(diào)用程序,實(shí)現(xiàn)自頂向下的分析。 編寫LL(1)語法分析程序,要求: 編程實(shí)現(xiàn)算法,為給定的文法自動構(gòu)造預(yù)測分析表 編程實(shí)現(xiàn)算法,構(gòu)造LL(1)預(yù)測分析程序, 編寫語法分析程序,實(shí)現(xiàn)自底向上
3、的分析,要求:構(gòu)造識別所有活前綴的DFA構(gòu)造LR分析表編程實(shí)現(xiàn)算法,構(gòu)造LR分析程序利用yacc自動生成語法分析程序,調(diào)用LEX自動生成的詞法分析器程序三:實(shí)驗(yàn)方法:由LEX建立YACC勺詞法分析程序由LEX產(chǎn)生的詞法分析程序可用于YACCLEX編譯程序根據(jù)LEX源程序產(chǎn)生詞法分析程序yylex(),這個名字就是YACCf需要的詞法分析程序的名字。如果YAC圖調(diào)用LEX產(chǎn)生的詞法分析程序,則在YACCM程序的第三部分用語句#include"代替函數(shù)yylex()的定義,這一yylex()就可以訪問YACCW己號的名字,因?yàn)長EX的輸出時候YAC獺出文件的一部分,所有,每個LEX的動作
4、都返回YACC®道的終結(jié)符。在UNIX的環(huán)境下,如果LEX源程序在中,YACC勺源程序在中,可以使用以下命令得到所需要的分析程序。LexYacccc-oyaccdemo原理介紹Yacc是用可移植的C語言寫成的。接受的規(guī)定類別是非常一般性的:帶有去歧義規(guī)則的LALR(1)文法。Yacc提供了一個通用工具來在計(jì)算機(jī)程序的輸入上施加結(jié)構(gòu)。Yacc用戶準(zhǔn)備輸入處理的規(guī)定;它包括描述輸入結(jié)構(gòu)的規(guī)則,在識別了這些規(guī)則的時候調(diào)用的代碼,和做基本輸入的一個低層例程。Yacc接著生成一個函數(shù)來控制輸入處理。這個函數(shù)叫做解析器(parser),它調(diào)用用戶提供的低層輸入例程(詞法分析器(analyzer)
5、來從輸入流中選取基本項(xiàng)目(叫做記號(token)。依據(jù)叫做文法規(guī)則的輸入結(jié)構(gòu)規(guī)則來組織這些記號;在識別了這些規(guī)則中的某一個的時候,接著調(diào)用為這個規(guī)則提供的叫做動作的用戶代碼;動作有能力返回值并使用其他動作的值。為了便利在動作和解析器之間的通信,對動作語句要做稍微的改動。在這個上下文中使用美元符號“$”作為給Yacc的一個信號。詞法分析用戶必須提供一個詞法分析器來讀取輸入流并把記號(帶有值,如果需要的話)傳達(dá)到解析器。詞法分析器使叫做yylex的整數(shù)值的函數(shù)。這個函數(shù)返回一個整數(shù)的記號編號,它表示讀取的記號的種類。如果這個記號關(guān)聯(lián)著一個值,應(yīng)當(dāng)把它賦予外部變量yylval。為使通信得以發(fā)生,解析
6、器和詞法分析器必須在記號編號上達(dá)成一致。編號可以由Yacc或用戶來選擇。在這兩種情況下,使用C語言的“#define”機(jī)制允許詞法分析器使用符號來返回這些編號。例如,假定在Yacc規(guī)定文件的聲明段中已經(jīng)定義記號名字DIGIT。它的意圖是返回一個DIGIT記號編號,和等于這個數(shù)字的數(shù)值的一個值。倘若詞法分析器代碼位于規(guī)定文件的程序段,標(biāo)識符DIGIT將被定義為與記號DIGIT關(guān)聯(lián)的記號編號。這種機(jī)制導(dǎo)致清晰的、易于修改的詞法分析器;唯一的缺點(diǎn)是在文法中需要避免使用任何在C語言或解析器中保留的或有意義的記號名字;例如,使用記號名字if或while就一定會導(dǎo)致編譯詞法分析器時出現(xiàn)嚴(yán)峻的困難。記號名字
7、error保留給錯誤處理,不應(yīng)該隨便使用。同上所述,記號編號可以由Yacc或用戶來選擇。在缺省的條件下,編號由Yacc選擇。文字字符的缺省記號編號是它在本地字符集中的字符數(shù)值。其他名字賦予從257開始的記號編號。要把一個記號編號賦予一個記號(包括文字),可以在聲明段中記號或文字的第一次出現(xiàn)時直接跟隨著一個非負(fù)整數(shù)。這個整數(shù)被接受為這個名字或文字的記號編號。不通過這種機(jī)制定義的名字和文字保持它們的缺省定義。所有記號編號都是不同的是很重要的。構(gòu)造詞法分析器的一個有用的工具是MikeLesk8開發(fā)的Lex程序。這些詞法分析器設(shè)計(jì)用來與Yacc解析器緊密協(xié)調(diào)工作。這些詞法分析器的規(guī)定使用正則表達(dá)式而不
8、是文法規(guī)則??梢暂p易的用Lex生成非常復(fù)雜的詞法分析器,但是仍有一些語言(比如FORTRAN)適應(yīng)任何理論框架,它的詞法分析器必須手工制作。解析器如何工作Yacc把規(guī)定文件轉(zhuǎn)換成C程序,它依據(jù)給出的規(guī)定解析輸入。做從規(guī)定到解析器轉(zhuǎn)換的算法是復(fù)雜的,就不在這里討論了(更多信息參見引用)。但是,解析器自身就相對簡單了,理解它是如何工作的,盡管不是嚴(yán)格必須的,但會使錯誤修復(fù)和歧義處置更加易于理解。Yacc提供的解析器是由帶有一個棧的有窮狀態(tài)自動機(jī)組成。解析器自身還有能力讀取和記?。ń凶龀埃╨ookahead)記號)下一個輸入記號。當(dāng)前狀態(tài)總是在棧頂。有窮狀態(tài)自動機(jī)的狀態(tài)是一個給定的小整數(shù)標(biāo)簽(la
9、bel);最初時,機(jī)器是在狀態(tài)0下,棧只包含狀態(tài)0,沒有讀取超前記號。機(jī)器對它只能獲得四個動作,叫做移進(jìn)(shift)、歸約(reduce)、接受和錯誤。Yacc環(huán)境在用戶向Yacc輸入規(guī)定的時候,在多數(shù)系統(tǒng)上輸出文件是叫做的一個C程序文件(因?yàn)楸镜匚募到y(tǒng)慣例,它的名字在不同安裝中可能是不同的)。Yacc生成的函數(shù)叫yyparse;它是整數(shù)值的函數(shù)。在調(diào)用的時候,它依次重復(fù)的調(diào)用用戶提供的詞法分析器yylex來獲得輸入記號。最終,要么是檢測到一個錯誤,在這種情況下(如果沒有錯誤修復(fù)是可能的)yyparse返回值1,要么詞法分析器返回結(jié)束標(biāo)記記號并且解析器接受。在這種情況下,yyparse返回
10、值0。用戶必須為解析器提供特定數(shù)量的環(huán)境來獲得一個工作的程序。例如,同每個C程序一樣,必須被定義程序調(diào)用的main(),它最終調(diào)用yyparse。此外,叫做yyerror的一個例程在檢測到語法錯誤的時候打印一個消息。用戶必須以某種形式提供這兩個例程。為了減輕使用Yacc的起初努力,提供了帶有缺省版本的main和yyerror的一個庫。這個庫的名字是依賴系統(tǒng)的;在很多系統(tǒng)上使用到裝載器的-ly參數(shù)來訪問這個庫。到y(tǒng)yerror的參數(shù)是包含錯誤信息的字符串,通常是字符串“syntaxerror”。一般的應(yīng)用可能需要更好的消息。通常,程序跟蹤輸入行數(shù),并與檢測到的語法錯誤一起打印。外部整數(shù)變量yyc
11、har在檢測到錯誤的時候包含超前記號的編號;這對給出更好的診斷有好處。因?yàn)閙ain程序(需要讀參數(shù)等等)大多數(shù)時候是用戶提供的。Yacc庫只在小項(xiàng)目或大點(diǎn)的項(xiàng)目的早期階段有用。外部整數(shù)變量yydebug通常設(shè)置為0。如果設(shè)置為非零的值,解析器會輸出對它的動作的一個冗余的描述,包括對已經(jīng)讀入哪個輸入符號和解析器動作是什么的討論。依賴于操作系統(tǒng),可以通過使用調(diào)試系統(tǒng)來設(shè)置這個變量。常用代碼if(islower(c)yylval=c-'a'return(LETTER);if(isdigit(c)yylval=c-'0'return(DIGIT);if(c<=
12、39;z'&&c>='a'|c<='Z'&&c>='A')yylval=c;return(ID);第四:YAC咕部名稱:YACC部名稱說明yyerrorerroryyerrok、yycharYYSTYPEyydebugYACCt出文件名YACCfe成的頭文件,包含有記號定義YAC8析程序棧中的當(dāng)前記號的值由YAC餓用的用戶定義的錯誤信息打印程序YACCt誤違記號在錯誤處理之后,回到正常操作方式變了,記錄導(dǎo)致錯誤的先行記號定義分析棧值類型的預(yù)處理器符號變量,用戶置1生成有關(guān)分析動作的運(yùn)行信息
13、第五:運(yùn)行結(jié)果(源代碼見附錄)在linix下輸入的命令行依次是:Cd桌面YaccGcc-orong./rongzhmng:hdng-lmptop:桌面$yacctranslatehui.yzhang7hng-laptop:-/桌面$gccy.tab.c-ooktranslatehui.y:45:warning:conflictingtypesfar'yyerror1y,tab.c:1423:note:previous工mplititdeclarationof*yyerror,here油/ngzhang-l用to口:/桌面$Jok1+2-4+6)*2-17zhangzhang-lapto
14、p$./ok2>+syntaxerror注:Cd桌面到桌面目錄下Yacc用yacc編譯器編譯程序到C文件Gcc-orong用C編譯器生成可執(zhí)行文件./rong運(yùn)行可執(zhí)行文件輸入表達(dá)式,打印正確計(jì)算結(jié)果,否則,輸出syntaxerror第六:實(shí)驗(yàn)總結(jié)1 .用C語言實(shí)現(xiàn)詞法分析的效率較高,但用LEX可以機(jī)械的執(zhí)行程序,不用思考,雖然效率不是很高,但比較方便。Lex可以智能的讀單詞,并且按照最長匹配原則和優(yōu)先匹配原則識別單詞。Yacc則很簡單的文法式進(jìn)行分析,不需要定義遞歸的詳細(xì)飛計(jì)算法則,直接修改生成式和標(biāo)記符就可以應(yīng)用于語法分析,簡單方便,可移植性高。2 .%tokenID%tokenNU
15、M必須預(yù)先定義,否則會顯示沒有事先定義,此外對于C語言來說,isdigit(c)能判斷一個字符是否是數(shù)字,但是,本題中要識別的是整數(shù)和記號,那么或者選用lex調(diào)用表,或者,遞歸的讀取字符,分別判斷,此時,我選擇了循環(huán)判斷來解決這個問題。而這段代碼是屬于基礎(chǔ)代碼模式。if(isdigit(c)yylval=c-'0'return(NUM);elseif(c<='z'&&c>='a'|c<='Z'&&c>='A')yylval=c;return(ID);elsei
16、f(c='n')done=1;程序,是在linix環(huán)境下,用命令行執(zhí)行的,.y文件不能直接在windows環(huán)境下打開,但是,下載了ParserGenerator后,就可以直接讀取.y文件,但此時不能運(yùn)行yacc,還需要進(jìn)行環(huán)境變量(例如PASH的配置,才能在windows環(huán)境下使用yacc編譯器。這個對于未安裝虛擬機(jī),初識linix的人使用yacc提供了很大的方便。4 .通過lexyacc的編程練習(xí),明白了詞法分析和語法分析的基本操作,弄清了原理,為下一步進(jìn)行語義分析打下了良好的基礎(chǔ)。第七:附錄附錄一:yacc程序,加注釋%#include<>#include<
17、;>#include<>typedefstructxinti;intc;type;%unionintnum;char*id;typec;%token<num>NUM%token<id>ID%type<c>expr,term,factor%line:expr'n'if($>=0)printf("%dnumn",$;elseprintf("idn"););expr:expr'+'termif($=0&&($=0)($.i=$+$;$.c=0;print
18、f("E->E+T:numn");)else$.c=1;$.i=-1;printf("E->E+T:idn");)|expr'-'termif($=0&&($=0)$.i=$;$.c=0;printf("E->E-T:numn");)else$.c=1;$.i=-1;printf("E->E-T:idn");)|term$.i=$;$.c=$;if($.c=0)printf("E->T:numn");elseprintf("
19、E->T:idn"););term:term'*'factorif($=0&&($=0)$,i=$*$;$.c=0;printf("T->T*F:numn");)else($.c=1;$.i=-1;printf("T->T*F:idn");)|term7'factorif($=0&&($=0)($.i=$;$.c=0;printf("T->T/F:numn");)else($.c=1;$.i=-1;printf("T->T/F:i
20、dn");)|factor$.c=$;if($.c=0)printf("T->F:numn");elseprintf("T->F:idn");)Jfactor:ID$.c=1;$,i=-1;|'fexpr')'$.c=$;$.i=$;if($.c=0)printf("F->(E):numn");elseprintf("F->(E):idn");|NUM$,i=$1;$,c=0;%main()returnyyparse();intyylex(void)stat
21、icintdone=0;intc;if(done)return0;while(c=getchar()='');if(isdigit(c)ungetc(c,stdin);=c-'0'scanf("%d",&yylval);printf("nnumn");printf("F->num:numn");return(NUM);elseif(c<='z'&&c>='a'|c<='Z'&&c>=
22、39;A')=ID;printf("nidn");printf("F->id:idn");return(ID);elseif(c='n')done=1;returnc;voidyyerror(char*s)printf("%sn",s);%/*第一節(jié),普通的C語言聲明*/#include<>#include<>%tokenID/*說明記號,在這里說明的記號可以用于隨后的翻譯規(guī)則部分和輔助過程中*/%tokenNUM%/*文法記號聲明,默認(rèn)第一個產(chǎn)生式的左部非終結(jié)符號時候文法的開始符
23、號*/*文法產(chǎn)生式和相關(guān)語義動作*/line:expr'n'printf("%dn",$1);;/*表示輸入是表達(dá)式后面跟一個換行符*/expr:expr'+'term$=$1+$3;/*帶單引號的是終結(jié)符*/|expr'-'term$=$1-$3;/*$表示和規(guī)則左部非終結(jié)屬性,$i表示右部第i個文法的相關(guān)屬性*/|term$=$1;term:term'*'factor$=$1*$3;/*非終結(jié)符的名字要對應(yīng)*/|term'/'factor$=$1/$3;|factor$=$1;factor:ID$=$1;|'('expr')'$=$2;|NUM$=$1;%/*輔助過程*/main()returnyyparse();/*分析成功返回0,失敗返回1*/intyyl
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- DB4415T 52-2025竹薯種植技術(shù)規(guī)程
- 臨時舞臺搭建合同范本
- 個人向個人貸款合作協(xié)議合同
- 臨時用工合同格式參考
- OEM合作合同模板:oem合作詳細(xì)條款
- 個人租房合同法律文本
- 中小學(xué)學(xué)生接送服務(wù)合同協(xié)議書范本
- 為何買賣合同被視為典范
- 二手工業(yè)設(shè)備買賣合同范本詳解
- 產(chǎn)品開發(fā)合同(以完成產(chǎn)品開發(fā)任務(wù)為期限)
- 充電樁知識培訓(xùn)課件
- 2025年七年級下冊道德與法治主要知識點(diǎn)
- 2025年交通運(yùn)輸部長江口航道管理局招聘4人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 老年髖部骨折患者圍術(shù)期下肢深靜脈血栓基礎(chǔ)預(yù)防專家共識(2024版)解讀
- 廣東省廣州市2025屆高三上學(xué)期12月調(diào)研測試(零模)英語 含解析
- 偏癱足內(nèi)翻的治療
- 藥企質(zhì)量主管競聘
- 信息對抗與認(rèn)知戰(zhàn)研究-洞察分析
- 心腦血管疾病預(yù)防課件
- 手術(shù)室專科護(hù)士工作總結(jié)匯報(bào)
- 2025屆高三聽力技巧指導(dǎo)-預(yù)讀、預(yù)測
評論
0/150
提交評論