語法分析課程設(shè)計---編譯原理語法分析器的設(shè)計與實現(xiàn)_第1頁
已閱讀1頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論