編譯程序構造與實踐教程第八章_第1頁
編譯程序構造與實踐教程第八章_第2頁
編譯程序構造與實踐教程第八章_第3頁
編譯程序構造與實踐教程第八章_第4頁
編譯程序構造與實踐教程第八章_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第8章程序錯誤的檢查和校正8.1概述8.1.1程序錯誤檢查的必要性程序中存在錯誤在所難免。一個好的編譯程序,應能具有較強的查錯和改錯能力。查錯,就是編譯程序能在編譯時刻,及時而準確地發(fā)現(xiàn)源程序中的錯誤,并能以簡明的方式,向程序書寫者報告這些錯誤的性質和出現(xiàn)的確切位置。目標是一次編譯就能查出盡可能多,甚至全部的錯誤。8.1.2.錯誤的種類詞法錯誤語法錯誤語義錯誤違犯環(huán)境限制的錯誤1.詞法錯誤:編譯程序在詞法分析階段發(fā)現(xiàn)的源程序錯誤。例如,關鍵字(保留字)拼寫錯、標點符號錯與非法字符等。2.語法錯誤:編譯程序在語法分析階段發(fā)現(xiàn)的源程序錯誤,亦即,書寫不符合某語法成分的語法規(guī)則。例如,作為語句括號的{與}不匹配、(與)不匹配,if語句中的條件表達式未用小括號對括住,以及else沒有匹配的if等等。另外,變量未說明或被重定義等也可看作語法

(全局語法)錯誤。

3.語義錯誤源程序中的語義錯誤有兩類:

1)

靜態(tài)語義錯誤,這在編譯時刻發(fā)現(xiàn)。例如,語義分析時發(fā)現(xiàn):對某些運算分量進行不允許的運算,或者一個運算的兩個運算分量類型不相容,等。

2)

動態(tài)語義錯誤,這在目標代碼運行期間才能發(fā)現(xiàn)。這時,雖然編譯程序把源程序翻譯成了等價的目標代碼,未發(fā)現(xiàn)任何錯誤,但運行不能正常結束或者經驗證運行結果是不正確的,即,存在邏輯或算法上的錯誤,包括程序未能正確地反映算法,甚至可能算法本身就是錯誤的。

4.違犯環(huán)境限制的錯誤環(huán)境限制:編譯程序對它所能接受的源程序運行時施加的某些限制。例如,C程序中一個整型量占的字節(jié)數(shù)、標識符最大長度、if-else嵌套嵌套最大層數(shù)、數(shù)組的最大維數(shù)。不遵循這些限制,將造成錯誤。對于一個好的編譯程序來說,應能具有較強的查錯和改錯(校正)的能力。查錯,就是編譯程序能在編譯時刻及時發(fā)現(xiàn)源程序中的錯誤,并能以簡明的方式向程序書寫人員報告錯誤的性質和錯誤所在的確切位置。改錯,是指編譯程序在其翻譯過程中發(fā)現(xiàn)源程序的錯誤時,能對源程序作出適當?shù)男拚?,也即校正。如果一個編譯程序能在一次編譯時刻,查出源程序中幾乎所有的錯誤,指出錯誤的性質,給出錯誤所在的確切位置,并能提供嘗試自動改正的信息,那么對于源程序錯誤的迅速改正將有非常大的幫助。

8.1.3相關的基本概念錯誤復原:在編譯過程中,發(fā)現(xiàn)源程序中的錯誤時,采取一定的措施,使得能繼續(xù)編譯下去。在錯誤復原時,應重視下列兩個方面:

·株連信息的遏止

·重復信息的遏止當源程序中發(fā)現(xiàn)某個錯誤時,往往由此錯誤導致編譯程序向源程序書寫人員發(fā)出更多的錯誤信息,而所發(fā)出的更多的出錯信息往往是不真實的。這種信息稱為株連信息。例如,假定源程序中包含一個函數(shù)調用f(R.m),其中,m是結構變量R的成員變量,但在鍵入時錯鍵入成了f(R,m)。編譯時,處理到符號”)”時,將發(fā)出如下三個報錯信息:“m無定義”、”參數(shù)的類型不匹配”與“參數(shù)多一個”。如果同一個錯誤出現(xiàn)在源程序中多處時,就將形成重復信息。如果一個標識符未在函數(shù)定義內說明,在該函數(shù)定義內的語句部分中,每次引用時都將發(fā)出報錯信息:標識符無定義。

8.2詞法錯誤的復原與校正

8.2.1詞法錯誤的種類

詞法錯誤:拼錯、遺漏、多拼、顛倒

(可假定不會發(fā)生連續(xù)幾個字符錯)

與錯誤復原相關的問題:

·錯誤的查出

·錯誤的定位

·錯誤的局部化

·重復錯誤信息的遏止

8.2.2

詞法錯誤的校正

假定不存在連續(xù)幾個字符都錯。

校正方法:增加、刪除、替換、交換(一個字符)

一般說,不論是用替換、插入、刪除,還是交換的方法去校正,都是試探的,可以以最可能成功的那種修改作為對錯誤的校正。不言而喻,必須輸出校正信息,供程序書寫人員校正時參考。8.3語法錯誤的復原與校正8.3.1語法錯誤的復原對于語法錯誤的復原,與詞法錯誤的情況一樣,自然地涉及下列問題:

·錯誤的查出·錯誤的定位·錯誤的局部化·重復錯誤信息的遏止8.3.2語法錯誤的校正1.自頂向下分析中錯誤的校正2.自底向上分析中錯誤的校正校正方法:結合語法分析技術進行錯誤的校正。具體說,在相應分析表的出錯元素處,給出錯誤處理子程序的序號。

當按自頂向下的LL(1)分析技術或按自底向上的LR(1)分析技術進行語法分析時,都是基于相應的分析表進行的。當某個分析步時當前分析表元素是空白,表示出錯,因此讓分析表中的空白元素對應于一個出錯處理子程序,調用時進行相應的處理,可以嘗試進行語法錯誤的校正。8.4語義錯誤8.4.1語義錯誤的種類1.靜態(tài)語義錯誤

運算符不合法和運算分量類型不相容是典型的數(shù)據(jù)類型引起的靜態(tài)語義錯誤。試圖從循環(huán)外把控制轉移到循環(huán)內,以及由無條件控制轉移語句把控制轉移到if語句的內嵌語句內,是控制流方面的靜態(tài)語義錯誤。

2.動態(tài)語義錯誤

典型的動態(tài)語義錯誤,例如,除以零、存取未置值或值為NULL的指針變量所指向對象的成員、數(shù)組元素的下標表達式之值越界、變量未被賦值便被引用、顯示輸出的運行結果與預期的不一致,等等。8.4.2語義錯誤檢查措施1,靜態(tài)模擬追蹤法

靜態(tài)模擬檢查。

靜態(tài)模擬追蹤法,顧名思義,靜態(tài)地模擬執(zhí)行程序,對變量的值進行追蹤檢查。進一步說,由人模擬計算機,相繼模擬執(zhí)行程序中各個語句,沿著所模擬的執(zhí)行路徑,記錄下程序中各個變量之值的變化,最終檢查結果的正確性。

2.利用動態(tài)調試工具利用軟件工具在計算機上動態(tài)地調試檢查,將大大地減輕人的負擔。

編譯程序可看成這樣的軟件工具,但如前所見,僅能查出編譯時刻能發(fā)現(xiàn)的那些錯誤。為了發(fā)現(xiàn)動態(tài)語義錯誤,需要利用動態(tài)調試程序(debugger)。動態(tài)調試程序通常包含下列功能:設置斷點、查看變量值

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論