版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 摘 要</b></p><p> 編譯程序一般由詞法分析程序、語(yǔ)法分析程序、語(yǔ)義分析程序、中間代碼生成程序、目標(biāo)代碼生成程序、代碼優(yōu)化程序、表格管理程序和出錯(cuò)處理程序等成分構(gòu)成。在編譯原理的教學(xué)過(guò)程中,算法的講解都需要對(duì)算法進(jìn)行詳細(xì)的分析,包括算法條件的判斷,文法分析表的構(gòu)造過(guò)程,文法分析表的具體生成,針對(duì)文法的句子的分析過(guò)程等,這些過(guò)程往往需要占用大量時(shí)間
2、來(lái)分析、制表等。本軟件的主要任務(wù)就是利用程序來(lái)完成算法的上述相關(guān)過(guò)程,以達(dá)到高效,直觀的效果。本文旨在介紹語(yǔ)法分析方法中的一種自上而下的分析方法——LL(1)分析法。所謂LL(1)分析法是指語(yǔ)法分析是按自左至右的順序向前查看一個(gè)輸入字符串,并分析過(guò)程中產(chǎn)生句子的最左推導(dǎo)。</p><p> 關(guān)鍵詞:編譯;語(yǔ)法分析;LL(1)算法;演示</p><p> 、
3、 目錄</p><p> 引言..... ............................................ .... ............ ...................................................................3</p><p><b> 第一章、概述</b><
4、;/p><p> 1.1設(shè)計(jì)目標(biāo)........................... .............................. ........................... ................... .............4</p><p> 1.2設(shè)計(jì)理論基礎(chǔ)............... ............... ........
5、....... .............. ................ ........... ...................5</p><p><b> 第二章、程序設(shè)計(jì)</b></p><p> 2.1算法設(shè)計(jì)簡(jiǎn)介.............. ............................. ........... .........
6、............................................6</p><p> 2.1.1自頂向下分析......... . ......................................................... .........................................6</p><p> 2.1.2
7、LL(K)分析方法.................... . .................. .................................... .........................7</p><p> 2.1.3 LL(1)分析方法....................................................................
8、....................................7</p><p> 2.1.4 LL(1)分析表..................... ...... ................. ............. ..... ......................... ...................8</p><p> 2.2系統(tǒng)流程圖..
9、.............. .................. .. ... .. ............................................. .. ....................9</p><p> 第三章、設(shè)計(jì)的實(shí)現(xiàn).</p><p> 3.1文件讀取模塊.........................................
10、......... ...................... ....................................10</p><p> 3.1.1文件讀取使用的CommonDialog控件介紹............. .................. ................................10</p><p> 3.1.2文法左
11、遞歸的判斷.................................................................... ..................................10</p><p><b> 3.2算法分析模塊</b></p><p> 3.2.1求select集.......... ............
12、........................................................... ...................................11</p><p> 3.2.2求first集….......................................................................................
13、..............................12</p><p> 3.2.1求follow集..... ............................................. .................................................................12.</p><p> 3.3分析表構(gòu)造模
14、塊............. .......... ................ ................................................................13</p><p> 3.3.1構(gòu)造文法分析表.. .........................................................................
15、.................................14</p><p> 3.3.2 A::=aβ規(guī)則....................... ...................................................... .....................................14</p><p> 3.3.3 A
16、::=Dβ規(guī)則.............................................................................. ....................................14</p><p> 3.3.4A::=ε規(guī)則.............................................................
17、.........................................................14</p><p> 3.4句子分子模塊......................................................................................... ......................15</p><
18、;p> 3.4.1讀取句子............................... .........................................................................................16</p><p> 3.4.2分析句子............................... ................
19、.........................................................................16</p><p> 3.5系統(tǒng)模塊流程圖............... ............................................................................. .............17<
20、;/p><p> 第四章、結(jié)構(gòu)測(cè)試........... ............................................................................. .............18</p><p> 第五章、小結(jié)............,.............................................
21、.................................... ...................19</p><p> 參考文獻(xiàn)............,................................................................................. ................. ............20</p&g
22、t;<p><b> 引言</b></p><p> 編譯原理是計(jì)算機(jī)專業(yè)中最難的一門課程,在理論上它要求學(xué)生掌握有關(guān)形勢(shì)語(yǔ)言和自動(dòng)機(jī)的抽象概念,在技術(shù)上要求學(xué)生能夠熟練地利用各種數(shù)據(jù)結(jié)構(gòu)進(jìn)行編程。</p><p> 編譯程序是現(xiàn)代計(jì)算機(jī)系統(tǒng)的基本組成部分之一。編譯程序一般由詞法分析程序、語(yǔ)法分析程序、語(yǔ)義分析程序、中間代碼生成程序、目標(biāo)代碼生成程
23、序、代碼優(yōu)化程序、表格管理程序和出錯(cuò)處理程序等成分構(gòu)成。</p><p> 在編譯原理的教學(xué)過(guò)程中,語(yǔ)法和語(yǔ)義分析階段關(guān)于算法的講解都需要對(duì)算法進(jìn)行詳細(xì)的分析,包括算法條件的判斷,文法分析表的構(gòu)造過(guò)程,文法分析表的具體生成,針對(duì)文法的句子的分析過(guò)程等。這些過(guò)程往往需要占用大量時(shí)間來(lái)分析、制表等。教學(xué)主要是對(duì)這些過(guò)程的講解和分析,沒有必要花這么多的時(shí)間來(lái)做這些工作。本軟件的主要任務(wù)就是利用程序來(lái)完成算法的上述相關(guān)
24、過(guò)程,節(jié)約教學(xué)時(shí)間。</p><p><b> 第一章、概述</b></p><p><b> 1,1設(shè)計(jì)目標(biāo)</b></p><p> 《一個(gè)編譯原理語(yǔ)法分析器的設(shè)計(jì)與實(shí)現(xiàn)》</p><p> 1.主要通過(guò)文本方式獲取相關(guān)文法,并實(shí)現(xiàn)以下相關(guān)操作:</p><p>
25、 2.判斷文法是否符合LL(1)的要求</p><p> 3.獲取文法的終結(jié)符和非終結(jié)符</p><p> 4.求文法的select集(其中包括first集和follow集的求解)并判斷select集是否符合LL(1)算法的要求</p><p> 5.根據(jù)文法和select集構(gòu)造文法分析表</p><p> 6.根據(jù)文法分析表判斷輸
26、入的句子是否符合文法</p><p><b> 1,2設(shè)計(jì)理論基礎(chǔ)</b></p><p> 語(yǔ)法分析:逐一分析詞法分析所得的屬性字,檢查其中的語(yǔ)法錯(cuò)誤,如果沒有發(fā)現(xiàn)語(yǔ)法錯(cuò)誤, 則給出正確的語(yǔ)法結(jié)構(gòu)。</p><p> 句子的分析:句子的分析實(shí)際就是分析源程序中的語(yǔ)句是否符合給定的文法。</p><p> 文法:
27、對(duì)語(yǔ)言結(jié)構(gòu)的定義和描述,即在形式上用于描述和規(guī)定語(yǔ)言結(jié)構(gòu)。由若干條規(guī)則組成。</p><p> 規(guī)則:為一個(gè)二元組,通常格式為U::=x或U→x;其中U為規(guī)則的左部,是一個(gè)符號(hào);x是規(guī)則的右部,是一貫有窮字符串。規(guī)則又稱為產(chǎn)生式。</p><p> BNF表示法:即巴科斯范式表示法,它引進(jìn)了符號(hào)“|”,符號(hào)“|”表示“或”。運(yùn)用符號(hào)“|”把相同左部的規(guī)則縮寫在一起,這樣顯得文法更為緊湊
28、。</p><p> 文法G[Z]:規(guī)則的非空有窮集合,其中Z為文法的識(shí)別符號(hào)或開始符號(hào),它至少要在一條規(guī)則的左部出現(xiàn)。</p><p> 字匯表:在文法中,由全部規(guī)則的左部和右部中的所有符號(hào)組成的符號(hào)集。</p><p> 非終結(jié)符:文法中出現(xiàn)在規(guī)則左部的符號(hào),它們組成的集合稱為非終結(jié)符集。</p><p> 終結(jié)符:文法中凡不屬于
29、非終結(jié)符集的符號(hào),它們組成的集合稱為終結(jié)符集。</p><p> 遞歸:同一操作或一組操作的連續(xù)重復(fù),其實(shí)質(zhì)上是處理過(guò)程的性質(zhì),在這種過(guò)程的每一步都要用到它自身的上一步或上幾步的結(jié)果。</p><p> 遞歸定義:在定義某種事物時(shí)又用到其本身。</p><p> 直接左遞歸規(guī)則:型如U::=Uy的規(guī)則稱為直接左遞歸規(guī)則。</p><p>
30、; First集:首符號(hào)集。</p><p> Follow集:向前看集。</p><p> Select集:可選集。</p><p> LL(1)文法:對(duì)于文法G(S),其每個(gè)非終結(jié)符的不同規(guī)則具有不相交的Select集,則稱該文法為L(zhǎng)L(1)文法。</p><p><b> 第二章、程序設(shè)計(jì)</b><
31、/p><p><b> 2.1算法設(shè)計(jì)簡(jiǎn)介</b></p><p> 2.1.1自頂向下分析</p><p> 對(duì)于文法G[Z],給頂一個(gè)待分析的句子(字符串),自頂向下分析的基本思想是從識(shí)別符號(hào)Z開始,根據(jù)文法試著建立一個(gè)推導(dǎo)序列,若得到所給的句子,則句子得到識(shí)別,表明其結(jié)構(gòu)符合文法,如果經(jīng)過(guò)各種推導(dǎo)都不能得到所分析的句子,則該符號(hào)串不符合
32、文法?;蛘哒f(shuō),從根結(jié)點(diǎn)出發(fā),自上而下地建立一顆語(yǔ)法樹,其未端結(jié)點(diǎn)按從左到右的順序連接起來(lái),構(gòu)成給定的符號(hào)串,則符號(hào)串得到識(shí)別。</p><p> 例:設(shè)有文法G[N]和符號(hào)串25 N </p><p><b> N::=D|ND</b></p><p> D::=0
33、|1|2|…|9 </p><p><b> 根據(jù)文法有:</b></p><p> NNDDD2D25; </p><p> 因此我們說(shuō)25符合此文法
34、 </p><p> 圖1 G[N]過(guò)程分析 </p><p> 自頂向下分析的難點(diǎn)及解決辦法:</p><p> 1>.自頂向下分析的難點(diǎn)</p><p> 對(duì)于形如:U::=x1|x2|…|xn 的規(guī)則,可能需要對(duì)所有的規(guī)則都要試探。</p><p> 2>.
35、難點(diǎn)的解決辦法</p><p> 該解決辦法是把文法中每個(gè)非終結(jié)符號(hào)A的右部稱為A的候選式,對(duì)候選式的選擇,則根據(jù)當(dāng)前輸入符號(hào)來(lái)決定。</p><p><b> 方法:</b></p><p> 首先對(duì)文法的每個(gè)規(guī)則A::=求可選集 Select(A::=)。</p><p> 當(dāng)時(shí),則對(duì)于當(dāng)前輸入的符號(hào)a,若有
36、aFirst(),則可以選用規(guī)則A::=進(jìn)行推導(dǎo)。</p><p> 若對(duì)于某非終止符號(hào)有n條規(guī)則(即有n個(gè)候選式)的處理方法:</p><p> A.首符號(hào)集不相同的解決辦法</p><p> 對(duì)于文法,有A::=x1|x2|…|xn,其右部的n個(gè)候選式的首符號(hào)集均不相同:</p><p> 即First(xi) ∩ First(x
37、j)= (ij),對(duì)于待分析的符號(hào)串,如果最左的非終結(jié)符號(hào)為A,若其句子中對(duì)應(yīng)的下一個(gè)符號(hào)(當(dāng)前輸入符號(hào))為a,且有aFirst(xk),則選擇規(guī)則A::=xk來(lái)作為推導(dǎo)的候選式。</p><p> 例:設(shè)有文法G[Z],和句子bbabaax</p><p><b> Z::=aV|bZ</b></p><p><b> V::
38、=baZ|x</b></p><p> Select(Z ::=aV)={a};</p><p> Select(Z ::=bZ)=;</p><p> Select(V ::=baZ)=;</p><p> Select(V ::=x)={x};</p><p> Z bZ
39、 bbZ bbaV bbabaZ bbabaaVbbabaax</p><p> (babaax) (abaax) (baax) (ax) (x) </p><p> B.首符號(hào)相同的解決辦法</p><p> 對(duì)于文法,有A::= x1|x2|…|xn,若有First(xi) ∩ First(xj) (ij),采
40、用試探法:即從首字符中有輸入符號(hào)的多個(gè)候選式中任選一個(gè)來(lái)試探,如果不成功,就換另一個(gè)接著試。試探法有可能形成回溯現(xiàn)象。對(duì)于回溯現(xiàn)象,可以通過(guò)“左提因子方法”對(duì)文法進(jìn)行修改來(lái)消除。</p><p> 2.1.2LL(K)分析方法</p><p> LL(K)分析方法是一種自頂向下的分析技術(shù)。這種分析方法從左到右掃描源程序(輸入串),同時(shí)從識(shí)別符號(hào)開始生成句子的最左推導(dǎo)(規(guī)范推導(dǎo)),向前看
41、K個(gè)符號(hào),便能確定當(dāng)前應(yīng)選擇怎樣的規(guī)則。</p><p> 當(dāng)K=1時(shí),既是LL(1)分析方法。</p><p> 2.1.3 LL(1)分析方法</p><p> 1.LL(1)方法的思想:根據(jù)輸入串的當(dāng)前輸入符號(hào),確定用某規(guī)則進(jìn)行推導(dǎo),當(dāng)推導(dǎo)的第一個(gè)符號(hào)與輸入串的當(dāng)前符號(hào)匹配時(shí),就把輸入串的下一個(gè)字符作為當(dāng)前輸入字符,直到推導(dǎo)出輸入串。根據(jù)輸入串向前的1個(gè)
42、符號(hào)來(lái)確定推導(dǎo)規(guī)則時(shí),就是LL(1)方法。</p><p> 2.LL(1)分析方法的邏輯結(jié)構(gòu)</p><p> 圖2 LL(1)分析方法的邏輯結(jié)構(gòu)</p><p> 2.1.4LL(1)分析表</p><p> LL(1)分析表是分析方法的核心,它確定了推導(dǎo)所使用的規(guī)則。</p><p> A.LL(1)分
43、析過(guò)程</p><p> 假設(shè)分析過(guò)程中當(dāng)前句型的右端部分為:x1x2…xm,(xiV)</p><p> 輸入流(待分析串)的右端部分為:y1y2…yn,(yiVt)</p><p> 此時(shí)有以下3種情況:</p><p> (1)當(dāng)x1Vn,則根據(jù)當(dāng)前輸入符號(hào)y1選擇相應(yīng)的規(guī)則去替換x1;</p><p>
44、 (2)當(dāng)x1Vt時(shí),則查看x1與y1是否相同,若x1與y1相同,則分別刪去x1和y1,然后繼續(xù)向前分析;不相同表示不相配,為出錯(cuò)。</p><p> (3)若上述兩個(gè)字符串均為空,則表示全部匹配,輸入串被識(shí)別。</p><p> 現(xiàn)在我們把句型的右端部分逆向放入一分析堆棧中,使x1成為棧頂,利用分析棧,當(dāng)棧頂符號(hào)與輸入串當(dāng)前符號(hào)相匹配時(shí),則從棧頂刪除該符號(hào)。然后再把相應(yīng)的規(guī)則逆向壓
45、入棧頂,替換原棧頂?shù)姆墙K結(jié)符。 </p><p> B.LL(1)分析表的構(gòu)造</p><p> LL(1)分析表:它是用來(lái)反映分析棧中的元素與輸入串中元素的一種匹配關(guān)系。如果分析棧中的元素為A,輸入元素為a,則其匹配關(guān)系記為L(zhǎng)L(A,a)</p><p> LL(1)分析矩陣:一種用來(lái)反映這種匹配關(guān)系的矩陣表示,該矩陣稱為L(zhǎng)L(1)分析矩陣。首先進(jìn)行介紹與L
46、L(1)分析有關(guān)的3個(gè)操作約定:</p><p> (1)N表示繼續(xù)下一個(gè)符號(hào);</p><p> (2)P表示重讀當(dāng)前符號(hào),也即不讀入下一符號(hào);</p><p> (3)R()表示用的逆串替換棧頂符號(hào)。</p><p> 構(gòu)造LL(1)分析表的方法如下:</p><p> a.對(duì)于A::=a,(aVt),則
47、</p><p> 令 LL(A,a)=R()/N </p><p> **R()/N:表示用的逆串替換A后,繼續(xù)讀入下一個(gè)符號(hào)。</p><p> 當(dāng)為時(shí),即:A::=a,有:LL(A,a)=R()/N </p><p> b.對(duì)于A::=D,(DVn),且有 Select(A::=D)={b1,b2,…,bn} ,</p&g
48、t;<p> 則 LL(A,bi)=R(D)/P,(i=1,2,…,n)</p><p> **R(D)/P:表示用D的逆串替換A后,重讀當(dāng)前符號(hào)</p><p> c.對(duì)于A::=,且有 Select(A::=)= {b1,b2,…,bn}</p><p> 則 LL(A, bi)=R()/P</p><p> d.
49、對(duì)于每一個(gè)aVt,a不出現(xiàn)于規(guī)則右部的首部,</p><p> 則令 LL(a,a)=R()/N</p><p> e.對(duì)于#,令LL(#,#)=acc 表示分析結(jié)束,輸入串得到識(shí)別。</p><p> f.非上述5種情況,則置出錯(cuò),分析表中用空白表示。</p><p><b> 2.2系統(tǒng)流程圖</b><
50、/p><p><b> 第三章,設(shè)計(jì)的實(shí)現(xiàn)</b></p><p><b> 3.1文件讀取模塊</b></p><p> 本模塊通過(guò)調(diào)用VB中CommonDialog控件的ShowOpen方法啟動(dòng)打開文件對(duì)話框,獲取需要讀取的文件的路徑,再調(diào)用Open命令打開文件,將文件中保存的文法讀入內(nèi)存,用二維數(shù)組進(jìn)行保存。<
51、;/p><p> 3.1.1文件讀取使用的CommonDialog控件介紹</p><p> CommonDialog 控件提供諸如打開和保存文件、設(shè)置打印選項(xiàng)、選擇顏色和字體等操作的一組標(biāo)準(zhǔn)對(duì)話框。調(diào)用打開文件對(duì)話框的具體代碼如下:</p><p> Dim p_name As String ' 文件路徑</p><p> Fo
52、rm1.CommonDialog1.CancelError = True</p><p> On Error GoTo err</p><p> Form1.CommonDialog1.Filter = "Text(*.txt)|*.txt"</p><p> Form1.CommonDialog1.FilterIndex = 1</
53、p><p> Form1.CommonDialog1.ShowOpen ' 用 ShowOpen 方法顯示對(duì)話框</p><p> p_name = Form1.CommonDialog1.FileName ' 用 FileName 屬性獲取選定文件的名稱</p><p> 3.1.2文法左遞歸的判斷</p><p> 文
54、法中使用遞歸規(guī)則以后,可以用有限的規(guī)則刻劃無(wú)限語(yǔ)言,但不利的是對(duì)與具有左遞歸性的文法,不能采用自頂向下的分析算法。一般含有左遞歸規(guī)則的文法形式為U::=xUy,</p><p> 若x=, 則有U::=Uy,即為左遞歸規(guī)則。由于消除左遞歸算法的復(fù)雜性和畢業(yè)設(shè)計(jì)時(shí)間所限,所以本軟件沒有這項(xiàng)功能,只是對(duì)直接左遞歸進(jìn)行錯(cuò)誤判斷。</p><p> Do While WF(j, 0) <
55、> Empty ' 判斷文法是否有左遞歸</p><p> If WF(j, 0) = WF(j, 1) Then</p><p> MsgBox "!錯(cuò)誤!文法有左遞歸存在,不符合LL(1)的要求", vbApplicationModal, "錯(cuò)誤"</p><p><b> Exit Sub&
56、lt;/b></p><p><b> End If</b></p><p><b> j = j + 1</b></p><p><b> Loop</b></p><p><b> 3.2算法分析模塊</b></p><
57、;p> 本模塊首先獲取文法的終結(jié)符集和非終結(jié)符集,分別用一維數(shù)組進(jìn)行保存;然后在對(duì)文法的每一條規(guī)則求select集,并將select集保存到二維數(shù)組中;最后對(duì)select集做相關(guān)判斷,以確定所讀入的文法是否符合LL(1)文法的規(guī)則。程序中所用到的公有數(shù)據(jù)成員有:</p><p> Public hs As Integer ' 文法的行數(shù)</p><p> Publ
58、ic zj As Integer ' 終結(jié)符的個(gè)數(shù)</p><p> Public nz As Integer ' 非終結(jié)符的個(gè)數(shù)</p><p> Public SLT(50, 50) As String ' select集</p><p> Dim F(50) As String ' 用與臨時(shí)存
59、放select集中元素的數(shù)組</p><p> Public ZJF(50) As String ' 終結(jié)符集</p><p> Public NZJ(250) As String ' 非終結(jié)符集</p><p> 3.2.1求select集</p><p> 設(shè)有文法G[S],并有規(guī)則A::=,則該規(guī)則的可選
60、集為:</p><p> Select(A::=)= </p><p><b> 具體實(shí)現(xiàn)代碼如下:</b></p><p> If WF(a, 0) = Empty Then</p><p><b> Exit For</b></p><p> ElseIf WF
61、(a, 1) = "ε" Then 'ε為空字符串</p><p> Call follow(a, fo)</p><p><b> i = 0</b></p><p> Do While F(i) <> Empty</p><p> SLT(a, i) = F(i)<
62、;/p><p> F(i) = Empty</p><p><b> i = i + 1</b></p><p> SLT(a, i) = Empty</p><p><b> Loop</b></p><p><b> Else</b></
63、p><p> Call first(a, fo) </p><p> 3.2.2求first集</p><p> 首符號(hào)集既求解文法每條規(guī)則右邊的第一個(gè)符號(hào)并且必須是終結(jié)符,因?yàn)槲姆ㄊ褂脭?shù)組存放,所以既求文法每行規(guī)則的第2個(gè)字符既可;如果規(guī)則左邊第一個(gè)字符為非終結(jié)符,則通過(guò)循環(huán)對(duì)該非終結(jié)符再求首符號(hào)集。</p><p> For i
64、= 0 To zj</p><p> If WF(a, 1) = ZJF(i) Then '判斷第a條規(guī)則右邊的首符號(hào)是否是終結(jié)符</p><p> For p = 0 To fo '判斷WF(i,j+1)在F()中是否已經(jīng)存在</p><p> If WF(a, 1) = F(p) Then</p><p><b
65、> b = 1</b></p><p><b> Exit For</b></p><p><b> End If</b></p><p><b> Next p</b></p><p> If b = 1 Then</p><p
66、><b> b = 0</b></p><p><b> Else</b></p><p> F(fo) = WF(a, 1)</p><p> fo = fo + 1</p><p> F(fo) = Empty</p><p><b> End
67、 If </b></p><p> 3.2.3求follow集</p><p> 求向前看集主要分兩種情況,一種是可以直接循環(huán)推導(dǎo)出終結(jié)符;第二種是推出的還是非終結(jié)符的,如果推出的還是非終結(jié)符的就循環(huán)對(duì)該非終結(jié)符再求向前看集;第三種情況是不能對(duì)該非終結(jié)符求向前看集,但是可以通過(guò)對(duì)該非終結(jié)符推導(dǎo)出的第二個(gè)非終結(jié)符求向前看集的方法求出終結(jié)符。</p><p
68、> c = 0: b = 0</p><p> If WF(a, 0) = WF(0, 0) Then '判斷是不是對(duì)文法起始符求follow集</p><p> For p = 0 To fo '判斷WF(i,j+1)在F()中是否已經(jīng)存在</p><p> If F(p) = "#" Then</p>
69、;<p><b> b = 1</b></p><p><b> Exit For</b></p><p><b> End If</b></p><p><b> Next p</b></p><p> If b = 1 Then
70、</p><p><b> b = 0</b></p><p><b> Else</b></p><p> F(fo) = "#"</p><p> fo = fo + 1</p><p> F(fo) = Empty</p>&
71、lt;p><b> End If</b></p><p><b> End If</b></p><p> For i = 0 To hs</p><p><b> j = 1</b></p><p> Do While WF(i, j) <> Em
72、pty</p><p> If WF(a, 0) = WF(i, j) Then</p><p> If WF(i, j + 1) = Empty And a <> i Then</p><p> Call follow(i, fo)</p><p><b> Else</b></p>
73、<p> For m = 0 To zj '判斷WF(i,j+1)是不是終結(jié)符</p><p> If WF(i, j + 1) = ZJF(m) Then</p><p> For p = 0 To fo '判斷WF(i,j+1)在F()中是否已經(jīng)存在</p><p> If WF(i, j + 1) = F(p) Then&l
74、t;/p><p><b> b = 1</b></p><p><b> Exit For</b></p><p><b> End If</b></p><p><b> Next p</b></p><p> If b =
75、 1 Then</p><p><b> b = 0</b></p><p><b> Else</b></p><p> F(fo) = WF(i, j + 1)</p><p> fo = fo + 1</p><p> F(fo) = Empty</p&
76、gt;<p><b> End If</b></p><p><b> c = 1</b></p><p><b> Exit For</b></p><p><b> End If</b></p><p><b> Ne
77、xt m</b></p><p> If c = 1 Then</p><p><b> c = 0</b></p><p><b> Else</b></p><p> For n = 0 To hs '查找WF(i,j+1)對(duì)應(yīng)的非終結(jié)符在文法的第幾行</p&g
78、t;<p> If WF(i, j + 1) = WF(n, 0) Then</p><p> Call first(n, fo) </p><p> 3.3分析表構(gòu)造模塊</p><p> 在已經(jīng)得到文法select集的前提下,以次為依據(jù),對(duì)文法的三種類型的規(guī)則:A::=aβ型、A::=Dβ型、A::=ε型分別構(gòu)造分析表,并
79、用一個(gè)三維數(shù)組保存。形如FXB(y,x,z),其中,y表示分析表的第y行,x表示第x列,z表示第y行第x列所對(duì)應(yīng)的格子中的第z個(gè)數(shù)據(jù)。</p><p> 3.3.1構(gòu)造文法分析表</p><p> 在求解Select集完成后,結(jié)果按照非終結(jié)符放入分析表Y軸,沒有出現(xiàn)在對(duì)應(yīng)規(guī)則右部首部的終結(jié)符放入分析表Y軸,終結(jié)符放入分析表X軸等規(guī)則放置。如圖5。</p><p>
80、; 圖5 分析表構(gòu)造流程</p><p> 3.3.2A::=aβ規(guī)則</p><p> 對(duì)于A::=a,(aVt),則</p><p> 令 LL(A,a)=R()/N </p><p> **R()/N:表示用的逆串替換A后,繼續(xù)讀入下一個(gè)符號(hào)。</p><p> 當(dāng)為時(shí),即:A::=a,有:LL(A,
81、a)=R()/N </p><p> 3.3.3A::=Dβ規(guī)則</p><p> 對(duì)于A::=D,(DVn),且有 Select(A::=D)={b1,b2,…,bn} ,</p><p> 則 LL(A,bi)=RD)/P,(i=1,2,…,n)</p><p> **R(D)/P:表示用D的(逆串替換A后,重讀當(dāng)前符號(hào)</
82、p><p> 3.3.4A::=ε規(guī)則</p><p> 對(duì)于A::=,且有 Select(A::=)= {b1,b2,…,bn}</p><p> 則 LL(A, bi)=R()/P</p><p><b> 3.4句子分析模塊</b></p><p> 本部分主要通過(guò)VB中的InputB
83、ox對(duì)話框讀入待分析句子,并與分析表進(jìn)行對(duì)照,逐步分析所輸入的句子是否符合文法。分析過(guò)程均用一維數(shù)組進(jìn)行保存。</p><p><b> 相關(guān)程序片段如下:</b></p><p> 程序中所用到的公有數(shù)據(jù)成員有:</p><p> Dim FXZ(50) As String '存放句子分析過(guò)程中的分析棧</p>
84、<p> Dim FHZ(50) As String '存放句子分析過(guò)程中的輸入符號(hào)棧</p><p><b> 3.4.1讀取句子</b></p><p> Public Sub juzi_read(str As String) '讀取句子</p><p> FHZ(0) = Empty</p>
85、;<p><b> i = 0</b></p><p> a = Mid(str, 1, 1)</p><p> Do While a <> Empty</p><p> FHZ(i) = a</p><p> a = Mid(str, i + 2, 1)</p><
86、;p><b> i = i + 1</b></p><p> FHZ(i) = Empty</p><p><b> Loop</b></p><p> If FHZ(0) = Empty Then</p><p><b> Exit Sub</b></p
87、><p><b> End If</b></p><p> FHZ(i) = "#"</p><p> FHZ(i + 1) = Empty</p><p> Call fenxi_chr</p><p><b> End Sub</b></p
88、><p><b> 3.4.2分析句子</b></p><p> 現(xiàn)在我們把句型的右端部分逆向放入一分析堆棧中,使x1成為棧頂,利用分析棧,當(dāng)棧頂符號(hào)與輸入串當(dāng)前符號(hào)相匹配時(shí),則從棧頂刪除該符號(hào)。然后再把相應(yīng)的規(guī)則逆向壓入棧頂,替換原棧頂?shù)姆墙K結(jié)符。 </p><p> Do While fenxibiao.FXB(i, j, k) <
89、> Empty</p><p> Select Case fenxibiao.FXB(i, j, k)</p><p> Case "acc"</p><p><b> Exit Sub</b></p><p><b> Case "ε"</b>
90、</p><p> FXZ(a) = Empty</p><p><b> Case "/N"</b></p><p> FHZ(b) = " "</p><p><b> b = b + 1</b></p><p><b
91、> a = a - 1</b></p><p><b> Exit For</b></p><p><b> Case "/P"</b></p><p><b> a = a - 1</b></p><p><b> E
92、xit For</b></p><p><b> Case Else</b></p><p> FXZ(a) = fenxibiao.FXB(i, j, k)</p><p><b> a = a + 1</b></p><p> FXZ(a) = Empty</p>
93、<p> End Select</p><p><b> k = k + 1</b></p><p><b> Loop</b></p><p> 3.5系統(tǒng)模塊流程圖</p><p><b> 第四章、結(jié)果測(cè)試</b></p><p
94、> 在設(shè)計(jì)完成后,對(duì)設(shè)計(jì)各個(gè)功能做了詳細(xì)的測(cè)試,對(duì)于正確的文法,系統(tǒng)能正常的演示整個(gè)文法分析的每一個(gè)過(guò)程;對(duì)于預(yù)設(shè)置的錯(cuò)誤處理,系統(tǒng)也能給出正確的判斷,指出文法的錯(cuò)誤類型。</p><p><b> 測(cè)試錯(cuò)誤文法</b></p><p> 句子錯(cuò)誤有2種情況:</p><p> 1.句子不符合文法,錯(cuò)誤提示如圖所示:</p&
95、gt;<p> 句子不符合文法(1)</p><p> 2.句子中有終結(jié)符以外的字符,錯(cuò)誤提示如下圖所示:</p><p> 句子不符合文法(2)</p><p><b> 第五章、小結(jié)</b></p><p> 編譯原理是計(jì)算機(jī)專業(yè)中最難的一門課程,在理論上我們只能掌握有關(guān)形勢(shì)語(yǔ)言和自動(dòng)機(jī)的抽象
96、概念,在技術(shù)上很難能夠熟練地利用各種數(shù)據(jù)結(jié)構(gòu)進(jìn)行編程。尤其對(duì)于向前看集的算法實(shí)現(xiàn),我覺得是最難的一部分,因?yàn)樯婕暗降那闆r太多,循環(huán)和選擇句型的嵌套使用如果不仔細(xì)分析就容易出現(xiàn)錯(cuò)誤。在數(shù)據(jù)的處理上我采用各模塊全數(shù)組操作,并且將最終結(jié)果通過(guò)字符串方式保存,通過(guò)字符串來(lái)向其他模塊傳送數(shù)據(jù),這種新的嘗試也讓我的程序帶有個(gè)人的風(fēng)格,讓我對(duì)編程的多樣化有了更深的了解和認(rèn)識(shí)。</p><p> 通過(guò)語(yǔ)法分析器的設(shè)計(jì)的使用,在
97、編譯原理的學(xué)習(xí)中起到幫助,更好的了解LL(1)算法的整個(gè)過(guò)程。</p><p><b> 參考文獻(xiàn)</b></p><p> [1] 錢煥延.編譯技術(shù)第2版[M].南京:東南大學(xué)出版社出版,2002。</p><p> [2] 康慕寧.編譯原理[M].西安:西北工業(yè)大學(xué)出版社出版,2003。</p><p> [
98、3] 賀世娟,陳冀川.Visual Basic 6.0 程序設(shè)計(jì)[M].北京:中國(guó)水利水電出版社出版,2002.8。</p><p> [4] 楊克玉.VB6.0程序設(shè)計(jì)實(shí)訓(xùn)教程[M].北京:機(jī)械工業(yè)出版社出版,2005.2。</p><p> [5] 陳明.Visual Basic教程[M].北京:人民郵電出版社,2002.8。</p><p> [6] 徐
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯原理課程設(shè)計(jì)--- 語(yǔ)法分析器
- 編譯原理課程設(shè)計(jì)---語(yǔ)法分析器
- 編譯原理課程設(shè)計(jì)--語(yǔ)法分析器
- 編譯原理語(yǔ)法分析器課程設(shè)計(jì)
- 編譯原理詞法分析器語(yǔ)法分析課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)(c++)-語(yǔ)法分析器
- 編譯原理課程設(shè)計(jì)-詞法語(yǔ)法分析器
- 編譯原理課程設(shè)計(jì)--表達(dá)式語(yǔ)法分析器
- 編譯原理課程設(shè)計(jì)--pascal語(yǔ)言詞法、語(yǔ)法分析器設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)--構(gòu)造lr(0)分析法語(yǔ)法分析器
- 編譯原理語(yǔ)法分析
- 編譯課程設(shè)計(jì)-遞歸下降語(yǔ)法分析
- 編譯原理課程設(shè)計(jì)--c-編譯器詞法分析與語(yǔ)法分析的實(shí)現(xiàn)
- c-minus詞法分析和語(yǔ)法分析設(shè)計(jì)編譯器編譯原理課程設(shè)計(jì)
- 空間SQL語(yǔ)法分析器的設(shè)計(jì)與實(shí)現(xiàn).pdf
- C編譯器語(yǔ)法分析的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于語(yǔ)法分析的數(shù)學(xué)公式分析器的設(shè)計(jì)
- 編譯原理語(yǔ)法分析實(shí)驗(yàn)報(bào)告
- 基于語(yǔ)法分析的數(shù)學(xué)公式分析器的設(shè)計(jì)
- 編譯語(yǔ)法分析實(shí)驗(yàn)報(bào)告
評(píng)論
0/150
提交評(píng)論