資源描述:
《編譯-錯(cuò)誤處理》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、詞法錯(cuò)誤語法錯(cuò)誤語義錯(cuò)誤違反了語言的環(huán)境限制數(shù)組維數(shù)太大循環(huán)嵌套層數(shù)太多錯(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ò)誤處理方法有兩種
2、:錯(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ò)信息,然后跳出一段源程序,直到跳到語句的右界符或正在分析的語法成分的合法
3、后繼符號(hào)為止,然后再往下分析。if_statement(){getsym();/*讀下個(gè)單詞符號(hào)*/C();/*表達(dá)式處理程序*/ifnotsym=“then”{err:=“缺then”;error();/*出錯(cuò)處理程序*/}else{getsym();statement();}ifsym=“else”{getsym();statement();}}ifthen[else];error(){printf(linecnt,err);dogetsym();while(sym!=“;”orsym!=“end”)}發(fā)現(xiàn)錯(cuò)誤立
4、即跳到語句結(jié)尾處(語句右界符;或end),這樣處理較粗糙,將跳過太多;上例中,缺then,就將跳過整個(gè)條件語句,使得then后的語句都被跳過而不分析,其中有錯(cuò)誤就發(fā)現(xiàn)不了(3)提高錯(cuò)誤局部化程度的方法若有錯(cuò),則可跳到then若statement有錯(cuò),則可跳到elseifthen[else];6.3PL/0編譯程序的錯(cuò)誤處理對(duì)于一些易于校正的錯(cuò)誤,如丟了逗號(hào)、分號(hào)等,則指出出錯(cuò)位置,并加以校正。校正的方式就是補(bǔ)上逗號(hào)或分號(hào)。對(duì)某些錯(cuò)誤編譯程序難于確定校正的措施,為了使當(dāng)前的錯(cuò)誤不致影響整個(gè)程序的崩潰,把錯(cuò)誤盡量局
5、限在一個(gè)局部的語法單位中這樣就需跳過一些后面輸入的單詞符號(hào),直到讀入一個(gè)能使編譯程序恢復(fù)正常語法分析工作的單詞為止。通常在它的入口和出口處,調(diào)用一個(gè)測(cè)試程序TEST。當(dāng)語法分析進(jìn)入這樣的語法單元前,可用測(cè)試程序檢查當(dāng)前單詞符號(hào)是否屬于它們開始符號(hào)的集合,若不是則出錯(cuò)。在語法單位分析結(jié)束時(shí),調(diào)用test,檢查當(dāng)前符號(hào)是否屬于調(diào)用該語法單位時(shí)應(yīng)有的后繼符號(hào)集合。若當(dāng)前單詞符號(hào)是屬于所給集合,則語法分析正常進(jìn)行,否則出錯(cuò)。開始符號(hào)集合symset=setofsymbol;declbegsys,statbegsys,facbegsys:symset;開始符號(hào)集合(*主程序*
6、)declbegsys:=[constsym,varsym,procsym];statbegsys:=[beginsym,callsym,ifsym,whilesym,readsym,writesym];facbegsys:=[ident,number,lparen];后繼符號(hào)集合fsys作為參數(shù):proceduretest(s1,s2:symset;n:integer);procedureblock(lev,tx:integer;fsys:symset);procedurestatement(fsys:symset);procedureexpression(fsy
7、s:symset);procedureterm(fsys:symset);procedurefactor(fsys:symset);在進(jìn)入某個(gè)語法單位時(shí)或在語法單位分析結(jié)束時(shí),調(diào)用TEST,檢查當(dāng)前單詞是否屬于該語法單元的開始符號(hào)或后跟符號(hào)集合。╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳TESTTEST開始符號(hào)集合與后繼符號(hào)集合TEST測(cè)試過程流程圖因子的處理過程例:因子的處理過程procedurefactor(fsys:symset);vari:integer;begin入口:test(facbegsys,fsys,24);whilesyminfacbegsysd