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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

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

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論