![編譯原理簡(jiǎn)明教程(第2版)[馮秀芳,崔冬華,段富][電子教案]第12章_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/7/5040258c-0bc4-4f64-bccf-740bfa266028/5040258c-0bc4-4f64-bccf-740bfa2660281.gif)
![編譯原理簡(jiǎn)明教程(第2版)[馮秀芳,崔冬華,段富][電子教案]第12章_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/7/5040258c-0bc4-4f64-bccf-740bfa266028/5040258c-0bc4-4f64-bccf-740bfa2660282.gif)
![編譯原理簡(jiǎn)明教程(第2版)[馮秀芳,崔冬華,段富][電子教案]第12章_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/7/5040258c-0bc4-4f64-bccf-740bfa266028/5040258c-0bc4-4f64-bccf-740bfa2660283.gif)
![編譯原理簡(jiǎn)明教程(第2版)[馮秀芳,崔冬華,段富][電子教案]第12章_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/7/5040258c-0bc4-4f64-bccf-740bfa266028/5040258c-0bc4-4f64-bccf-740bfa2660284.gif)
![編譯原理簡(jiǎn)明教程(第2版)[馮秀芳,崔冬華,段富][電子教案]第12章_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/7/5040258c-0bc4-4f64-bccf-740bfa266028/5040258c-0bc4-4f64-bccf-740bfa2660285.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、編譯原理簡(jiǎn)明教程普通高等教育“十二五”規(guī)劃計(jì)算機(jī)教材-太原理工大學(xué)-計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院-馮秀芳、崔冬華、段富等目目 錄錄第12章 出錯(cuò)處理 12.1 引言 12.2 校正詞法錯(cuò)誤 12.3 校正語(yǔ)法錯(cuò)誤 12.4 校正語(yǔ)義錯(cuò)誤 習(xí)題1212.1 引言 12.1.1 錯(cuò)誤存在的必然性 12.1.2 錯(cuò)誤的種類(lèi) 12.1.3 錯(cuò)誤復(fù)原12.1.1 錯(cuò)誤存在的必然性 編譯程序用來(lái)對(duì)源程序進(jìn)行編譯,當(dāng)程序在語(yǔ)法(包括詞法)上正確時(shí),可以得到相應(yīng)的等價(jià)的目標(biāo)代碼。當(dāng)程序在語(yǔ)義上正確時(shí),以正確的輸入數(shù)據(jù)運(yùn)行目標(biāo)代碼可以得到預(yù)期的輸出結(jié)果。然而,一個(gè)程序,尤其是大型軟件的程序,其中難免包含錯(cuò)誤。一個(gè)軟件開(kāi)
2、發(fā)中所存在的錯(cuò)誤分布比例大致為:56%的錯(cuò)誤源自需求分析,27%的錯(cuò)誤源自設(shè)計(jì),7%的錯(cuò)誤源自編碼。有人認(rèn)為“沒(méi)有一個(gè)程序第一次運(yùn)行就能正確地工作”是計(jì)算機(jī)程序設(shè)計(jì)的一個(gè)公理。12.1.1 錯(cuò)誤存在的必然性 一個(gè)素質(zhì)較好的程序員,在他交付的程序中錯(cuò)誤率為1%,即每100個(gè)語(yǔ)句中約含1條錯(cuò)誤,而水平低的程序員編寫(xiě)的程序,在剛開(kāi)始調(diào)試時(shí)錯(cuò)誤率是很高的。錯(cuò)誤產(chǎn)生原因大致是因?yàn)閱?wèn)題(算法)的復(fù)雜性、程序員素質(zhì)、輸入錯(cuò)誤以及對(duì)系統(tǒng)環(huán)境不夠了解等,概括起來(lái)是因?yàn)槿祟?lèi)自身能力的局限性。12.1.2 錯(cuò)誤的種類(lèi) 一個(gè)源程序中的錯(cuò)誤一般有如下四類(lèi)。 詞法錯(cuò)誤。編譯程序在詞法分析階段發(fā)現(xiàn)的源程序錯(cuò)誤,例如,字符號(hào)
3、(關(guān)鍵字)拼寫(xiě)有錯(cuò),標(biāo)點(diǎn)符號(hào)有錯(cuò),等等。 語(yǔ)法錯(cuò)誤。編譯程序在語(yǔ)法分析階段發(fā)現(xiàn)的源程序錯(cuò)誤,亦即書(shū)寫(xiě)不符合某語(yǔ)法成分的語(yǔ)法規(guī)則。例如,作為語(yǔ)句括號(hào)的BEGIN與END不匹配,“”與“”不匹配,以及IF與ELSE之間缺少THEN,等等。另外,變量未說(shuō)明或重定義等也可看做語(yǔ)法錯(cuò)誤。12.1.2 錯(cuò)誤的種類(lèi) 語(yǔ)義錯(cuò)誤。源程序中的語(yǔ)義錯(cuò)誤有兩類(lèi),一類(lèi)是在編譯時(shí)才可發(fā)現(xiàn)的靜態(tài)語(yǔ)義錯(cuò)誤,例如,編譯程序語(yǔ)義分析時(shí)發(fā)現(xiàn)的運(yùn)算符對(duì)運(yùn)算分量類(lèi)型而言不合法,或者雙目運(yùn)算符的兩個(gè)運(yùn)算分量類(lèi)型不相容,等等。另一類(lèi)是在目標(biāo)代碼運(yùn)行時(shí)刻才能發(fā)現(xiàn)的動(dòng)態(tài)語(yǔ)義錯(cuò)誤,也就是說(shuō),雖然編譯程序把源程序翻譯成了等價(jià)的目標(biāo)代碼,未發(fā)現(xiàn)任何
4、錯(cuò)誤,但運(yùn)行不能正常結(jié)束或者運(yùn)行結(jié)果經(jīng)驗(yàn)證卻是不正確的。12.1.2 錯(cuò)誤的種類(lèi) 違反環(huán)境限制的錯(cuò)誤。一個(gè)程序設(shè)計(jì)語(yǔ)言可以有豐富的表達(dá)能力,用以書(shū)寫(xiě)各種應(yīng)用領(lǐng)域的程序,然而由于編譯程序的實(shí)現(xiàn)問(wèn)題,一個(gè)手頭上可用的編譯程序往往對(duì)它所能接受的源程序加某些限制。例如,Pascal語(yǔ)言中過(guò)程的可調(diào)數(shù)組參數(shù)就不是每個(gè)編譯程序都可以接受的。另外,如標(biāo)識(shí)符的長(zhǎng)度、整數(shù)的最大值范圍、IF語(yǔ)句的最大嵌套層數(shù)和數(shù)組的最大維數(shù)等,都可能會(huì)有一定的限制。12.1.2 錯(cuò)誤的種類(lèi) 對(duì)于一個(gè)好的編譯程序來(lái)說(shuō),應(yīng)能具有較強(qiáng)的查錯(cuò)和改錯(cuò)能力。查錯(cuò),就是編譯程序能在編譯時(shí)刻,準(zhǔn)確而及時(shí)地發(fā)現(xiàn)源程序中的錯(cuò)誤,并能以簡(jiǎn)明的方式向用
5、戶(hù)報(bào)告這些錯(cuò)誤的性質(zhì)和出現(xiàn)的確切位置。一個(gè)編譯程序應(yīng)在一次編譯期間發(fā)現(xiàn)源程序中盡可能多的錯(cuò)誤,不是發(fā)現(xiàn)一個(gè)錯(cuò)誤便立即停止編譯。在編譯時(shí)刻能夠查出的源程序的錯(cuò)誤稱(chēng)為靜態(tài)錯(cuò)誤,運(yùn)行時(shí)刻才能查出的錯(cuò)誤稱(chēng)為動(dòng)態(tài)錯(cuò)誤。本章討論的程序錯(cuò)誤的檢查和校正主要是針對(duì)靜態(tài)錯(cuò)誤,即詞法錯(cuò)誤、語(yǔ)法錯(cuò)誤、非邏輯的或算法上的語(yǔ)義錯(cuò)誤及違反環(huán)境限制錯(cuò)誤。12.1.2 錯(cuò)誤的種類(lèi) 改錯(cuò)及校正,指編譯程序在其翻譯過(guò)程中發(fā)現(xiàn)源程序的錯(cuò)誤時(shí)能適當(dāng)?shù)貙?duì)源程序進(jìn)行修正。為了正確地校正錯(cuò)誤,必須十分清楚地了解程序的意圖,了解錯(cuò)誤的性質(zhì),并確切地對(duì)錯(cuò)誤定位。即使是詞法錯(cuò)誤,也必須根據(jù)上下文,試探性地做出修改。12.1.2 錯(cuò)誤的種類(lèi) 一般
6、來(lái)說(shuō),一個(gè)編譯程序如果能在一次編譯時(shí)刻查出源程序中幾乎所有的錯(cuò)誤,指出錯(cuò)誤的性質(zhì),并給出錯(cuò)誤所在的確切位置,對(duì)于源程序的迅速改正將有很大的幫助。12.1.3 錯(cuò)誤復(fù)原 詞法分析時(shí),如果發(fā)現(xiàn)輸入字符串存在一個(gè)錯(cuò)誤,這表明,該輸入字符串不是相應(yīng)文法的句子,是否就此不再繼續(xù)詞法分析呢?如果語(yǔ)法分析時(shí),類(lèi)似地發(fā)現(xiàn)中間表示符號(hào)串中存在錯(cuò)誤,表明不是相應(yīng)文法的句子,是否也不再繼續(xù)語(yǔ)法分析呢?對(duì)于一個(gè)實(shí)用的編譯程序來(lái)說(shuō),它不應(yīng)只能處理正確的程序,它還必須能處理源程序中出現(xiàn)的錯(cuò)誤,使得編譯工作能繼續(xù)正常進(jìn)行下去,不是發(fā)現(xiàn)一個(gè)錯(cuò)誤就結(jié)束編譯,而是繼續(xù)下去,以便查出全部錯(cuò)誤。12.1.3 錯(cuò)誤復(fù)原 由于錯(cuò)誤的存在
7、,往往使編譯程序不能正常地繼續(xù)下去,早期的一些編譯程序,例如,ALGOL 60語(yǔ)言的編譯程序采用結(jié)束編譯的辦法。如今,幾乎所有常用程序設(shè)計(jì)語(yǔ)言的編譯程序都能在發(fā)現(xiàn)源程序中的錯(cuò)誤時(shí)繼續(xù)進(jìn)行編譯,以便一次編譯能查出盡可能多的錯(cuò)誤。 在編譯的過(guò)程中,發(fā)現(xiàn)源程序的錯(cuò)誤時(shí)采取一定的措施,使得能繼續(xù)編譯下去,這稱(chēng)為錯(cuò)誤復(fù)原。如果把所給不正確程序變換成正確的程序,則稱(chēng)之為錯(cuò)誤校正。顯然,如前所述的原因,錯(cuò)誤校正是極其困難的。12.1.3 錯(cuò)誤復(fù)原 在錯(cuò)誤復(fù)原時(shí),應(yīng)重視以下兩個(gè)方面: 株連信息的遏止。 重復(fù)信息的遏止。 株連信息指的是因?yàn)樵闯绦蛑械哪硞€(gè)錯(cuò)誤而導(dǎo)致編譯程序向用戶(hù)發(fā)出的出錯(cuò)信息,該出錯(cuò)信息往往不是
8、真實(shí)的。12.1.3 錯(cuò)誤復(fù)原 例如,假定過(guò)程語(yǔ)句P(a,b)在輸入時(shí)成了p(a.b),編譯時(shí),編譯程序?qū)l(fā)出出錯(cuò)信息:是不合法符號(hào)。如果做出的處理是刪除,那么,當(dāng)掃描p之后,將發(fā)出出錯(cuò)信息:缺少運(yùn)算符,當(dāng)掃描到“)”時(shí),將再發(fā)出出錯(cuò)信息:參數(shù)個(gè)數(shù)少。顯然后面兩個(gè)出錯(cuò)信息是不真實(shí)的。有時(shí)可能因?yàn)樵闯绦蛑械囊粋€(gè)錯(cuò)誤而引出一連串株連信息。應(yīng)該遏止這種株連信息。 為了遏止株連錯(cuò)誤,往往需要查看出錯(cuò)處的上下文和取得相關(guān)的信息。例如,對(duì)于上述例子,可以取得關(guān)于過(guò)程p參數(shù)個(gè)數(shù)的信息,標(biāo)識(shí)符a是否記錄類(lèi)型信息,并向前查看到“)”確定參數(shù)的個(gè)數(shù)。這樣,甚至可以做出正確的修改:把“ ”改成“,”。12.1.3
9、錯(cuò)誤復(fù)原 下面再考慮遏止株連錯(cuò)誤的另一個(gè)例子。假定對(duì)于下標(biāo)變量Ae1, e2, e3,發(fā)現(xiàn)標(biāo)識(shí)符A不是數(shù)組名,掃描到“”時(shí)發(fā)出出錯(cuò)信息:錯(cuò)。此后顯然將發(fā)出一連串株連錯(cuò)誤信息。究其原因,可能是因?yàn)闃?biāo)識(shí)符A未被說(shuō)明。為了遏止株連信息,可以這樣處理:用一個(gè)“萬(wàn)能”標(biāo)識(shí)符U去代替有錯(cuò)的標(biāo)識(shí)符A,或者說(shuō)讓A可以與任意類(lèi)型的數(shù)據(jù)結(jié)構(gòu)相關(guān)聯(lián),這時(shí)在符號(hào)表的相應(yīng)條目中已加標(biāo)志,且填入了數(shù)組和維數(shù)的信息,只要其后形如e1, e2, e3出現(xiàn),將不再發(fā)出出錯(cuò)信息。12.1.3 錯(cuò)誤復(fù)原 重復(fù)信息是因?yàn)樵闯绦蛑械囊粋€(gè)錯(cuò)誤反映在源程序中多處而產(chǎn)生的。一個(gè)典型的例子是標(biāo)識(shí)符未說(shuō)明。如果一個(gè)標(biāo)識(shí)符i未在某個(gè)過(guò)程說(shuō)明的過(guò)程
10、分程序中說(shuō)明,那么,在過(guò)程分程序的語(yǔ)句部分中每次引用i時(shí)都將發(fā)出出錯(cuò)信息:標(biāo)識(shí)符i無(wú)定義。12.1.3 錯(cuò)誤復(fù)原 為了遏止重復(fù)信息,可事先設(shè)立一個(gè)出錯(cuò)信息表,其中給出一切可能的出錯(cuò)信息(性質(zhì))和編號(hào),而編譯時(shí)刻,則建立一個(gè)出錯(cuò)信息集合,其元素呈(編號(hào)、關(guān)聯(lián)信息)形式。每當(dāng)發(fā)現(xiàn)一個(gè)錯(cuò)誤,便把相應(yīng)的(編號(hào)、關(guān)聯(lián)信息)添加入該出錯(cuò)信息集合中。最后,編譯結(jié)束時(shí),把出錯(cuò)信息集合中的元素按某種次序輸出,便得到了無(wú)重復(fù)的一切出錯(cuò)信息。12.2 校正詞法錯(cuò)誤 12.2.1 詞法錯(cuò)誤的種類(lèi) 12.2.2 詞法錯(cuò)誤的校正12.2.1 詞法錯(cuò)誤的種類(lèi) 詞法分析程序的基本任務(wù)是讀入源程序字符序列,識(shí)別出具有獨(dú)立意義的
11、最小語(yǔ)法單位(單詞或符號(hào)),并把它們變換成等價(jià)的內(nèi)部中間表示屬性字序列。詞法分析時(shí)發(fā)現(xiàn)的詞法錯(cuò)誤大多是單詞拼寫(xiě)錯(cuò)誤,這或者是因?yàn)闀?shū)寫(xiě)錯(cuò)誤,或者是因?yàn)檩斎脲e(cuò)誤,假定不會(huì)有連續(xù)幾個(gè)字符的錯(cuò)誤,從而可以假定有如下幾類(lèi)詞法錯(cuò)誤: 拼錯(cuò)一個(gè)字符,如RECORD錯(cuò)寫(xiě)成RCCORD。 遺漏一個(gè)字符,如REPEAT錯(cuò)寫(xiě)成REPET。 多拼一個(gè)字符,如UNTIL錯(cuò)寫(xiě)成UNTILE。 相鄰兩個(gè)字符顛倒了次序,如LABEL錯(cuò)寫(xiě)成LABLE。12.2.1 詞法錯(cuò)誤的種類(lèi) 對(duì)于錯(cuò)誤復(fù)原問(wèn)題,自然地涉及下列問(wèn)題: 錯(cuò)誤的查出。 錯(cuò)誤的定位。 錯(cuò)誤的局部化。 重復(fù)錯(cuò)誤信息的遏止。 由于每一類(lèi)單詞可用一個(gè)正則表達(dá)式來(lái)描述,所
12、以在識(shí)別單詞時(shí),通常采用最長(zhǎng)子串匹配策略。12.2.2 詞法錯(cuò)誤的校正 基于前面對(duì)詞法錯(cuò)誤的假設(shè),不存在連續(xù)幾個(gè)字符都出錯(cuò)的現(xiàn)象,對(duì)詞法錯(cuò)誤的校正一般地有 刪除一個(gè)字符。 插入一個(gè)字符。 替換一個(gè)字符。 交換相鄰兩個(gè)字符。12.2.2 詞法錯(cuò)誤的校正 由于詞法分析時(shí),還不能收集到足夠的信息,發(fā)現(xiàn)錯(cuò)誤便立即校正是不太恰當(dāng)?shù)模皇窃谀承﹫?chǎng)合可以予以校正,下面列舉若干。 知道下一步應(yīng)處理的字符號(hào)(關(guān)鍵字),而當(dāng)前所掃視的余留輸入字符序列的任何前綴都不能構(gòu)成字符號(hào)(關(guān)鍵字),則可查字符號(hào)(關(guān)鍵字)表,從其中選擇與當(dāng)前所掃視的輸入字符串前綴最接近的字符號(hào)(關(guān)鍵字)去代替這個(gè)前綴。例如“IF b THEM
13、”,對(duì)于“THEM”將用最接近的“THEN”去代替。12.2.2 詞法錯(cuò)誤的校正 如果某個(gè)標(biāo)識(shí)符拼寫(xiě)有錯(cuò),因此查找符號(hào)表時(shí)不能查到相應(yīng)條目,這時(shí)可用符號(hào)表中與之最接近的標(biāo)識(shí)符去代替它,例如,如果有語(yǔ)句X: = sim(a),但不能在符號(hào)表中查到標(biāo)識(shí)符sim,則可以用最接近的sin去代替sim。 其他拼寫(xiě)錯(cuò)誤的情況,例如,源程序中所引用之下標(biāo)變量的數(shù)組標(biāo)識(shí)符因拼寫(xiě)錯(cuò)誤而不能在符號(hào)表中查到,控制轉(zhuǎn)移語(yǔ)句的轉(zhuǎn)移目標(biāo)(標(biāo)號(hào))因拼寫(xiě)錯(cuò)誤而無(wú)定義,等等,都可以用與上面類(lèi)似的辦法來(lái)校正。 一般地,可以用試探法,試驗(yàn)刪除、插入、替換和交換四種情況,以最可能成功的那種修改作為對(duì)錯(cuò)誤的校正。12.3 校正語(yǔ)法錯(cuò)誤
14、 12.3.1 語(yǔ)法錯(cuò)誤的復(fù)原 12.3.2 語(yǔ)法錯(cuò)誤的校正12.3.1 語(yǔ)法錯(cuò)誤的復(fù)原 對(duì)于語(yǔ)法錯(cuò)誤的復(fù)原,與詞法錯(cuò)誤的情況一樣,自然地涉及下列問(wèn)題: 錯(cuò)誤的查出。 錯(cuò)誤的定位。 錯(cuò)誤的局部化。 重復(fù)錯(cuò)誤信息的遏止。 12.3.1 語(yǔ)法錯(cuò)誤的復(fù)原 由于程序設(shè)計(jì)語(yǔ)言的語(yǔ)法用上下文無(wú)關(guān)文法描述,源程序可由基于某種分析技術(shù)的識(shí)別程序精確地識(shí)別,源程序中的語(yǔ)法錯(cuò)誤總可自動(dòng)地查出。12.3.1 語(yǔ)法錯(cuò)誤的復(fù)原 不言而喻,不同的分析技術(shù)發(fā)現(xiàn)錯(cuò)誤的手段和方式是不同的。例如,LL(1)與LR(1)分析技術(shù)都是當(dāng)前棧頂狀態(tài)與當(dāng)前輸入符號(hào)配對(duì)所對(duì)應(yīng)的分析表元素空白時(shí)為出錯(cuò)。然而,對(duì)于優(yōu)先技術(shù),則是當(dāng)前棧頂符號(hào)和
15、當(dāng)前輸入符號(hào)匹配時(shí),它們之間不存在優(yōu)先關(guān)系而發(fā)現(xiàn)錯(cuò)誤。顯然,有的分析技術(shù)可對(duì)所發(fā)現(xiàn)的錯(cuò)誤準(zhǔn)確地定位,采取一定的措施,使語(yǔ)法分析能繼續(xù)進(jìn)行下去。12.3.1 語(yǔ)法錯(cuò)誤的復(fù)原 有的編譯程序,對(duì)語(yǔ)法錯(cuò)誤復(fù)原采取的措施是簡(jiǎn)單地放過(guò)相應(yīng)的語(yǔ)法結(jié)構(gòu),例如,放過(guò)一個(gè)語(yǔ)句的后繼符號(hào)等。這種過(guò)于簡(jiǎn)單的做法往往失去發(fā)現(xiàn)更多語(yǔ)法錯(cuò)誤的機(jī)會(huì)。更合適的是設(shè)法進(jìn)行校正,盡管這種校正不能保證總是成功的,然而,關(guān)于校正的信息可供用戶(hù)(程序書(shū)寫(xiě)人員)參考。12.3.2 語(yǔ)法錯(cuò)誤的校正 1自頂向下分析中錯(cuò)誤的校正 假定在自頂向下分析過(guò)程中的某一時(shí)刻,源程序符號(hào)串可寫(xiě)為w1Aw2的形式,其中,w1是已掃描部分,A是當(dāng)前掃描符號(hào),而
16、w2是輸入符號(hào)串的其余部分。如果掃描到A時(shí)發(fā)現(xiàn)錯(cuò)誤,分析程序又無(wú)法確定下一個(gè)合法的分析動(dòng)作,換言之,已構(gòu)造的語(yǔ)法樹(shù)部分可覆蓋w1,但不能繼續(xù)構(gòu)造語(yǔ)法樹(shù)去覆蓋A與其余部分w2。12.3.2 語(yǔ)法錯(cuò)誤的校正 一般可有如下三種修改措施。 刪去A,繼續(xù)進(jìn)行分析。 插入終結(jié)符號(hào)串X成為w1XAw2,從XAw2的首符號(hào)開(kāi)始繼續(xù)進(jìn)行分析。 修改w1,例如,刪去w1尾部的若干個(gè)符號(hào)、替換w1尾部的若干個(gè)符號(hào)或者在w1之后插入若干個(gè)符號(hào)。12.3.2 語(yǔ)法錯(cuò)誤的校正 修改措施顯然是不可取的,因?yàn)閣1已經(jīng)處理過(guò),不可能再次直接取到,且對(duì)已處理的部分進(jìn)行修改,往往要改變語(yǔ)義信息,實(shí)現(xiàn)上較為困難,因此不宜采用。 例如
17、,假如有源程序語(yǔ)句: i:=i+); 處理到符號(hào)“)”時(shí)顯然將發(fā)現(xiàn)存在錯(cuò)誤,一般地,當(dāng)按自頂向下分析技術(shù)構(gòu)造語(yǔ)法樹(shù)時(shí),對(duì)照語(yǔ)法樹(shù)和預(yù)期展開(kāi)的符號(hào)串,采用上述修改措施和,將把所給語(yǔ)句修改成 i:=i+i;2自底向上分析中錯(cuò)誤的校正 自底向上分析技術(shù)包括優(yōu)先分析技術(shù)(簡(jiǎn)單優(yōu)先和算符優(yōu)先)與LR分析技術(shù)。這里以L(fǎng)R分析技術(shù)為例說(shuō)明自底向上分析中語(yǔ)法錯(cuò)誤的校正。 在LR分析技術(shù)中,LR分析表的ACTION部分指明了當(dāng)前分析棧頂?shù)臓顟B(tài)與當(dāng)前輸入符號(hào)配對(duì)時(shí)所應(yīng)執(zhí)行的動(dòng)作。如果是空白元素,表明一個(gè)錯(cuò)誤,即當(dāng)前輸入符號(hào)有錯(cuò)。為了對(duì)語(yǔ)法錯(cuò)誤校正,可以對(duì)應(yīng)于每個(gè)空白元素,引進(jìn)一個(gè)出錯(cuò)處理子程序,根據(jù)出錯(cuò)情況,在各
18、個(gè)出錯(cuò)處理子程序中做出相應(yīng)處理。 這里仍以語(yǔ)句: i:=i+); 為例進(jìn)行討論。 假定掃描到上述語(yǔ)句中的符號(hào)“+”時(shí)進(jìn)入狀態(tài)Sk,則ACTIONSk,)當(dāng)然為出錯(cuò)(空白元素)。假定引進(jìn)的響應(yīng)出錯(cuò)處理子程序Ei,其功能有二:刪去當(dāng)前輸入符號(hào)和發(fā)出出錯(cuò)信息“不合法的輸入符號(hào):”。那么,執(zhí)行動(dòng)作ACTIONSk,)將調(diào)用子程序Ei,因而,刪去當(dāng)前輸入符號(hào),并發(fā)出出錯(cuò)信息:“不合法的輸入符號(hào):)”。這時(shí)將掃描下一個(gè)符號(hào)繼續(xù)分析下去,即讀入符號(hào),執(zhí)行動(dòng)作ACTIONSk, ;,為出錯(cuò),類(lèi)似地引進(jìn)出錯(cuò)處理子程序Ej,其功能可能如下:將一假想的標(biāo)識(shí)符i及相應(yīng)狀態(tài)S1下推入分析棧,并發(fā)出出錯(cuò)信息:運(yùn)算符分量缺
19、少,然后執(zhí)行動(dòng)作ACTIONS1, i 這里, ACTIONSk,i=S1 因此,最終,上述語(yǔ)句校正為 i:=i+i; 其他出錯(cuò)處理子程序可類(lèi)似地設(shè)計(jì)。 不言而喻,關(guān)于每個(gè)錯(cuò)誤的修改信息應(yīng)由出錯(cuò)處理子程序提供給用戶(hù)(程序書(shū)寫(xiě)人員)以便參考,完成真正的校正。 其他各類(lèi)分析技術(shù),可以參照上述實(shí)現(xiàn)思想進(jìn)行源程序語(yǔ)法錯(cuò)誤的校正。12.4 校正語(yǔ)義錯(cuò)誤 12.4.1 語(yǔ)義錯(cuò)誤的種類(lèi) 12.4.2 語(yǔ)義錯(cuò)誤檢查措施12.4.1 語(yǔ)義錯(cuò)誤的種類(lèi) 如前所述,語(yǔ)義錯(cuò)誤有兩類(lèi),一類(lèi)是在編譯時(shí)可以發(fā)現(xiàn)的靜態(tài)語(yǔ)義錯(cuò)誤,另一類(lèi)是在運(yùn)行時(shí)才能發(fā)現(xiàn)的動(dòng)態(tài)語(yǔ)義錯(cuò)誤。 1靜態(tài)語(yǔ)義錯(cuò)誤 靜態(tài)語(yǔ)義錯(cuò)誤可能由數(shù)據(jù)結(jié)構(gòu)引起,有運(yùn)算符不
20、合法和運(yùn)算分量類(lèi)型不相容等,例如,對(duì)數(shù)組變量進(jìn)行加法運(yùn)算,又如兩個(gè)實(shí)型變量X和Y進(jìn)行MOD運(yùn)算,該MOD運(yùn)算對(duì)于運(yùn)算分量X和Y是不合法的;如果X為實(shí)型變量,Y為字符型變量,它們要進(jìn)行加法運(yùn)算,那么,對(duì)于Pascal語(yǔ)言,該加法運(yùn)算符的兩個(gè)運(yùn)算分量類(lèi)型是不相容的。這樣一些由數(shù)據(jù)結(jié)構(gòu)引起的靜態(tài)語(yǔ)義錯(cuò)誤可由語(yǔ)義分析查出。12.4.1 語(yǔ)義錯(cuò)誤的種類(lèi) 語(yǔ)義分析程序還進(jìn)行控制流方面的某些靜態(tài)語(yǔ)義檢查,例如,由循環(huán)外控制轉(zhuǎn)移到循環(huán)內(nèi),由轉(zhuǎn)向語(yǔ)句把控制轉(zhuǎn)移到一個(gè)構(gòu)造語(yǔ)句(條件語(yǔ)句與情況語(yǔ)句等)內(nèi),或者轉(zhuǎn)移到分程序內(nèi),等等,發(fā)現(xiàn)控制流的某些靜態(tài)語(yǔ)義錯(cuò)誤。 顯然,靜態(tài)語(yǔ)義錯(cuò)誤是容易準(zhǔn)確地定位和確定錯(cuò)誤性質(zhì)的。
21、2動(dòng)態(tài)語(yǔ)義錯(cuò)誤 動(dòng)態(tài)語(yǔ)義錯(cuò)誤是在運(yùn)行目標(biāo)代碼時(shí)才能發(fā)現(xiàn)的源程序錯(cuò)誤。最常見(jiàn)的動(dòng)態(tài)語(yǔ)義錯(cuò)誤有以下幾類(lèi): (1) 除以零; (2) 下標(biāo)變量的下標(biāo)表達(dá)式的值越界; (3) 存取位置初值或值為NIL的指針變量; (4) 運(yùn)行結(jié)果與預(yù)期的不一致。2動(dòng)態(tài)語(yǔ)義錯(cuò)誤 前三種情況往往導(dǎo)致運(yùn)行非正常終止而得不到任何結(jié)果,然而第四種情況雖然運(yùn)行正常終止,但依然得不到預(yù)期的結(jié)果。 這些錯(cuò)誤的產(chǎn)生源自與算法有關(guān)的邏輯錯(cuò)誤以及程序設(shè)計(jì)錯(cuò)誤。當(dāng)軟件開(kāi)發(fā)的設(shè)計(jì)階段,甚至需求分析階段導(dǎo)致與算法有關(guān)的邏輯錯(cuò)誤時(shí),這時(shí)的錯(cuò)誤往往表現(xiàn)為運(yùn)行結(jié)果與預(yù)期的不一致,錯(cuò)誤的校正必須在設(shè)計(jì)階段或需求分析階段重新考慮數(shù)學(xué)模型和算法,從根本上解
22、決。2動(dòng)態(tài)語(yǔ)義錯(cuò)誤 程序設(shè)計(jì)的錯(cuò)誤會(huì)導(dǎo)致程序不反應(yīng)算法,從而使運(yùn)行結(jié)果與預(yù)期的不一致。程序設(shè)計(jì)的錯(cuò)誤還常導(dǎo)致程序運(yùn)行的夭折。與指針變量有關(guān)的語(yǔ)義錯(cuò)誤由于可能對(duì)地址存儲(chǔ)區(qū)域賦值,甚至可能造成巨大破壞。下面舉例說(shuō)明與指針變量有關(guān)的錯(cuò)誤的產(chǎn)生。 設(shè)有下列Pascal程序片段:P:=q;while P. nextNIL dobeginP:= P. next; P. inf:= end;在While循環(huán)中的兩個(gè)賦值語(yǔ)句可能帶來(lái)致命的錯(cuò)誤。原因在于,如果P的值為NIL,或者并未為P所指向的對(duì)象分配存儲(chǔ)空間,這兩個(gè)語(yǔ)句的賦值都是錯(cuò)誤的。應(yīng)該在這個(gè)程序片段之前對(duì)q置初值NIL,或者通過(guò)語(yǔ)句new(q)為q所指
23、向的對(duì)象分配存儲(chǔ)空間,并且把WHILE循環(huán)的重復(fù)條件 P. nextNIL改寫(xiě)成 (P NIL)AND(P. nextNIL)首先P必須不是空指針才可能對(duì)其值不是NIL的域變量next所指向的對(duì)象賦值。 12.4.2 語(yǔ)義錯(cuò)誤檢查措施 由于語(yǔ)義錯(cuò)誤往往涉及算法,而語(yǔ)義通常又是非形式定義的,因此,對(duì)照語(yǔ)法錯(cuò)誤,語(yǔ)義錯(cuò)誤往往難以采用系統(tǒng)而有效的方法來(lái)發(fā)現(xiàn)和校正。 好在語(yǔ)義分析時(shí)采用語(yǔ)法制導(dǎo)的翻譯,通過(guò)語(yǔ)法制導(dǎo)定義或翻譯方案實(shí)現(xiàn)類(lèi)型一致性檢查和某些控制流靜態(tài)語(yǔ)義檢查等,可以發(fā)現(xiàn)源程序中運(yùn)算符不合法、運(yùn)算分量類(lèi)型不相容以及控制流方面的靜態(tài)語(yǔ)義錯(cuò)誤。12.4.2 語(yǔ)義錯(cuò)誤檢查措施 對(duì)于未給變量置初值而導(dǎo)致的動(dòng)態(tài)語(yǔ)義錯(cuò)誤,可以通過(guò)在語(yǔ)義分析時(shí)查看變量是否被賦初值而避免,因?yàn)榭梢岳么a優(yōu)化時(shí)所討論的“ud”鏈思想,容易查出賦值之前就引用的錯(cuò)誤。 為了發(fā)現(xiàn)其他的動(dòng)態(tài)語(yǔ)義錯(cuò)誤,通常采用以下兩種方式。 靜態(tài)模擬檢查。由人閱讀所寫(xiě)的源程序進(jìn)行靜態(tài)模擬,即給定若干組檢查用輸入數(shù)據(jù),模擬計(jì)算機(jī)執(zhí)行各個(gè)語(yǔ)句,沿著所模擬的執(zhí)行路徑,進(jìn)行變量追蹤,也就是記錄下各個(gè)變量值的變化,最終檢查結(jié)果
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 酒行經(jīng)營(yíng)合作協(xié)議
- 山東山東農(nóng)業(yè)工程學(xué)院招聘筆試真題2024
- 河南省豫地科技集團(tuán)有限公司招聘筆試真題2024
- 石大學(xué)前兒童保育學(xué)課件3-2小兒常見(jiàn)病
- 企業(yè)民主管理制度建設(shè)的主要挑戰(zhàn)與瓶頸
- 分?jǐn)?shù)教學(xué)設(shè)計(jì)-游麗穎
- 產(chǎn)教融合對(duì)地方經(jīng)濟(jì)發(fā)展的推動(dòng)作用
- 2025至2030年中國(guó)玻璃馬克杯行業(yè)投資前景及策略咨詢(xún)報(bào)告
- 2025至2030年中國(guó)燃油管總成行業(yè)投資前景及策略咨詢(xún)報(bào)告
- 學(xué)前教育論文答辯三分鐘陳述
- 信義光伏產(chǎn)業(yè)(安徽)控股有限公司七期江北光伏組件蓋板項(xiàng)目(A 段)環(huán)境影響報(bào)告表
- 2022年省南平市高校畢業(yè)生服務(wù)社區(qū)計(jì)劃招募考試真題
- 注塑模具結(jié)構(gòu)最清晰原創(chuàng)圖文含動(dòng)畫(huà)
- 礦用設(shè)備詳細(xì)講解課件-ZYJ-M6型壓風(fēng)供水自救裝置
- The Three Goats(課件)譯林黑布林分級(jí)繪本
- GB/T 12241-2021安全閥一般要求
- 《職業(yè)病危害因素分類(lèi)目錄》(國(guó)衛(wèi)疾控發(fā)〔2015〕92號(hào))
- 特種作業(yè)人員臺(tái)賬及個(gè)人檔案表
- 蘇州歷年英語(yǔ)中考作文回顧
- 航空母艦課件
- 幼兒園復(fù)讀申請(qǐng)書(shū)模板
評(píng)論
0/150
提交評(píng)論