版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度商鋪裝修施工監(jiān)理合同范本2篇
- 2024年度水電項(xiàng)目融資與投資承包合同
- 2024年綠色建筑電力安裝與節(jié)能評(píng)估合同3篇
- 2024年度科技創(chuàng)新項(xiàng)目委托印刷方合同模板3篇
- 2024年二零二四年度土地租賃及公共設(shè)施租賃協(xié)議范本3篇
- 2024年商務(wù)培訓(xùn)設(shè)施改造工程政府采購合同5篇
- 2024年智能穿戴設(shè)備研發(fā)與市場推廣合作協(xié)議書下載3篇
- 2024年度國際海員勞務(wù)派遣與培訓(xùn)合作合同3篇
- 2024版二手摩托車交易合同附帶車輛交易合同解除條件及程序2篇
- 2024年度違紀(jì)行為整改與員工申訴處理協(xié)議書3篇
- 食品工程原理課程設(shè)計(jì)
- YYT 0325-2022 一次性使用無菌導(dǎo)尿管
- 羊膜在眼科臨床中應(yīng)用課件
- (71)第十五章15.2.3整數(shù)指數(shù)冪1-負(fù)整數(shù)指數(shù)冪-導(dǎo)學(xué)案
- 初步設(shè)計(jì)方案詢價(jià)表
- 2022年江蘇省環(huán)保集團(tuán)有限公司招聘筆試題庫及答案解析
- 《汽車焊接技術(shù)》試卷期末理論考試含參考答案一套
- FMEA分析經(jīng)典案例【范本模板】
- 2023-2023年山東省學(xué)業(yè)水平考試英語試題及答案
- 《腹部損傷》課件
- 工業(yè)鋁型材受力變形量計(jì)算
評(píng)論
0/150
提交評(píng)論