編譯原理課件:Chapter-9 錯誤處理_第1頁
編譯原理課件:Chapter-9 錯誤處理_第2頁
編譯原理課件:Chapter-9 錯誤處理_第3頁
編譯原理課件:Chapter-9 錯誤處理_第4頁
編譯原理課件:Chapter-9 錯誤處理_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第九章 錯誤處理9.1 概述9.2 錯誤的分類9.3 錯誤的診察和報(bào)告9.4 錯誤處理技術(shù)19.1 概述1. 錯誤處理是編譯器的必備功能之一一般情況下,用戶開發(fā)源程序都難免出現(xiàn)各種錯誤。一般有語法和語義錯誤,還有鍵入疏忽等。正確的源程序:通過編譯,生成目標(biāo)代碼。錯誤的源程序:通過編譯,發(fā)現(xiàn)并指出錯誤。 編譯程序?qū)τ谡Z法和語義正確的源程序要正確地編譯生成等價(jià)的目標(biāo)代碼;而對于錯誤的源程序不能一發(fā)現(xiàn)就停止,而是要能檢查出錯誤的性質(zhì)和出錯位置,并使編譯能繼續(xù)下去,同時(shí)盡可能多而準(zhǔn)確地發(fā)現(xiàn)錯誤和指出各種錯誤。22. 編譯器的錯誤處理能力(1) 診察錯誤的能力。(2) 報(bào)錯及時(shí)準(zhǔn)確(出錯位置,錯誤性質(zhì))

2、。(3) 一次編譯找出錯誤的多少。(4) 改正錯誤的能力。(5) 遏制重復(fù)錯誤信息的能力。用戶希望使用錯誤處理能力強(qiáng)的編譯器,盡可能快地得到一個語法語義正確的源程序。39.2 錯誤的分類從編譯角度,將錯誤分為兩類:語法錯誤和語義錯誤。語義錯誤:程序不符合語義規(guī)則或超越具體計(jì)算機(jī)系統(tǒng)的限制。超越系統(tǒng)限制:(計(jì)算機(jī)系統(tǒng)和編譯系統(tǒng))1. 數(shù)據(jù)溢出錯誤,常數(shù)太大,計(jì)算結(jié)果溢出。2. 符號表、靜態(tài)存儲分配數(shù)據(jù)區(qū)溢出。3. 動態(tài)存儲分配數(shù)據(jù)區(qū)溢出。語法錯誤:程序結(jié)構(gòu)不符合語法(包括詞法)規(guī)則的錯誤。49.3 錯誤的診察和報(bào)告錯誤診察: 1. 違反語法和語義規(guī)則以及超過編譯系統(tǒng)限制的錯誤。由編譯程序在語法和

3、語義分析過程中診察出來。(語義分析要借助符號表) 2. 下標(biāo)越界、計(jì)算結(jié)果溢出以及動態(tài)存儲數(shù)據(jù)區(qū)溢出等在目標(biāo)程序運(yùn)行時(shí)才能檢測,因此由目標(biāo)程序診察。 對此,編譯程序要生成相應(yīng)的目標(biāo)程序代碼進(jìn)行檢查并處理。5錯誤報(bào)告:1. 出錯位置:即源程序中出現(xiàn)錯誤的位置。實(shí)現(xiàn):設(shè)立行號計(jì)數(shù)器 line-no 設(shè)立單詞序號計(jì)數(shù)器 char-no一旦診察出錯誤,當(dāng)前的計(jì)數(shù)器內(nèi)容就是出錯位置。2. 出錯性質(zhì):可直接顯示文字信息可給出錯誤編碼63. 報(bào)告錯誤:(兩種方式)分析以后再報(bào)告(顯示或者打?。?編譯程序可設(shè)一個保存錯誤信息的數(shù)據(jù)區(qū)(可用記錄型數(shù)組),將語法語義分析所診斷到的錯誤送數(shù)據(jù)區(qū)保存,待源程序分析完以

4、后,統(tǒng)一顯示或打印錯誤信息。例:Ax , y :=B+*C源程序行號 錯誤序號 錯誤性質(zhì) x x 6 缺少“ ” x x 10 表達(dá)式語法錯誤7(2) 邊分析邊報(bào)告在分析一行源程序時(shí)若發(fā)現(xiàn)有錯,可以立即輸出該行源程序,并在其下輸出錯誤信息。Line-no Ax , y :=B + *C缺“”or n錯誤編號表達(dá)式語法錯 m錯誤編號8例如有ALGOL程序段:begin . i := 1 step 1 until n do .end有時(shí)報(bào)錯不一定十分準(zhǔn)確(位置和性質(zhì)),需進(jìn)一步分析。99.4 錯誤處理技術(shù)發(fā)現(xiàn)錯誤后,在報(bào)告錯誤的同時(shí)還要對錯誤進(jìn)行處理,以方便編譯能繼續(xù)進(jìn)行下去。目前有兩種處理辦法:

5、1. 錯誤改正:指編譯診察出錯誤以后,根據(jù)文法進(jìn)行錯誤改正。如:A i , j :=B + * C編譯可根據(jù) A 的定義(聲明),查符號表知道 A 是二維數(shù)據(jù),所以應(yīng)加上“ ”;根據(jù)表達(dá)式定義去掉“ * ”(但也有可能去掉“ + ”)但不是總能做到,如:A := B C * D + E ) 是多一個右括號還是少一個左括號? 如果是少了左括號,應(yīng)該少在何處?所以,要正確地改寫錯誤時(shí)很困難的!102. 錯誤局部化處理:指當(dāng)編譯程序發(fā)現(xiàn)錯誤后,盡可能將把錯誤的影響限制在一個局部的范圍,避免錯誤擴(kuò)散和影響程序其它部分的分析。(1) 一般原則(2) 錯誤局部化處理的實(shí)現(xiàn)(3) 提高錯誤局部化程度的方法1

6、1(1) 一般原則 當(dāng)診斷到錯誤以后,就暫停對后面符號的分析,跳過錯誤所在的語法成分(一旦跳過就認(rèn)為該語法成分是正確的)然后繼續(xù)往下分析。詞法分析:發(fā)現(xiàn)不合法字符,顯示錯誤,并跳過該標(biāo)識符(單詞)繼續(xù)往下分析。語法語義分析:跳過所在的語法成分(短語或語句),一般是跳到語句右界符,然后從新語句繼續(xù)往下分析。12(2) 錯誤局部化處理的實(shí)現(xiàn)(遞歸下降分析法)CX:全局變量,存放錯誤信息。 用遞歸下降分析時(shí),如果發(fā)現(xiàn)錯誤,便將有關(guān)錯誤信息(字符串或者編號)送CX,然后轉(zhuǎn)出錯誤處理程序; 出錯程序先打印或顯示出錯位置以及出錯信息,然后跳出一段源程序,直到跳到語句的右界符(如end、; ),或正在分析的

7、語法成分的合法后繼符號為止,然后再往下分析。13例:條件語句分析if then else ;有如下分析程序:procedure if statement; begin nextsym; /*讀下個單詞符號*/ B;/*調(diào)用布爾表達(dá)式處理程序*/ if not class = then then begin cx := 缺then;/*錯誤性質(zhì)送cx*/ error; /*調(diào)用出錯處理程序*/ end; else begin nextsym; statement; end; if class = else then begin nextsym; statement; end; end if st

8、atement; 14局部化處理的出錯程序?yàn)?procedure error; begin write( cx, 源程序行號, 序號) repeat nextsym; until class = ; or class = end or class = else end error;可以看出,如發(fā)現(xiàn)錯誤就立即跳到語句結(jié)尾處(語句右界符 end , ; 等)。這樣的處理比較粗糙,將跳過太多。上例中缺then,就將跳過整個條件語句,使得then后面的語句都被跳過而不分析,其中若有錯誤就發(fā)現(xiàn)不了。15(3) 提高錯誤局部化程度的方法設(shè) S1: 合法后繼符號集 (某語法成分的后繼符號) S2: 停止符號(跳讀必須停止的符號集)16當(dāng)發(fā)現(xiàn)錯誤時(shí): error( S1, S2 )procedure error( S1, S2 ) begin write( line-no, char-no, cx); repeat nextsym until( class in S1 or class in S2 ); end error;上面例題中的 if 語句中,若有錯,則可跳到then;若statement有錯,則可跳到 else。if then else ;173. 目標(biāo)程序運(yùn)行時(shí)錯誤檢測與處理 對于這類錯誤,要正確地報(bào)告出錯誤位

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論