【正文】
不合法 Exit Function End If t = Vars(name) AddVarName name If 0 Then value, name Else (name) 編譯原理綜合設(shè)計報告 46 value, name End If End Function Public Function getVar(ByVal name As String) On Error Resume Next Dim v() As String v = Split(KEYWORD, ,) If inArray(v, name) Then 59, , Exit Function End If t = Vars(name) AddVarName name If 0 Then 0, name getVar = 0 Else getVar = t End If End Function Private Function AddVarName(ByVal name As String) For i = 1 To If VarNames(i) = name Then Exit Function Next name End Function 源代碼 Private s As New Collection Public Sub Push(ByVal Item As Variant) If = 0 Then Item Else Item, , 1 End If End Sub Public Function Pop() t = (1) 1 Pop = t End Function 編譯原理綜合設(shè)計報告 。變量賦值 On Error Resume Next Dim v() As String v = Split(KEYWORD, ,) If inArray(v, name) Then 59, , 變量名 amp。 4. 設(shè)局全局暫停標(biāo)志,一來可以在程序進入死循環(huán)時更改這個標(biāo)志暫停程序,二來可以在程序起始時暫停用于單步調(diào)試。 編譯原理綜合設(shè)計報告 44 圖 111 調(diào)試窗口設(shè)計 2. 建立一個全局的斷點列表,然后在解釋每一行之前都檢查此行是否在斷點列表內(nèi)來決定是否暫停運行。 6. 程序進入死循環(huán)時能手動暫停程序執(zhí)行。 4. 暫停時能查看所有變量,以及變量的值。 2. 當(dāng)調(diào)試的時候,到達斷點所在的行,自動暫停。 7. 當(dāng)鼠標(biāo)點擊或者鍵盤有鍵按下時,計算出當(dāng)前行數(shù)并顯示在狀態(tài)欄中。 5. 當(dāng)拖動編輯框內(nèi)的文字的時候,不響應(yīng)代碼格式化的操作。 3. 設(shè)置文檔修改標(biāo)志,用于當(dāng)文件內(nèi) 容修改時提示是否保存。 設(shè)計思想 1. 利用 VB 自帶的單文檔應(yīng)用程序向?qū)ё詣由纱绑w和菜單。 3. 實現(xiàn)自動縮進動能,方便源代碼時格式自動整理。 棧成員函數(shù)表 表 61 棧成員函數(shù) 流程圖 元素進棧流程圖 名稱 屬性 說明 Push 函數(shù) 函數(shù):用于存放輸入的元素 Pop 函數(shù) 函數(shù):將棧里的元素依次移出 Clear 函數(shù) 函數(shù):將棧里的所有元素清空 編譯原理綜合設(shè)計報告 21 數(shù) 據(jù)進 棧棧 是 否 為 空存 儲 進棧 底 部結(jié) 束是數(shù) 據(jù) 進 入棧 頂否 圖 61 元素進棧流程圖 元素出棧流程圖 數(shù) 據(jù)出 棧棧 是 否 為 空結(jié) 束是棧 頂 元素 出 棧否 圖 62 元素出棧流程圖 棧清空流程圖 編譯原理綜合設(shè)計報告 22 清 空 棧棧 是 否 為 空結(jié) 束是清 空 棧否 圖 63 棧清空流程圖 7主模塊設(shè)計 + Init (in s Cod e : Str ing )+ Run ()Cl ass _ Init iali ze ()strSo urce Cod e : Str ingLi ne s( ) : cls Li neiline : Integ erce : cls Ex pP luscls Cod e 設(shè)計思路 通過輸入界面的程序分析分 5遍預(yù)處理將輸入的程序編譯成系統(tǒng)能識別的格式,并且記錄去行號和他真正的物理地址和生成的邏輯地址,以便在以后的運行過程中能夠給出出錯的位置,便于程序的修改,通過 clsExpplus 判斷其真值然后給出下一步的運算行號 編譯原理綜合設(shè)計報告 23 主模塊成員說明 表 71 主模塊成員 流程圖 主流程圖 開始打開或直接輸入源程序出錯 ?按行讀入源程序到數(shù)組初步格式化源程序出錯 ?預(yù)處理 Select Cas e 語句變 If .. El s eI f .. 格式出錯 ?預(yù)處理 Select Cas e 語句變 If .. El s eI f .. 格式出錯 ?預(yù)處理 展開 If ... El s eI f ... End I f 成為嵌套形式出錯 ?出錯 ?NNNNN預(yù)處理 把代碼行抽象成圖的節(jié)點 , 并給這些節(jié)點建立聯(lián)系出錯 ?解釋并執(zhí)行程序NN結(jié)束YYYYYYY 圖 71 主流程圖 名 稱 屬性 作用 StrSourceCode 私有變量 保存源代碼 Lines 私有變量 ClsLine 型數(shù)組,用于保存行結(jié)點 Ce 私有變量 表達式計算的類的引用聲明 iline 私有變量 cldLine 數(shù)組頂部標(biāo)志計數(shù)器 init 公有函數(shù) 初始化源代碼函數(shù) run 公有函數(shù) 運行程序 Class_initialize 構(gòu)造函數(shù) 初始化數(shù)據(jù) 編譯原理綜合設(shè)計報告 24 第一遍掃描流程圖 第一遍掃描獲取源程序計數(shù)器指向末尾按行拆分成數(shù)組初始化計數(shù)器插入一個結(jié)點分割出行號忽略掉注釋把制表符變成空格IF 開頭是否 Then 結(jié)尾 是否包含 els eNYYN調(diào)整格式插入 4 行調(diào)整格式插入 2 行YNI npu t 開頭報錯N調(diào)整格式變成多條連續(xù)的 I npu t 語句W hil e 開頭W end 開頭替換成 Do W hil e替換成 LoopNYNYYN結(jié)束Y 圖 72 第一遍掃描流程圖 編譯原理綜合設(shè)計報告 25 第二遍掃描流程圖 第二遍掃描EO F ?獲取開頭語句S e l e c t Ca s eCa s eCa s e Els eEn d S e l e c t替換成空替換成 If 或 e l s e I f 語句替換成 Els e 語句替換成 En d i f 語句結(jié)束NYNNNYYYYN 圖 73 第二遍掃描流程圖 編譯原理綜合設(shè)計報告 26 第三遍掃描流程圖 第三遍掃描EOF ?獲取開頭語句IFEls eIfEls eEn d I f入棧結(jié)束NYNNNYYYYN??請箦eY插入 els e 回車插入 IF入棧N??請箦eYN棧空 報錯Y棧不空出棧插入 En d I fYNN??誝報錯N 圖 74 第三遍掃描流程圖 編譯原理綜合設(shè)計報告 27 第四遍掃描流程圖 第四遍掃描EOF ?結(jié)束初始化 If 棧 、 W hil e 棧 、 For 棧 、 do 棧置錯誤行為此行查看語句頭IFEl s eEnd i f行號入 IF 棧IF 棧空出錯看 IF 棧頂做標(biāo)記YNYNNN行號出 IF ???IF 棧頂做標(biāo)記Y IF ??粘鲥eYNForExit ForNext行號入 For 棧For ??粘鲥eYNNNYY看 For 棧頂做標(biāo)記N行號出 For ???For 棧頂做標(biāo)記For 棧空出錯YNYDo W hil e 行號入 W hil e 棧YLoop 棧不空則行號出 W hil e 棧YDo 行號入 Do 棧YLoop unti l 棧不空則行號出 Do 棧YNNNExit Do 看 Do 棧和 W hil e 棧最小的 , 做標(biāo)記YYNN 圖 75 第四遍掃描流程圖 編譯原理綜合設(shè)計報告 28 第五遍掃描流程圖 第五遍掃描EOF ?獲取開頭語句是關(guān)鍵字置錯誤行為本行輸出窗口隱藏轉(zhuǎn)入相應(yīng)關(guān)鍵字處理NY結(jié)束送表達式處理模塊NYY 圖 76 第五遍掃描流程圖 For 處理有 S tep S tep 置 1拆分語句提取循環(huán)變量 , 下標(biāo)上標(biāo)提取 S tepNYS tep = 0 報錯YS tep 0 符合循環(huán)條件符合循環(huán)條件跳轉(zhuǎn)到 Ne x t更新循環(huán)變量跳轉(zhuǎn)到 Ne x t更新循環(huán)變量NYY