freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

一個(gè)編譯原理語法分析器的實(shí)現(xiàn)與設(shè)計(jì)一個(gè)編譯原理語法分析器的實(shí)現(xiàn)與設(shè)計(jì)—計(jì)算機(jī)畢業(yè)設(shè)計(jì)(編輯修改稿)

2025-01-04 11:23 本頁面
 

【文章內(nèi)容簡介】 對(duì) select 集做相關(guān)判斷,以確定所讀入的文法是否符合 LL( 1)文法的規(guī)則。程序中所用到的公有數(shù)據(jù)成員有: Public hs As Integer 39。 文法的行數(shù) Public zj As Integer 39。 終結(jié)符的個(gè)數(shù) Public nz As Integer 39。 非終結(jié)符的個(gè)數(shù) Public SLT(50, 50) As String 39。 select 集 Dim F(50) As String 39。 用與臨時(shí)存放 select 集中元素的數(shù)組 Public ZJF(50) As String 39。 終結(jié)符集 Public NZJ(250) As String 39。 非終結(jié)符集 求 select 集 設(shè)有文法 G[S],并有規(guī)則 A::=?,則該規(guī)則的可選集為: Select(A::=?)= 具體實(shí)現(xiàn)代碼如下: If WF(a, 0) = Empty Then Exit For ElseIf WF(a, 1) = ε Then 39。ε為空字符串 Call follow(a, fo) i = 0 Do While F(i) Empty SLT(a, i) = F(i) F(i) = Empty i = i + 1 SLT(a, i) = Empty ??? ?? ??? 為空當(dāng) 不為空當(dāng) F ol low (A ) )F irs t ( 第 VI 頁 共 22 頁 Loop Else Call first(a, fo) 求 first 集 首符號(hào)集既求解文法每條規(guī)則右邊的第一個(gè)符號(hào)并且必須 是終結(jié)符,因?yàn)槲姆ㄊ褂脭?shù)組存放,所以既求文法每行規(guī)則的第 2個(gè)字符既可;如果規(guī)則左邊第一個(gè)字符為非終結(jié)符,則通過循環(huán)對(duì)該非終結(jié)符再求首符號(hào)集。 For i = 0 To zj If WF(a, 1) = ZJF(i) Then 39。判斷第 a 條規(guī)則右邊的首符號(hào)是否是終結(jié)符 For p = 0 To fo 39。判斷 WF(i,j+1)在 F()中是否已經(jīng)存在 If WF(a, 1) = F(p) Then b = 1 Exit For End If Next p If b = 1 Then b = 0 Else F(fo) = WF(a, 1) fo = fo + 1 F(fo) = Empty End If 求 follow 集 求向前看集主要分兩種情況,一種是可以直接循環(huán)推導(dǎo)出終結(jié)符;第二種是推出的還是非終結(jié)符的,如果推出的還是非終結(jié)符的就循環(huán)對(duì)該非終結(jié)符再求向前看集;第三種情況是不能對(duì)該非終結(jié)符求向前看集,但是可以通過對(duì)該非終結(jié)符推導(dǎo)出的第二個(gè)非終結(jié)符求向前看集 的方法求出終結(jié)符。 c = 0: b = 0 If WF(a, 0) = WF(0, 0) Then 39。判斷是不是對(duì)文法起始符求 follow 集 For p = 0 To fo 39。判斷 WF(i,j+1)在 F()中是否已經(jīng)存在 If F(p) = Then b = 1 Exit For 第 VII 頁 共 22 頁 End If Next p If b = 1 Then b = 0 Else F(fo) = fo = fo + 1 F(fo) = Empty End If End If For i = 0 To hs j = 1 Do While WF(i, j) Empty If WF(a, 0) = WF(i, j) Then If WF(i, j + 1) = Empty And a i Then Call follow(i, fo) Else For m = 0 To zj 39。判斷 WF(i,j+1)是不是 終結(jié)符 If WF(i, j + 1) = ZJF(m) Then For p = 0 To fo 39。判斷 WF(i,j+1)在 F()中是否已經(jīng)存在 If WF(i, j + 1) = F(p) Then b = 1 Exit For End If Next p If b = 1 Then b = 0 Else F(fo) = WF(i, j + 1) fo = fo + 1 F(fo) = Empty End If c = 1 Exit For 第 VIII 頁 共 22 頁 End If Next m If c = 1 Then c = 0 Else For n = 0 To hs 39。查找 WF(i,j+1)對(duì)應(yīng)的非終結(jié)符在文法的第幾行 If WF(i, j + 1) = WF(n, 0) Then Call first(n, fo) 分析表構(gòu)造模塊 在已經(jīng)得到文法 select 集的前提下,以次為依據(jù),對(duì)文法的三種類型的規(guī)則: A::=aβ 型、 A::=Dβ 型、 A::=ε 型分別構(gòu)造分析表,并用一個(gè)三維數(shù)組保存。形如 FXB( y, x, z),其中, y 表示分析表的第 y 行, x表示第 x列, z表示第 y行第 x 列所對(duì)應(yīng)的格子中的第 z個(gè)數(shù)據(jù)。 構(gòu)造文法分析表 在求解 Select 集完成后,結(jié)果按照 非終結(jié)符放入分析表 Y 軸,沒有出現(xiàn)在對(duì)應(yīng)規(guī)則右部首部的終結(jié)符放入分析表 Y軸,終結(jié)符放入分析表 X軸等規(guī)則放置。如圖 5。 圖 5 分析表構(gòu)造流程 文法分析表 終結(jié)符 非終結(jié)符 文法可選集 未出現(xiàn)在對(duì)應(yīng)規(guī)則右部首部的終結(jié)符 放入分析表 X 軸 放入分析表 Y 軸 放入分析表 Y 軸 第 IX 頁 共 22 頁 ::=aβ 規(guī)則 對(duì)于 A::=a?, (a?Vt),則 令 LL(A,a)=R(?)/N **R(?)/N:表示用 ? 的逆串替換A后,繼續(xù)讀入下一個(gè)符號(hào)。 當(dāng) ? 為 ? 時(shí),即: A::=a,有: LL(A,a)=R(?)/N ::=Dβ規(guī)則 對(duì)于 A::=D?, (D?Vn),且有 Select(A::=D?)={b1,b2,? ,bn} , 則 LL(A,bi)=RD?)/P, (i=1,2,? ,n) **R(D?)/P:表示用 D? 的 (逆串替換 A后,重讀當(dāng)前符號(hào) ::=ε規(guī)則 對(duì)于 A::=?,且有 Select(A::=?)= {b1,b2,? ,bn} 則 LL(A, bi)=R(?)/P 本部分主要通過 VB 中的 InputBox 對(duì)話框讀入待分析句子,并與分析表進(jìn)行對(duì)照,逐步分析所輸入的句子是否符合文法。分析過程均用一維數(shù)組進(jìn)行保存。 相關(guān)程序片段如下: 程序中所用到的公有數(shù)據(jù)成員有: Dim FXZ(50) As String 39。存放句子分析過程中的分析棧 Dim FHZ(50) As String 39。存放句子分析過程中的輸入符號(hào)棧 讀取句子 Public Sub juzi_read(str As String) 39。讀取句子 FHZ(0) = Empty i = 0 a = Mid(str, 1, 1) Do While a Empty FHZ(i) = a a = Mid(str, i + 2, 1) i = i + 1 FHZ(i) = Empty Loop If FHZ(0) = Empty Then Exit Sub 第 X 頁 共 22 頁 End If FHZ(i) = FHZ(i + 1) = Empty Call fenxi_chr End Sub 分析句子 現(xiàn)在我們把句型的右端部分逆向放入一分析堆棧中,使 x1 成為棧頂,利用分析棧,當(dāng)棧頂符號(hào)與輸入串當(dāng)前符號(hào)相匹配時(shí),則從棧頂刪除該符號(hào)。然后再把相應(yīng)的規(guī)則逆向壓入棧頂,替換原棧頂?shù)姆墙K結(jié)符。 Do While (i, j, k) Empty Select Case (i, j, k) Case acc Exit Sub Case ε FXZ(a) = Empty Case /N FHZ(b) = b = b + 1 a = a 1 Exit For Case /P a = a 1 Exit For Case Else FXZ(a) = (i, j, k) a = a + 1 FXZ(a) = Empty End Select k = k + 1 Loop 4 特殊問題 及 解決方法 在程序的開發(fā)過程中,遇到的問題及解決辦法如下: 第 XI 頁 共 22 頁 Select集的求解 問題描述 在 LL( 1)分析方法中, select 集的求解至關(guān)重要,其中又涉及到 first 集和 follow 集的求解。即使是人工求解,也經(jīng)常出現(xiàn)錯(cuò)誤,以至影響最終的結(jié)果。要用計(jì)算機(jī)實(shí)現(xiàn)這一復(fù)雜的過程,對(duì)開發(fā)人員的邏輯思維能力要求甚高。 解決方案 通過參照編譯原理中 first 集和 follow 集的具體求解步驟,通過多重循環(huán)的嵌套,完成了 select 集的求解過程,具體代碼請(qǐng)參照 節(jié)。 解決結(jié)果 在成功獲得 select 集后,對(duì)其進(jìn)行了輸出,結(jié)果如圖 6 所示: 圖 6 顯示 select 集 為 ListBox 添加水平滾動(dòng)條 問題描述 在 VB 中,系統(tǒng)提供的 ListBox 只有垂直滾動(dòng)條,而沒有水平滾動(dòng)條。當(dāng)控件中某一行的數(shù)據(jù)超過 ListBox 的寬度時(shí),數(shù)據(jù)會(huì)顯示不完整。添加的水平滾動(dòng)條的寬度也應(yīng)該能動(dòng)態(tài)的改變,以最寬的一行數(shù)據(jù)為水平滾動(dòng)條寬度的依據(jù)。 解決方案 利用 SendMessage 傳送 LB_SETHORIZONTALEXTENT 訊息給 ListBox,此一 第 XII 頁 共 22 頁 訊息的作用就是要求 ListBox 設(shè)定水平 滾動(dòng)條。代碼如下: Private Declare Function SendMessage Lib user32 Alias SendMessageA (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Const LB_SETHORIZONTALEXTENT = amp。H194 SendMessage , LB_SETHORIZONTALEXTENT, i, 0 其中, List1 為 ListBox 的名稱 ; i為水平滾動(dòng)條的寬度, 單位是 pixel(像素 )。 i 的值由所輸出的最長的一串字符串決定,具體獲取方法為: 添加一個(gè)自動(dòng)縮放大小的 label,將最長的字符串附給其 Caption 屬性,然后取得 label 的寬度除以 15,即為 i 的值。 解決結(jié)果 運(yùn)行后的結(jié)果如圖 7所示: 圖 7 ListBox的水平滾動(dòng)條 5
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1