

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