編譯原理學習筆記 9 4 錯誤處理技術

2021-10-10 20:19:03 字數 2337 閱讀 4512

前言

更新中。。。

跳過目錄

發現錯誤後,在報告錯誤的同時還要對錯誤進行處理,以便編譯能繼續進行下去。

目前有兩種處理辦法:

指編譯診察出錯誤以後,根據語言的文法和對程式意圖作某種猜測,進行錯誤改正。

例:

a[i, j :

= b +

* c

但不是總能做到改正錯誤

例:

a :

= b - c * d + e)

所以,要正確地改寫錯誤是很困難的。

指當編譯程式發現錯誤後,盡可能將把錯誤的影響限制在乙個區域性的範圍,避免錯誤擴散和影響程式其它部分的分析。

當診斷到錯誤以後,就暫停對後面符號的分析,跳過錯誤所在的語法成分(一旦跳過就認為該語法成分是正確的)然後繼續往下分析。

詞法分析:

語法語義分析:

cx:全域性變數,存放錯誤資訊。

例:條件語句分析

if

then

[else

];

有如下分析程式:

void

if_statement()

else

if(class == elsesy)

}// end of if_statement()

區域性化處理的出錯程式為:

void

error()

until

(class == semicolon || class == endsy || class == elsesy)

}//end of error()

可以看出,如發現錯誤就立即跳到語句結尾處(語句右界符 end , ; 等)。這樣的處理比較粗糙,將跳過太多。上例中缺then,就將跳過整個條件語句,使得then後面的語句都被跳過而不分析,其中若有錯誤就發現不了。

例:algol說明

real x, 1a, a, bed, 2fg;
語法分析時,可發現第二個識別符號有錯,按上述處理辦法則跳到該語句的右界符;,這導致最後乙個識別符號的錯誤未檢查出來,且因為正確說明的識別符號 a 、 bed 未進

行分析,則後面對這兩個識別符號 的引用都將被判定為未 聲 明 。設:

當發現錯誤時: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

];

當符號棧頂的終結符和下乙個輸入符號不匹配,或棧頂是非終結符a,輸入符號a,而m [a , a]為空白(即error)時,則分析發現錯誤。

錯誤恢復的基本思想是:跳過一些輸入符號,直到期望的同步符號之一出現為止。

同步符號(可重新開始繼續分析的輸入符號)集合通常可按以下方法確定:

把follow(a)的所有符號加入a的同步符號集。如果我們跳讀一些輸入符號直到出現follow(a)的符號,之後把 a 從棧中彈出,繼續往下分析即可。

只用follow(a)作為非終結符a的同步符號集是不夠的(容易造成跳讀過多,如輸入串中缺少語句結束符分號時)。此時可將作為語句開頭的關鍵字加入它的同步符號集,從而避免這種情況的發生。

把first(a)的符號加入非終結符a的同步符號集中。

如果非終結符a可以產生空串,那麼推導ε的產生式可以作為預設的情況。這樣做可以推遲某些錯誤檢查,但不會漏過錯誤。

如果終結符在棧頂而不能匹配,則可彈出該終結符並發出一條資訊後繼續分析。這好比把所有其他符號均作為該符號的同步集合元素。

目標程式執行時錯誤檢測與處理

對於這類錯誤,要正確地報告出錯誤位置很難,因為目標程式與源程式之間難以建立位置上的對應關係。

在編譯時生成檢測該類錯誤的**。

• 下標變數下標值越界

• 計算結果溢位

• 動態儲存分配資料區溢位

一般處理辦法:

當目標程式執行檢測到這類錯誤時,就呼叫異常處理,列印錯誤資訊和執行現場(暫存器和儲存器中的值)等,然後停止程式執行。

編譯原理學習筆記(十一)錯誤處理

1.目標 編譯程式對於語法和語義正確的源程式要正確地編譯生成等價的目標 而對於錯誤的源程式不能一發現就停止,而是要能檢查出錯誤的性質和出錯位置,並使編譯能繼續下去,同時盡可能多而準確地發現錯誤和指出各種錯誤。2.編譯器的錯誤處理能力 3.錯誤分類 語法錯誤 語義錯誤。語法錯誤 程式結構不符合語法 包...

編譯原理學習筆記 9 2 錯誤的分類

前言 更新中。跳過目錄 從編譯程式角度,將源程式中錯誤分為兩類 程式結構不符合語法 包括詞法 規則的錯誤。例 乙個具有三處語法錯誤的賦值語句 a x,y 3 1416 t t h 對語法錯誤大家都很熟悉,它可以在編譯過程的詞法分析階段或語法分析階段查詢出來。一般來說,對於語法錯誤,編譯程式能比較準確...

編譯原理學習筆記 語法

高階程式語言可分為 1.強制性語言 2.作用時語言 3.基於規則的語言 4.物件導向的語言 程式語言主要由語法,語義,語用 語用 有關程式設計和語言成分的使用方法,它使語言的基本概念與外界的語言 如數學概念或計算機的物件和操作 聯絡起來。語法 語法是指這樣的一組規則,用它可以形成和產生乙個合式的程式...