




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、語義分析程序的設計與實現(xiàn)(共17頁)-本頁僅作為文檔封面,使用時請直接刪除即可-內頁可以根據(jù)需求調整合適字體及大小-17語義分析程序的設計與實現(xiàn)學號:學211627序號:26班號:16姓名:m實驗日期:2010-11-23一:實驗內容:錯誤!未定義書簽二:實驗要求:錯誤!未定義書簽三:實驗方法:錯誤!未定義書簽由LEX建立YACC的詞法分析程序錯誤!未定義書簽yacc原理介紹錯誤!未定義書簽詞法分析錯誤!未定義書簽解析器如何工作錯誤!未定義書簽Yacc環(huán)境錯誤!未定義書簽常用代碼錯誤!未定義書簽第四:YAC加部名稱:錯誤!未定義書簽第五:運行結果(源代碼見附錄)錯誤!未定義書簽第六:實驗總結錯
2、誤!未定義書簽第七:附錄錯誤!未定義書簽附錄一:yacc程序,加注釋錯誤!未定義書簽附錄二:詞法分析器的工作原理錯誤!未定義書簽一:實驗內容:編寫語法分析程序,實現(xiàn)對算術表達式的語法分析,要求所分析的算術表達式由如下的文法產生。 E->E+T|E-T|T T->T*F|T/F|F F->id|(E)|num二:實驗要求:在對表達式進行分析的同時,輸出所采用的產生式。可以采用多種方法 編寫遞歸調用程序,實現(xiàn)自頂向下的分析。 編寫LL(1)語法分析程序,要求: 編程實現(xiàn)算法,為給定的文法自動構造預測分析表 編程實現(xiàn)算法,構造LL(1)預測分析程序, 編寫語法分析程序,實現(xiàn)自底向上
3、的分析,要求:構造識別所有活前綴的DFA構造LR分析表編程實現(xiàn)算法,構造LR分析程序利用yacc自動生成語法分析程序,調用LEX自動生成的詞法分析器程序三:實驗方法:由LEX建立YACC勺詞法分析程序由LEX產生的詞法分析程序可用于YACCLEX編譯程序根據(jù)LEX源程序產生詞法分析程序yylex(),這個名字就是YACCf需要的詞法分析程序的名字。如果YAC圖調用LEX產生的詞法分析程序,則在YACCM程序的第三部分用語句#include"代替函數(shù)yylex()的定義,這一yylex()就可以訪問YACCW己號的名字,因為LEX的輸出時候YAC獺出文件的一部分,所有,每個LEX的動作
4、都返回YACC®道的終結符。在UNIX的環(huán)境下,如果LEX源程序在中,YACC勺源程序在中,可以使用以下命令得到所需要的分析程序。LexYacccc-oyaccdemo原理介紹Yacc是用可移植的C語言寫成的。接受的規(guī)定類別是非常一般性的:帶有去歧義規(guī)則的LALR(1)文法。Yacc提供了一個通用工具來在計算機程序的輸入上施加結構。Yacc用戶準備輸入處理的規(guī)定;它包括描述輸入結構的規(guī)則,在識別了這些規(guī)則的時候調用的代碼,和做基本輸入的一個低層例程。Yacc接著生成一個函數(shù)來控制輸入處理。這個函數(shù)叫做解析器(parser),它調用用戶提供的低層輸入例程(詞法分析器(analyzer)
5、來從輸入流中選取基本項目(叫做記號(token)。依據(jù)叫做文法規(guī)則的輸入結構規(guī)則來組織這些記號;在識別了這些規(guī)則中的某一個的時候,接著調用為這個規(guī)則提供的叫做動作的用戶代碼;動作有能力返回值并使用其他動作的值。為了便利在動作和解析器之間的通信,對動作語句要做稍微的改動。在這個上下文中使用美元符號“$”作為給Yacc的一個信號。詞法分析用戶必須提供一個詞法分析器來讀取輸入流并把記號(帶有值,如果需要的話)傳達到解析器。詞法分析器使叫做yylex的整數(shù)值的函數(shù)。這個函數(shù)返回一個整數(shù)的記號編號,它表示讀取的記號的種類。如果這個記號關聯(lián)著一個值,應當把它賦予外部變量yylval。為使通信得以發(fā)生,解析
6、器和詞法分析器必須在記號編號上達成一致。編號可以由Yacc或用戶來選擇。在這兩種情況下,使用C語言的“#define”機制允許詞法分析器使用符號來返回這些編號。例如,假定在Yacc規(guī)定文件的聲明段中已經定義記號名字DIGIT。它的意圖是返回一個DIGIT記號編號,和等于這個數(shù)字的數(shù)值的一個值。倘若詞法分析器代碼位于規(guī)定文件的程序段,標識符DIGIT將被定義為與記號DIGIT關聯(lián)的記號編號。這種機制導致清晰的、易于修改的詞法分析器;唯一的缺點是在文法中需要避免使用任何在C語言或解析器中保留的或有意義的記號名字;例如,使用記號名字if或while就一定會導致編譯詞法分析器時出現(xiàn)嚴峻的困難。記號名字
7、error保留給錯誤處理,不應該隨便使用。同上所述,記號編號可以由Yacc或用戶來選擇。在缺省的條件下,編號由Yacc選擇。文字字符的缺省記號編號是它在本地字符集中的字符數(shù)值。其他名字賦予從257開始的記號編號。要把一個記號編號賦予一個記號(包括文字),可以在聲明段中記號或文字的第一次出現(xiàn)時直接跟隨著一個非負整數(shù)。這個整數(shù)被接受為這個名字或文字的記號編號。不通過這種機制定義的名字和文字保持它們的缺省定義。所有記號編號都是不同的是很重要的。構造詞法分析器的一個有用的工具是MikeLesk8開發(fā)的Lex程序。這些詞法分析器設計用來與Yacc解析器緊密協(xié)調工作。這些詞法分析器的規(guī)定使用正則表達式而不
8、是文法規(guī)則??梢暂p易的用Lex生成非常復雜的詞法分析器,但是仍有一些語言(比如FORTRAN)適應任何理論框架,它的詞法分析器必須手工制作。解析器如何工作Yacc把規(guī)定文件轉換成C程序,它依據(jù)給出的規(guī)定解析輸入。做從規(guī)定到解析器轉換的算法是復雜的,就不在這里討論了(更多信息參見引用)。但是,解析器自身就相對簡單了,理解它是如何工作的,盡管不是嚴格必須的,但會使錯誤修復和歧義處置更加易于理解。Yacc提供的解析器是由帶有一個棧的有窮狀態(tài)自動機組成。解析器自身還有能力讀取和記?。ń凶龀埃╨ookahead)記號)下一個輸入記號。當前狀態(tài)總是在棧頂。有窮狀態(tài)自動機的狀態(tài)是一個給定的小整數(shù)標簽(la
9、bel);最初時,機器是在狀態(tài)0下,棧只包含狀態(tài)0,沒有讀取超前記號。機器對它只能獲得四個動作,叫做移進(shift)、歸約(reduce)、接受和錯誤。Yacc環(huán)境在用戶向Yacc輸入規(guī)定的時候,在多數(shù)系統(tǒng)上輸出文件是叫做的一個C程序文件(因為本地文件系統(tǒng)慣例,它的名字在不同安裝中可能是不同的)。Yacc生成的函數(shù)叫yyparse;它是整數(shù)值的函數(shù)。在調用的時候,它依次重復的調用用戶提供的詞法分析器yylex來獲得輸入記號。最終,要么是檢測到一個錯誤,在這種情況下(如果沒有錯誤修復是可能的)yyparse返回值1,要么詞法分析器返回結束標記記號并且解析器接受。在這種情況下,yyparse返回
10、值0。用戶必須為解析器提供特定數(shù)量的環(huán)境來獲得一個工作的程序。例如,同每個C程序一樣,必須被定義程序調用的main(),它最終調用yyparse。此外,叫做yyerror的一個例程在檢測到語法錯誤的時候打印一個消息。用戶必須以某種形式提供這兩個例程。為了減輕使用Yacc的起初努力,提供了帶有缺省版本的main和yyerror的一個庫。這個庫的名字是依賴系統(tǒng)的;在很多系統(tǒng)上使用到裝載器的-ly參數(shù)來訪問這個庫。到y(tǒng)yerror的參數(shù)是包含錯誤信息的字符串,通常是字符串“syntaxerror”。一般的應用可能需要更好的消息。通常,程序跟蹤輸入行數(shù),并與檢測到的語法錯誤一起打印。外部整數(shù)變量yyc
11、har在檢測到錯誤的時候包含超前記號的編號;這對給出更好的診斷有好處。因為main程序(需要讀參數(shù)等等)大多數(shù)時候是用戶提供的。Yacc庫只在小項目或大點的項目的早期階段有用。外部整數(shù)變量yydebug通常設置為0。如果設置為非零的值,解析器會輸出對它的動作的一個冗余的描述,包括對已經讀入哪個輸入符號和解析器動作是什么的討論。依賴于操作系統(tǒng),可以通過使用調試系統(tǒng)來設置這個變量。常用代碼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析程序棧中的當前記號的值由YAC餓用的用戶定義的錯誤信息打印程序YACCt誤違記號在錯誤處理之后,回到正常操作方式變了,記錄導致錯誤的先行記號定義分析棧值類型的預處理器符號變量,用戶置1生成有關分析動作的運行信息
13、第五:運行結果(源代碼見附錄)在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運行可執(zhí)行文件輸入表達式,打印正確計算結果,否則,輸出syntaxerror第六:實驗總結1 .用C語言實現(xiàn)詞法分析的效率較高,但用LEX可以機械的執(zhí)行程序,不用思考,雖然效率不是很高,但比較方便。Lex可以智能的讀單詞,并且按照最長匹配原則和優(yōu)先匹配原則識別單詞。Yacc則很簡單的文法式進行分析,不需要定義遞歸的詳細飛計算法則,直接修改生成式和標記符就可以應用于語法分析,簡單方便,可移植性高。2 .%tokenID%tokenNU
15、M必須預先定義,否則會顯示沒有事先定義,此外對于C語言來說,isdigit(c)能判斷一個字符是否是數(shù)字,但是,本題中要識別的是整數(shù)和記號,那么或者選用lex調用表,或者,遞歸的讀取字符,分別判斷,此時,我選擇了循環(huán)判斷來解決這個問題。而這段代碼是屬于基礎代碼模式。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文件,但此時不能運行yacc,還需要進行環(huán)境變量(例如PASH的配置,才能在windows環(huán)境下使用yacc編譯器。這個對于未安裝虛擬機,初識linix的人使用yacc提供了很大的方便。4 .通過lexyacc的編程練習,明白了詞法分析和語法分析的基本操作,弄清了原理,為下一步進行語義分析打下了良好的基礎。第七:附錄附錄一: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%/*文法記號聲明,默認第一個產生式的左部非終結符號時候文法的開始符
23、號*/*文法產生式和相關語義動作*/line:expr'n'printf("%dn",$1);;/*表示輸入是表達式后面跟一個換行符*/expr:expr'+'term$=$1+$3;/*帶單引號的是終結符*/|expr'-'term$=$1-$3;/*$表示和規(guī)則左部非終結屬性,$i表示右部第i個文法的相關屬性*/|term$=$1;term:term'*'factor$=$1*$3;/*非終結符的名字要對應*/|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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 請示整改報告范文
- HCIA路由交換技術實戰(zhàn)(微課版)-課后習題答案
- 二零二五年度正規(guī)欠款合同范本:商業(yè)保理業(yè)務合作協(xié)議
- 二零二五養(yǎng)老院院民文化參觀出行合作協(xié)議
- 二零二五年度高端定制門安裝與設計合同
- 二零二五年度電梯維保服務與智能化升級合同范本
- 二零二五年度企業(yè)ERP系統(tǒng)采購合作協(xié)議
- MySQL教程(新體系-綜合應用實例視頻)(第4版)習題及答案 -第08章
- 二零二五年度教育行業(yè)年合同制工人養(yǎng)老保險合同
- 二零二五年度健康養(yǎng)老項目終止合作框架協(xié)議
- 大學計算機概論(Windows10+Office2016)PPT完整全套教學課件
- 四川峨勝水泥集團股份有限公司環(huán)保搬遷3000td熟料新型干法大壩水泥生產線環(huán)境影響評價報告書
- 《公路工程計量與計價》說課草稿
- 2023年教師招聘面試高中政治《堅持以人民為中心》試講稿 統(tǒng)編版 必修三
- Barrett食管醫(yī)學知識講解
- 數(shù)獨課件完整版
- 西師大版六年級數(shù)學下冊全冊知識點匯總
- DCF-現(xiàn)金流貼現(xiàn)模型-Excel模版(dcf-估值模型)
- 江西2023年分宜九銀村鎮(zhèn)銀行社會招聘上岸提分題庫3套【500題帶答案含詳解】
- 一年級美術課后服務教案-1
- GB/T 22095-2008鑄鐵平板
評論
0/150
提交評論