第6章 符號(hào)表管理和錯(cuò)誤處理_第1頁
第6章 符號(hào)表管理和錯(cuò)誤處理_第2頁
第6章 符號(hào)表管理和錯(cuò)誤處理_第3頁
第6章 符號(hào)表管理和錯(cuò)誤處理_第4頁
第6章 符號(hào)表管理和錯(cuò)誤處理_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

S.PO.P語義分析、生成中間代碼生成目標(biāo)程序代碼優(yōu)化語法分析程序詞法分析程序錯(cuò)誤處理符號(hào)表管理第6章符號(hào)表管理和錯(cuò)誤處理明確符號(hào)表的作用、內(nèi)容、組織明確錯(cuò)誤處理的兩種方法:錯(cuò)誤校正和局部化處理教學(xué)目標(biāo)6.1符號(hào)表管理6.2錯(cuò)誤處理6.3PL/0編譯程序的錯(cuò)誤處理教學(xué)內(nèi)容編譯程序中使用最多的數(shù)據(jù)結(jié)構(gòu)是表源程序中的各種信息,以便查詢或修改,在這些表中,尤以符號(hào)表最為重要生存期最長使用最為頻繁6.1符號(hào)表管理6.1.1符號(hào)表的作用和內(nèi)容作用:(1)收集符號(hào)的各種信息(2)語義檢查的依據(jù)(3)目標(biāo)代碼生成階段地址分配的依據(jù)內(nèi)容:名字欄+信息欄6.1.2符號(hào)表的組織操作:(1)向表中填入一個(gè)新標(biāo)識(shí)符。(2)對(duì)于給定一個(gè)標(biāo)識(shí)符:①查找是否在表中;②訪問它在表中的相關(guān)信息;③在表中填寫或更新它的某些信息。(3)更新或刪除一個(gè)或一組無用的項(xiàng)。6.1.2符號(hào)表的組織符號(hào)表的總體組織:(1)多張(2)一張(3)前兩種的折中符號(hào)表項(xiàng)的組織:(1)線性組織(2)排序組織(3)散列組織:效率高,為多數(shù)編譯程序采用Hash表的基本思想是:為符號(hào)表設(shè)置一個(gè)足夠大的空間M為符號(hào)構(gòu)造一個(gè)散列函數(shù)Hash(Ki),使得0≤Hash(Ki)≤M-1,i=1,2,…,n這樣查找Ki時(shí),Hash(Ki)就決定了Ki在符號(hào)表中的位置構(gòu)造Hash函數(shù)的方法:將標(biāo)識(shí)符中的每個(gè)字符轉(zhuǎn)換為一個(gè)非負(fù)整數(shù)將得到的各個(gè)整數(shù)組合成一個(gè)整數(shù)(可以將第一個(gè)、中間的和最后一個(gè)字符值加在一起,也可以將所有字符的值加起來)將結(jié)果數(shù)調(diào)整到0~M-1范圍內(nèi),可以利用取模的方法,Ki%M(M為素?cái)?shù))解決地址沖突的方法:由于用戶定義標(biāo)識(shí)符的隨機(jī)性,Hash函數(shù)值在0~M-1范圍內(nèi)不一定唯一若兩個(gè)標(biāo)識(shí)符具有相同的函數(shù)值,則可用開放地址法或鏈地址法解決沖突,有關(guān)內(nèi)容可以參考《數(shù)據(jù)結(jié)構(gòu)》的教材。詞法錯(cuò)誤語法錯(cuò)誤語義錯(cuò)誤違反了語言的環(huán)境限制數(shù)組維數(shù)太大循環(huán)嵌套層數(shù)太多6.2錯(cuò)誤處理詞法錯(cuò)誤、語法錯(cuò)誤和語義錯(cuò)誤詞法錯(cuò)誤:不合法單詞例:mian(){

int3sum;

…語法錯(cuò)誤:源程序在語法上不符合文法例:A[x,y=B+*C超越系統(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ū)溢出。語義規(guī)則標(biāo)識(shí)符先說明后引用標(biāo)識(shí)符引用要符合作用域規(guī)定過程調(diào)用時(shí)實(shí)參與形參類型一致參與運(yùn)算的操作數(shù)類型一致下標(biāo)變量的下標(biāo)不能越界語義錯(cuò)誤主要包括:程序不符合語義規(guī)則或

超越具體計(jì)算機(jī)系統(tǒng)的限制錯(cuò)誤處理方法有兩種:錯(cuò)誤校正法:根據(jù)文法進(jìn)行錯(cuò)誤改正錯(cuò)誤局部化法:把錯(cuò)誤的影響限制在一個(gè)局部的范圍,避免錯(cuò)誤擴(kuò)散和影響程序其他部分的分析錯(cuò)誤局部化法詞法分析:發(fā)現(xiàn)不合法字符,顯示錯(cuò)誤,并跳過該標(biāo)識(shí)符(單詞)繼續(xù)往下分析。語法語義分析:跳過所在的語法成分(短語或語句),一般是跳到語句右界符,然后從新語句繼續(xù)往下分析。錯(cuò)誤局部化處理的實(shí)現(xiàn)(遞歸下降分析法)err:全局變量,存放錯(cuò)誤信息。用遞歸下降分析時(shí),如果發(fā)現(xiàn)錯(cuò)誤,便將有關(guān)錯(cuò)誤信息(字符串或者編號(hào))送err,然后轉(zhuǎn)錯(cuò)誤處理程序;出錯(cuò)程序先打印或顯示出錯(cuò)位置以及出錯(cuò)信息,然后跳出一段源程序,直到跳到語句的右界符或正在分析的語法成分的合法后繼符號(hào)為止,然后再往下分析。if_statement(){getsym();/*讀下個(gè)單詞符號(hào)*/C();/*表達(dá)式處理程序*/ifnotsym=“then”{err:=“缺then”;

error();/*出錯(cuò)處理程序*/}else{getsym();statement();}ifsym=“else”{getsym();statement();}}if<C>then<statement>[else<statement>];error(){printf(linecnt,err);do

getsym();while(sym!=“;”orsym!=“end”)}發(fā)現(xiàn)錯(cuò)誤立即跳到語句結(jié)尾處(語句右界符

;或end),這樣處理較粗糙,將跳過太多(3)提高錯(cuò)誤局部化程度的方法設(shè)S1:

合法后繼符號(hào)集(某語法成分的后繼符號(hào))S2:

停止符號(hào)集(跳讀必須停止的符號(hào)集)error(S1,S2){printf(linecnt,err);dogetsym();while(symnotinS1ornotinS2)}若<C>有錯(cuò),則可跳到then若statement有錯(cuò),則可跳到elseif<C>then<statement>[else<statement>];6.3

PL/0編譯程序的錯(cuò)誤處理錯(cuò)誤局部化處理遵循以下兩條原則。(1)鎮(zhèn)定原則(2)關(guān)鍵字原則在進(jìn)入某個(gè)語法單位時(shí),調(diào)用test檢查當(dāng)前符號(hào)是否屬于該語法單位的首符號(hào)集。若不屬于,則濾去首符號(hào)和后繼符號(hào)集合外的所有符號(hào)。在語法單位分析結(jié)束時(shí),調(diào)用test,檢查當(dāng)前符號(hào)是否屬于調(diào)用該語法單位時(shí)應(yīng)有的后繼符號(hào)集合。若不屬于,則濾去后繼符號(hào)和首符號(hào)集合外的所有符號(hào)。test過程有三個(gè)參數(shù):s1、s2、nS1:可允許的下一個(gè)符號(hào)集合,如果當(dāng)前符號(hào)不在此集合中,當(dāng)即得到一個(gè)錯(cuò)誤號(hào);S2:另加的停止符號(hào)集合,在某上出錯(cuò)狀態(tài)下,可恢復(fù)語法分析繼續(xù)正常工作的補(bǔ)充單詞符號(hào)集合;整數(shù)n,表示有關(guān)錯(cuò)誤的診斷號(hào)。在進(jìn)入某個(gè)語法單位時(shí),調(diào)用TEST濾去開始符號(hào)前的所有符號(hào)。在語法單位分析結(jié)束時(shí),調(diào)用TEST濾去當(dāng)前符號(hào)到后繼符號(hào)之間的所有符號(hào)。╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳TESTTEST開始符號(hào)集合與后繼符號(hào)集合TEST測試過程流程圖voidfactor(fsys)structnode*fsys;{voidexpression();intm=0,n=0,i;char*tempset[]={"rpsren",NULL};structnode*temp;temp=(structnode*)malloc(sizeof(structnode));while(tempset[m]!=NULL)temp->pa[n++]=tempset[m++];temp->pa[n]=NULL;

test(facbegsys,fsys,24);/*24:表達(dá)式的開始符不能是此符號(hào)*/

while(in(sym,facbegsys)==1){if(strcmp(sym,"ident")==0){i=position(id);if(i==0)error(11);elseswitch(table[i].kind){

因子的處理過程

caseconstant:gen(lit,0,table[i].val);break;casevariable:gen(lod,lev-table[i].level,table[i].adr);break;caseprocedur:error(21);break; }getsym();}elseif(strcmp(sym,"number")==0){if(num>AMAX){error(31);num=0;}gen(lit,0,num);getsym();}elseif(strcmp(sym,"lparen")==0){getsym();expression(add(temp,fsys));if(strcmp(sym,"rparen")==0)getsym();

溫馨提示

  • 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)論