編譯原理詞法分析器.doc_第1頁(yè)
編譯原理詞法分析器.doc_第2頁(yè)
編譯原理詞法分析器.doc_第3頁(yè)
編譯原理詞法分析器.doc_第4頁(yè)
編譯原理詞法分析器.doc_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

一、實(shí)驗(yàn)?zāi)康模?通過(guò)設(shè)計(jì)編制調(diào)試一個(gè)具體的詞法分析程序,加深對(duì)詞法分析原理的理解。并掌握在對(duì)程序設(shè)計(jì)語(yǔ)言源程序進(jìn)行掃描過(guò)程中將其分解為各類單詞的詞法分析方法。編制一個(gè)讀單詞過(guò)程,從輸入的源程序中,識(shí)別出各個(gè)具有獨(dú)立意義的單詞,即基本保留字、標(biāo)識(shí)符、常數(shù)、運(yùn)算符、分隔符五大類。并依次輸出各個(gè)單詞的內(nèi)部編碼及單詞符號(hào)自身值。(遇到錯(cuò)誤時(shí)可顯示“Error”,然后跳過(guò)錯(cuò)誤部分繼續(xù)顯示) 二、實(shí)驗(yàn)預(yù)習(xí)提示 1、 詞法分析器的功能和輸出格式詞法分析器的功能是輸入源程序,輸出單詞符號(hào)。詞法分析器的單詞符號(hào)常常表示成以下的二元式(單詞種別碼,單詞符號(hào)的屬性值)。本實(shí)驗(yàn)中,采用的是一類符號(hào)一種別碼的方式。2、 單詞的BNF表示標(biāo)識(shí)符- 字母字母數(shù)字串字母數(shù)字串-字母字母數(shù)字串|數(shù)字字母數(shù)字串|下劃線字母數(shù)字串|無(wú)符號(hào)整數(shù)- 數(shù)字?jǐn)?shù)字串?dāng)?shù)字串- 數(shù)字?jǐn)?shù)字串 |加法運(yùn)算符- +減法運(yùn)算符- -大于關(guān)系運(yùn)算符- 大于等于關(guān)系運(yùn)算符- =3、“超前搜索”方法詞法分析時(shí),常常會(huì)用到超前搜索方法。如當(dāng)前待分析字符串為“a+”,當(dāng)前字符為,此時(shí),分析器倒底是將其分析為大于關(guān)系運(yùn)算符還是大于等于關(guān)系運(yùn)算符呢?顯然,只有知道下一個(gè)字符是什么才能下結(jié)論。于是分析器讀入下一個(gè)字符+,這時(shí)可知應(yīng)將解釋為大于運(yùn)算符。但此時(shí),超前讀了一個(gè)字符+,所以要回退一個(gè)字符,詞法分析器才能正常運(yùn)行。在分析標(biāo)識(shí)符,無(wú)符號(hào)整數(shù)等時(shí)也有類似情況。4、模塊結(jié)構(gòu)三、實(shí)驗(yàn)過(guò)程和指導(dǎo): (一)準(zhǔn)備: 1.閱讀課本有關(guān)章節(jié),明確語(yǔ)言的語(yǔ)法,寫出基本保留字、標(biāo)識(shí)符、常數(shù)、運(yùn)算符、分隔符和程序例。2.初步編制好程序。3.準(zhǔn)備好多組測(cè)試數(shù)據(jù)。(二)上課上機(jī): 將源代碼拷貝到機(jī)上調(diào)試,發(fā)現(xiàn)錯(cuò)誤,再修改完善。第二次上機(jī)調(diào)試通過(guò)。(三)程序要求:程序輸入/輸出示例:如源程序?yàn)镃語(yǔ)言。輸入如下一段:main() int a,b;a = 10; b = a + 20;要求輸出如右圖。(2,”main”)(5,”(“)(5,”)“)(5,”“)(1,”int”)(2,”a”)(5,”,”)(2,”b”)(5,”;”)(2,”a”)(4,”=”)(3,”10”)(5,”;”)(2,”b”)(4,”=”)(2,”a”)(4,”+”)(3,”20”)(5,”;”)(5,”“)要求:識(shí)別保留字:if、int、for、while、do、return、break、continue;單詞種別碼為1。其他的都識(shí)別為標(biāo)識(shí)符;單詞種別碼為2。常數(shù)為無(wú)符號(hào)整形數(shù);單詞種別碼為3。運(yùn)算符包括:+、-、*、/、=、=、=、!= ;單詞種別碼為4。分隔符包括:,、;、(、); 單詞種別碼為5。以上為參考,具體可自行增刪。(四)程序思路(僅供參考):這里以開始定義的C語(yǔ)言子集的源程序作為詞法分析程序的輸入數(shù)據(jù)。在詞法分析中,自文件頭開始掃描源程序字符,一旦發(fā)現(xiàn)符合“單詞”定義的源程序字符串時(shí),將它翻譯成固定長(zhǎng)度的單詞內(nèi)部表示,并查填適當(dāng)?shù)男畔⒈怼=?jīng)過(guò)詞法分析后,源程序字符串(源程序的外部表示)被翻譯成具有等長(zhǎng)信息的單詞串(源程序的內(nèi)部表示),并產(chǎn)生兩個(gè)表格:常數(shù)表和標(biāo)識(shí)符表,它們分別包含了源程序中的所有常數(shù)和所有標(biāo)識(shí)符。0.定義部分:定義常量、變量、數(shù)據(jù)結(jié)構(gòu)。1.初始化:從文件將源程序全部輸入到字符緩沖區(qū)中。2.取單詞前:去掉多余空白。3.取單詞后:去掉多余空白(可選,看著辦)。4.取單詞:利用實(shí)驗(yàn)一的成果讀出單詞的每一個(gè)字符,組成單詞,分析類型。(關(guān)鍵是如何判斷取單詞結(jié)束?取到的單詞是什么類型的單詞?)5.顯示結(jié)果。(五)練習(xí)該實(shí)驗(yàn)的目的和思路:程序開始變得復(fù)雜起來(lái),可能是大家目前編過(guò)的程序中最復(fù)雜的,但相對(duì)于以后的程序來(lái)說(shuō)還是簡(jiǎn)單的。因此要認(rèn)真把握這個(gè)過(guò)渡期的練習(xí)。本實(shí)驗(yàn)和以后的實(shí)驗(yàn)相關(guān)。通過(guò)練習(xí),掌握對(duì)字符進(jìn)行靈活處理的方法。(六)為了能設(shè)計(jì)好程序,注意以下事情:1.模塊設(shè)計(jì):將程序分成合理的多個(gè)模塊(函數(shù)),每個(gè)模塊做具體的同一事情。2.寫出(畫出)設(shè)計(jì)方案:模塊關(guān)系簡(jiǎn)圖、流程圖、全局變量、函數(shù)接口等。3.編程時(shí)注意編程風(fēng)格:空行的使用、注釋的使用、縮進(jìn)的使用等。 一、實(shí)驗(yàn)?zāi)康模?根據(jù)某一文法編制調(diào)試遞歸下降分析程序,以便對(duì)任意輸入的符號(hào)串進(jìn)行分析。本次實(shí)驗(yàn)的目的主要是加深對(duì)遞歸下降分析法的理解。二、實(shí)驗(yàn)預(yù)習(xí)提示 1、遞歸下降分析法的功能詞法分析器的功能是利用函數(shù)之間的遞歸調(diào)用模擬語(yǔ)法樹自上而下的構(gòu)造過(guò)程。2、遞歸下降分析法的前提改造文法:消除二義性、消除左遞歸、提取左因子,判斷是否為L(zhǎng)L(1)文法,3、遞歸下降分析法實(shí)驗(yàn)設(shè)計(jì)思想及算法為G的每個(gè)非終結(jié)符號(hào)U構(gòu)造一個(gè)遞歸過(guò)程,不妨命名為U。U的產(chǎn)生式的右邊指出這個(gè)過(guò)程的代碼結(jié)構(gòu):(1)若是終結(jié)符號(hào),則和向前看符號(hào)對(duì)照,若匹配則向前進(jìn)一個(gè)符號(hào);否則出錯(cuò)。(2)若是非終結(jié)符號(hào),則調(diào)用與此非終結(jié)符對(duì)應(yīng)的過(guò)程。當(dāng)A的右部有多個(gè)產(chǎn)生式時(shí),可用選擇結(jié)構(gòu)實(shí)現(xiàn)。具體為:(1)對(duì)于每個(gè)非終結(jié)符號(hào)U-u1|u2|un處理的方法如下:U( )ch=當(dāng)前符號(hào);if(ch可能是u1字的開頭) 處理u1的程序部分;else if(ch可能是u2字的開頭)處理u2的程序部分;else error()(2)對(duì)于每個(gè)右部u1-x1x2xn的處理架構(gòu)如下:處理x1的程序;處理x2的程序;處理xn的程序;(3)如果右部為空,則不處理。(4)對(duì)于右部中的每個(gè)符號(hào)xi 如果xi為終結(jié)符號(hào):if(xi= = 當(dāng)前的符號(hào)) NextChar(); return; else出錯(cuò)處理 如果xi為非終結(jié)符號(hào),直接調(diào)用相應(yīng)的過(guò)程xi() 說(shuō)明: NextChar為前進(jìn)一個(gè)字符函數(shù)。三、實(shí)驗(yàn)過(guò)程和指導(dǎo): (一)準(zhǔn)備: 1.閱讀課本有關(guān)章節(jié),2.考慮好設(shè)計(jì)方案;3.設(shè)計(jì)出模塊結(jié)構(gòu)、測(cè)試數(shù)據(jù),初步編制好程序。(二)上課上機(jī): 將源代碼拷貝到機(jī)上調(diào)試,發(fā)現(xiàn)錯(cuò)誤,再修改完善。第二次上機(jī)調(diào)試通過(guò)。(三)程序要求:程序輸入/輸出示例: 對(duì)下列文法,用遞歸下降分析法對(duì)任意輸入的符號(hào)串進(jìn)行分析: (1)E-TG(2)G-+TG|TG(3)G-(4)T-FS(5)S-*FS|/FS(6)S-(7)F-(E)(8)F-i輸出的格式如下:(1)遞歸下降分析程序,編制人:姓名,學(xué)號(hào),班級(jí)(2)輸入一以#結(jié)束的符號(hào)串(包括+*/()i#):在此位置輸入符號(hào)串例如:i+i*i# (3)輸出結(jié)果:i+i*i#為合法符號(hào)串 備注:輸入一符號(hào)串如i+i*#,要求輸出為“非法的符號(hào)串”。引用也要改變)。注意:1.表達(dá)式中允許使用運(yùn)算符(+-*/)、分割符(括號(hào))、字符I,結(jié)束符#; 2.如果遇到錯(cuò)誤的表達(dá)式,應(yīng)輸出錯(cuò)誤提示信息(該信息越詳細(xì)越好);3.對(duì)學(xué)有余力的同學(xué),可以詳細(xì)的輸出推導(dǎo)的過(guò)程,即詳細(xì)列出每一步使用的產(chǎn)生式。 (四)程序思路(僅供參考):0.定義部分:定義常量、變量、數(shù)據(jù)結(jié)構(gòu)。1.初始化:從文件將輸入符號(hào)串輸入到字符緩沖區(qū)中。2.利用遞歸下降分析法分析,對(duì)每個(gè)非終結(jié)符編寫函數(shù),在主函數(shù)中調(diào)用文法開始符號(hào)的函數(shù)。(五)練習(xí)該實(shí)驗(yàn)的目的和思路: 程序開始變得復(fù)雜起來(lái),需要利用到程序設(shè)計(jì)語(yǔ)言的知識(shí)和大量編程技巧,遞歸下降分析法是一種較實(shí)用的分析法,通過(guò)這個(gè)練習(xí)可大大提高軟件開發(fā)能力。通過(guò)練習(xí),掌握函數(shù)間相互調(diào)用的方法。(六)為了能設(shè)計(jì)好程序,注意以下事情:1.模塊設(shè)計(jì):將程序分成合理的多個(gè)模塊(函數(shù)),每個(gè)模塊做具體的同一事情。2.寫出(畫出)設(shè)計(jì)方案:模塊關(guān)系簡(jiǎn)圖、流程圖、全局變量、函數(shù)接口等。3.編程時(shí)注意編程風(fēng)格:空行的使用、注釋的使用、縮進(jìn)的使用等。一、實(shí)驗(yàn)?zāi)康模?根據(jù)某一文法編制調(diào)試LL(1)分析程序,以便對(duì)任意輸入的符號(hào)串進(jìn)行分析。本次實(shí)驗(yàn)的目的主要是加深對(duì)預(yù)測(cè)分析LL(1)分析法的理解。二、實(shí)驗(yàn)預(yù)習(xí)提示 1、LL(1)分析法的功能LL(1)分析法的功能是利用LL(1)控制程序根據(jù)顯示棧棧頂內(nèi)容、向前看符號(hào)以及LL(1)分析表,對(duì)輸入符號(hào)串自上而下的分析過(guò)程。2、LL(1)分析法的前提改造文法:消除二義性、消除左遞歸、提取左因子,判斷是否為L(zhǎng)L(1)文法,3、LL(1)分析法實(shí)驗(yàn)設(shè)計(jì)思想及算法三、實(shí)驗(yàn)過(guò)程和指導(dǎo): (一)準(zhǔn)備: 1.閱讀課本有關(guān)章節(jié),2.考慮好設(shè)計(jì)方案;3.設(shè)計(jì)出模塊結(jié)構(gòu)、測(cè)試數(shù)據(jù),初步編制好程序。(二)上課上機(jī): 將源代碼拷貝到機(jī)上調(diào)試,發(fā)現(xiàn)錯(cuò)誤,再修改完善。第二次上機(jī)調(diào)試通過(guò)。(三)程序要求:程序輸入/輸出示例: 對(duì)下列文法,用LL(1)分析法對(duì)任意輸入的符號(hào)串進(jìn)行分析: (1)E-TG(2)G-+TG|TG(3)G-(4)T-FS(5)S-*FS|/FS(6)S-(7)F-(E)(8)F-i輸出的格式如下:(1)LL(1)分析程序,編制人:姓名,學(xué)號(hào),班級(jí)(2)輸入一以#結(jié)束的符號(hào)串(包括+*/()i#):在此位置輸入符號(hào)串 (3)輸出過(guò)程如下: 步驟 分析棧 剩余輸入串 所用產(chǎn)生式 1Ei+i*i#E-TG (4)輸入符號(hào)串為非法符號(hào)串(或者為合法符號(hào)串) 備注:(1)在“所用產(chǎn)生式”一列中如果對(duì)應(yīng)有推導(dǎo)則寫出所用產(chǎn)生式;如果為匹配終結(jié)符則寫明匹配的終結(jié)符;如分析異常出錯(cuò)則寫為“分析出錯(cuò)”;若成功結(jié)束則寫為“分析成功”。(2) 在此位置輸入符號(hào)串為用戶自行輸入的符號(hào)串。(3)上述描述的輸出過(guò)程只是其中一部分的。 注意:1.表達(dá)式中允許使用運(yùn)算符(+-*/)、分割符(括號(hào))、字符i,結(jié)束符#; 2.如果遇到錯(cuò)誤的表達(dá)式,應(yīng)輸出錯(cuò)誤提示信息(該信息越詳細(xì)越好);3.對(duì)學(xué)有余力的同學(xué),測(cè)試用的表達(dá)式事先放在文本文件中,一行存放一個(gè)表達(dá)式,同時(shí)以分號(hào)分割。同時(shí)將預(yù)期的輸出結(jié)果寫在另一個(gè)文本文件中,以便和輸出進(jìn)行對(duì)照; (四)程序思路(僅供參考):模塊結(jié)構(gòu):(1)定義部分:定義常量、變量、數(shù)據(jù)結(jié)構(gòu)。(2)初始化:設(shè)立LL(1)分析表、初始化變量空間(包括堆棧、結(jié)構(gòu)體、數(shù)組、臨時(shí)變量等);(3)控制部分:從鍵盤輸入一個(gè)表達(dá)式符號(hào)串;(4)利用LL(1)分析算法進(jìn)行表達(dá)式處理:根據(jù)LL(1)分析表對(duì)表達(dá)式符號(hào)串進(jìn)行堆棧(或其他)操作,輸出分析結(jié)果,如果遇到錯(cuò)誤則顯示錯(cuò)誤信息。(五)練習(xí)該實(shí)驗(yàn)的目的和思路: 程序相當(dāng)復(fù)雜,需要利用到大量的編譯原理,也用到了大量編程技巧和數(shù)據(jù)結(jié)構(gòu),通過(guò)這個(gè)練習(xí)可大大提高軟件開發(fā)能力。(六)為了能設(shè)計(jì)好程序,注意以下事情:1.模塊設(shè)計(jì):將程序分成合理的多個(gè)模塊(函數(shù)),每個(gè)模塊做具體的同一事情。2.寫出(畫出)設(shè)計(jì)方案:模塊關(guān)系簡(jiǎn)圖、流程圖、全局變量、函數(shù)接口等。3.編程時(shí)注意編程風(fēng)格:空行的使用、注釋的使用、縮進(jìn)的使用等。一、實(shí)驗(yàn)?zāi)康模?將非后綴式用來(lái)表示的算術(shù)表達(dá)式轉(zhuǎn)換為用逆波蘭式來(lái)表示的算術(shù)表達(dá)式,并計(jì)算用逆波蘭式來(lái)表示的算術(shù)表達(dá)式的值。二、實(shí)驗(yàn)預(yù)習(xí)提示 1、逆波蘭式定義將運(yùn)算對(duì)象寫在前面,而把運(yùn)算符號(hào)寫在后面。用這種表示法表示的表達(dá)式也稱做后綴式。逆波蘭式的特點(diǎn)在于運(yùn)算對(duì)象順序不變,運(yùn)算符號(hào)位置反映運(yùn)算順序。采用逆波蘭式可以很好的表示簡(jiǎn)單算術(shù)表達(dá)式,其優(yōu)點(diǎn)在于易于計(jì)算機(jī)處理表達(dá)式。2、產(chǎn)生逆波蘭式的前提中綴算術(shù)表達(dá)式3、逆波蘭式生成的實(shí)驗(yàn)設(shè)計(jì)思想及算法(1)首先構(gòu)造一個(gè)運(yùn)算符棧,此運(yùn)算符在棧內(nèi)遵循越往棧頂優(yōu)先級(jí)越高的原則。(2)讀入一個(gè)用中綴表示的簡(jiǎn)單算術(shù)表達(dá)式,為方便起見,設(shè)該簡(jiǎn)單算術(shù)表達(dá)式的右端多加上了優(yōu)先級(jí)最低的特殊符號(hào)“#”。(3)從左至右掃描該算術(shù)表達(dá)式,從第一個(gè)字符開始判斷,如果該字符是數(shù)字,則分析到該數(shù)字串的結(jié)束并將該數(shù)字串直接輸出。(4)如果不是數(shù)字,該字符則是運(yùn)算符,此時(shí)需比較優(yōu)先關(guān)系。做法如下:將該字符與運(yùn)算符棧頂?shù)倪\(yùn)算符的優(yōu)先關(guān)系相比較。如果,該字符優(yōu)先關(guān)系高于此運(yùn)算符棧頂?shù)倪\(yùn)算符,則將該運(yùn)算符入棧。倘若不是的話,則將此運(yùn)算符棧頂?shù)倪\(yùn)算符從棧中彈出,將該字符入棧。(5)重復(fù)上述操作(1)-(2)直至掃描完整個(gè)簡(jiǎn)單算術(shù)表達(dá)式,確定所有字符都得到正確處理,我們便可以將中綴式表示的簡(jiǎn)單算術(shù)表達(dá)式轉(zhuǎn)化為逆波蘭表示的簡(jiǎn)單算術(shù)表達(dá)式。3、逆波蘭式計(jì)算的實(shí)驗(yàn)設(shè)計(jì)思想及算法(1)構(gòu)造一個(gè)棧,存放運(yùn)算對(duì)象。(2)讀入一個(gè)用逆波蘭式表示的簡(jiǎn)單算術(shù)表達(dá)式。(3)自左至右掃描該簡(jiǎn)單算術(shù)表達(dá)式并判斷該字符,如果該字符是運(yùn)算對(duì)象,則將該字符入棧。若是運(yùn)算符,如果此運(yùn)算符是二目運(yùn)算符,則將對(duì)棧頂部的兩個(gè)運(yùn)算對(duì)象進(jìn)行該運(yùn)算,將運(yùn)算結(jié)果入棧,并且將執(zhí)行該運(yùn)算的兩個(gè)運(yùn)算對(duì)象從棧頂彈出。如果該字符是一目運(yùn)算符,則對(duì)棧頂部的元素實(shí)施該運(yùn)算,將該棧頂部的元素彈出,將運(yùn)算結(jié)果入棧。(4)重復(fù)上述操作直至掃描完整個(gè)簡(jiǎn)單算術(shù)表達(dá)式的逆波蘭式,確定所有字符都得到正確處理,我們便可以求出該簡(jiǎn)單算術(shù)表達(dá)式的值。三、實(shí)驗(yàn)過(guò)程和指導(dǎo): (一)準(zhǔn)備: 1.閱讀課本有關(guān)章節(jié),2.考慮好設(shè)計(jì)方案;3.設(shè)計(jì)出模塊結(jié)構(gòu)、測(cè)試數(shù)據(jù),初步編制好程序。(二)上課上機(jī): 將源代碼拷貝到機(jī)上調(diào)試,發(fā)現(xiàn)錯(cuò)誤,再修改完善。第二次上機(jī)調(diào)試通過(guò)。(三)程序要求:程序輸入/輸出示例: 輸出的格式如下:(1)逆波蘭式的生成及計(jì)算程序,編制人:姓名,學(xué)號(hào),班級(jí)(2)輸入一以#結(jié)束的中綴表達(dá)式(包括+*/()數(shù)字#):在此位置輸入符號(hào)串如(28+68)*2# (3)逆波蘭式為:28&68+2* (4)逆波蘭式28&68+2*計(jì)算結(jié)果為192備注:(1)在生成的逆波蘭式中如果兩個(gè)數(shù)相連則用&分隔,如28和68,中間用&分隔;(2)在此位置輸入符號(hào)串為用戶自行輸入的符號(hào)串。 注意:1.表達(dá)式中允許使用運(yùn)算符(+-*/)、分割符(括號(hào))、數(shù)字,結(jié)束符#; 2.如果遇到錯(cuò)誤的表達(dá)式,應(yīng)輸出錯(cuò)誤提示信息(該信息越詳細(xì)越好);3.對(duì)學(xué)有余力的同學(xué),測(cè)試用的表達(dá)式事先放在文本文件中,一行存放一個(gè)表達(dá)式,同時(shí)以分號(hào)分割。同時(shí)將預(yù)期的輸出結(jié)果寫在另一個(gè)文本文件中,以便和輸出進(jìn)行對(duì)照;(四)程序思路(僅供參考):模塊結(jié)構(gòu):(1)定義部分:定義常量、變量、數(shù)據(jù)結(jié)構(gòu)。(2)初始化:設(shè)立算符優(yōu)先分析表、初始化變量空間(包括堆棧、結(jié)構(gòu)體、數(shù)組、臨時(shí)變量等);(3)控制部分:從鍵盤輸入一個(gè)表達(dá)式符號(hào)串;(4)利用算符優(yōu)先分析算法進(jìn)行表達(dá)式處理:根據(jù)算符優(yōu)先分析表對(duì)表達(dá)式符號(hào)串進(jìn)行堆棧(或其他)操作,輸出分析結(jié)果,如果遇到錯(cuò)誤則顯示錯(cuò)誤信息。(5)對(duì)生成的逆波蘭式進(jìn)行計(jì)算。(五)練習(xí)該實(shí)驗(yàn)的目的和思路: 程序較復(fù)雜,需要利用到程序設(shè)計(jì)語(yǔ)言的知識(shí)和大量編程技巧,逆波蘭式的生成是算符優(yōu)先分析法的應(yīng)用,是一種較實(shí)用的分析法,通過(guò)這個(gè)練習(xí)可大大提高軟件開發(fā)能力。(六)為了能設(shè)計(jì)好程序,注意以下事情:1.模塊設(shè)計(jì):將程序分成合理的多個(gè)模塊(函數(shù)),每個(gè)模塊做具體的同一事情。2.寫出(畫出)設(shè)計(jì)方案:模塊關(guān)系簡(jiǎn)圖、流程圖、全局變量、函數(shù)接口等。3.編程時(shí)注意編程風(fēng)格:空行的使用、注釋的使用、縮進(jìn)的使用等。一、實(shí)驗(yàn)?zāi)康模?構(gòu)造LR(1)分析程序,利用它進(jìn)行語(yǔ)法分析,判斷給出的符號(hào)串是否為該文法識(shí)別的句子,了解LR(K)分析方法是嚴(yán)格的從左向右掃描,和自底向上的語(yǔ)法分析方法。二、實(shí)驗(yàn)預(yù)習(xí)提示: 1、使用LR(1)的優(yōu)點(diǎn):(1)LR分析器能夠構(gòu)造來(lái)識(shí)別所有能用上下文無(wú)關(guān)文法寫的程序設(shè)計(jì)語(yǔ)言的結(jié)構(gòu)。(2)LR分析方法是已知的最一般的無(wú)回溯移進(jìn)-歸約方法,它能夠和其他移進(jìn)-歸約方法一樣有效地實(shí)現(xiàn)。(3)LR方法能分析的文法類是預(yù)測(cè)分析法能分析的文法類的真超集。(4)LR分析器能及時(shí)察覺語(yǔ)法錯(cuò)誤,快到自左向右掃描輸入的最大可能。為了使一個(gè)文法是LR的,只要保證當(dāng)句柄出現(xiàn)在棧頂時(shí),自左向右掃描的移進(jìn)-歸約分析器能夠及時(shí)識(shí)別它便足夠了。當(dāng)句柄出現(xiàn)在棧頂時(shí),LR分析器必須要掃描整個(gè)棧就可以知道這一點(diǎn),棧頂?shù)臓顟B(tài)符號(hào)包含了所需要的一切信息。如果僅知道棧內(nèi)的文法符號(hào)就能確定棧頂是什么句柄。LR分析表的轉(zhuǎn)移函數(shù)本質(zhì)上就是這樣的有限自動(dòng)機(jī)。不過(guò),這個(gè)有限自動(dòng)機(jī)不需要根據(jù)每步動(dòng)作讀棧,因?yàn)?,如果這個(gè)識(shí)別句柄的有限自動(dòng)機(jī)自底向上讀棧中的文法符號(hào)的話,它達(dá)到的狀態(tài)正是這時(shí)棧頂?shù)臓顟B(tài)符號(hào)所表示的狀態(tài),所以,LR分析器可以從棧頂?shù)臓顟B(tài)確定它需要從棧中了解的一切。2、LR分析器由三個(gè)部分組成:(1)總控程序,也可以稱為驅(qū)動(dòng)程序。對(duì)所有的LR分析器總控程序都是相同的。(2)分析表或分析函數(shù),不同的文法分析表將不同,同一個(gè)文法采用的LR分析器不同時(shí),分析表將不同,分析表又可以分為動(dòng)作表(ACTION)和狀態(tài)轉(zhuǎn)換(GOTO)表兩個(gè)部分,它們都可用二維數(shù)組表示。(3)分析棧,包括文法符號(hào)棧和相應(yīng)的狀態(tài)棧,它們均是先進(jìn)后出棧。分析器的動(dòng)作就是由棧頂狀態(tài)和當(dāng)前輸入符號(hào)所決定。LR分析器結(jié)構(gòu):其中:SP為棧指針,Si為狀態(tài)棧,Xi為文法符號(hào)棧。狀態(tài)轉(zhuǎn)換表用GOTOi,X=j表示,規(guī)定當(dāng)棧頂狀態(tài)為i,遇到當(dāng)前文法符號(hào)為X時(shí)應(yīng)轉(zhuǎn)向狀態(tài)j,X為終結(jié)符或非終結(jié)符。ACTIONi,a規(guī)定了棧頂狀態(tài)為i時(shí)遇到輸入符號(hào)a應(yīng)執(zhí)行。動(dòng)作有四種可能:(1)移進(jìn):actioni,a= Sj:狀態(tài)j移入到狀態(tài)棧,把a(bǔ)移入到文法符號(hào)棧,其中i,j表示狀態(tài)號(hào)。(2)歸約:actioni,a=rk:當(dāng)在棧頂形成句柄時(shí),則歸約為相應(yīng)的非終結(jié)符A,即文法中有A-B的產(chǎn)生式,若B的長(zhǎng)度為R(即|B|=R),則從狀態(tài)棧和文法符號(hào)棧中自頂向下去掉R個(gè)符號(hào),即棧指針SP減去R,并把A移入文法符號(hào)棧內(nèi),j=GOTOi,A移進(jìn)狀態(tài)棧,其中i為修改指針后的棧頂狀態(tài)。(3)接受acc:當(dāng)歸約到文法符號(hào)棧中只剩文法的開始符號(hào)S時(shí),并且輸入符號(hào)串已結(jié)束即當(dāng)前輸入符是#,則為分析成功。(4)報(bào)錯(cuò):當(dāng)遇到狀態(tài)棧頂為某一狀態(tài)下出現(xiàn)不該遇到的文法符號(hào)時(shí),則報(bào)錯(cuò),說(shuō)明輸入端不是該文法能接受的符號(hào)串。3、LL(1)分析法實(shí)驗(yàn)設(shè)計(jì)思想及算法三、實(shí)驗(yàn)過(guò)程和指導(dǎo): (一)準(zhǔn)備: 1.閱讀課本有關(guān)章節(jié),2.考慮好設(shè)計(jì)方案;3.設(shè)計(jì)出模塊結(jié)構(gòu)、測(cè)試數(shù)據(jù),初步編制好程序。(二)上課上機(jī): 將源代碼拷貝到機(jī)上調(diào)試,發(fā)現(xiàn)錯(cuò)誤,再修改完善。(三)程序要求:程序輸入/輸出示例: 對(duì)下列文法,用LR(1)分析法對(duì)任意輸入的符號(hào)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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)論