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

下載本文檔

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

文檔簡介

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

int3sum;

…語法錯誤:源程序在語法上不符合文法例:A[x,y=B+*C超越系統(tǒng)限制:(計算機系統(tǒng)和編譯系統(tǒng))1.數(shù)據(jù)溢出錯誤,常數(shù)太大,計算結(jié)果溢出。2.符號表、靜態(tài)存儲分配數(shù)據(jù)區(qū)溢出。3.動態(tài)存儲分配數(shù)據(jù)區(qū)溢出。語義規(guī)則標識符先說明后引用標識符引用要符合作用域規(guī)定過程調(diào)用時實參與形參類型一致參與運算的操作數(shù)類型一致下標變量的下標不能越界語義錯誤主要包括:程序不符合語義規(guī)則或

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

error();/*出錯處理程序*/}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)錯誤立即跳到語句結(jié)尾處(語句右界符

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

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

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

PL/0編譯程序的錯誤處理錯誤局部化處理遵循以下兩條原則。(1)鎮(zhèn)定原則(2)關(guān)鍵字原則在進入某個語法單位時,調(diào)用test檢查當前符號是否屬于該語法單位的首符號集。若不屬于,則濾去首符號和后繼符號集合外的所有符號。在語法單位分析結(jié)束時,調(diào)用test,檢查當前符號是否屬于調(diào)用該語法單位時應(yīng)有的后繼符號集合。若不屬于,則濾去后繼符號和首符號集合外的所有符號。test過程有三個參數(shù):s1、s2、nS1:可允許的下一個符號集合,如果當前符號不在此集合中,當即得到一個錯誤號;S2:另加的停止符號集合,在某上出錯狀態(tài)下,可恢復語法分析繼續(xù)正常工作的補充單詞符號集合;整數(shù)n,表示有關(guān)錯誤的診斷號。在進入某個語法單位時,調(diào)用TEST濾去開始符號前的所有符號。在語法單位分析結(jié)束時,調(diào)用TEST濾去當前符號到后繼符號之間的所有符號。╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳TESTTEST開始符號集合與后繼符號集合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:表達式的開始符不能是此符號*/

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等.壓縮文件請下載最新的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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論