資源描述:
《編譯-錯誤處理》由會員上傳分享,免費在線閱讀,更多相關內容在行業(yè)資料-天天文庫。
1、詞法錯誤語法錯誤語義錯誤違反了語言的環(huán)境限制數組維數太大循環(huán)嵌套層數太多錯誤處理詞法錯誤、語法錯誤和語義錯誤詞法錯誤:不合法單詞例:mian(){int3sum;…語法錯誤:源程序在語法上不符合文法例:A[x,y=B+*C超越系統(tǒng)限制:(計算機系統(tǒng)和編譯系統(tǒng))1.數據溢出錯誤,常數太大,計算結果溢出。2.符號表、靜態(tài)存儲分配數據區(qū)溢出。3.動態(tài)存儲分配數據區(qū)溢出。語義規(guī)則標識符先說明后引用標識符引用要符合作用域規(guī)定過程調用時實參與形參類型一致參與運算的操作數類型一致下標變量的下標不能越界語義錯誤主要包括:程序不符合語義規(guī)則或超越具體計算機系統(tǒng)的限制錯誤處理方法有兩種
2、:錯誤校正法:根據文法進行錯誤改正錯誤局部化法:把錯誤的影響限制在一個局部的范圍,避免錯誤擴散和影響程序其他部分的分析錯誤局部化法詞法分析:發(fā)現不合法字符,顯示錯誤,并跳過該標識符(單詞)繼續(xù)往下分析。語法語義分析:跳過所在的語法成分(短語或語句),一般是跳到語句右界符,然后從新語句繼續(xù)往下分析。錯誤局部化處理的實現(遞歸下降分析法)err:全局變量,存放錯誤信息。用遞歸下降分析時,如果發(fā)現錯誤,便將有關錯誤信息(字符串或者編號)送err,然后轉錯誤處理程序;出錯程序先打印或顯示出錯位置以及出錯信息,然后跳出一段源程序,直到跳到語句的右界符或正在分析的語法成分的合法
3、后繼符號為止,然后再往下分析。if_statement(){getsym();/*讀下個單詞符號*/C();/*表達式處理程序*/ifnotsym=“then”{err:=“缺then”;error();/*出錯處理程序*/}else{getsym();statement();}ifsym=“else”{getsym();statement();}}ifthen[else];error(){printf(linecnt,err);dogetsym();while(sym!=“;”orsym!=“end”)}發(fā)現錯誤立
4、即跳到語句結尾處(語句右界符;或end),這樣處理較粗糙,將跳過太多;上例中,缺then,就將跳過整個條件語句,使得then后的語句都被跳過而不分析,其中有錯誤就發(fā)現不了(3)提高錯誤局部化程度的方法若有錯,則可跳到then若statement有錯,則可跳到elseifthen[else];6.3PL/0編譯程序的錯誤處理對于一些易于校正的錯誤,如丟了逗號、分號等,則指出出錯位置,并加以校正。校正的方式就是補上逗號或分號。對某些錯誤編譯程序難于確定校正的措施,為了使當前的錯誤不致影響整個程序的崩潰,把錯誤盡量局
5、限在一個局部的語法單位中這樣就需跳過一些后面輸入的單詞符號,直到讀入一個能使編譯程序恢復正常語法分析工作的單詞為止。通常在它的入口和出口處,調用一個測試程序TEST。當語法分析進入這樣的語法單元前,可用測試程序檢查當前單詞符號是否屬于它們開始符號的集合,若不是則出錯。在語法單位分析結束時,調用test,檢查當前符號是否屬于調用該語法單位時應有的后繼符號集合。若當前單詞符號是屬于所給集合,則語法分析正常進行,否則出錯。開始符號集合symset=setofsymbol;declbegsys,statbegsys,facbegsys:symset;開始符號集合(*主程序*
6、)declbegsys:=[constsym,varsym,procsym];statbegsys:=[beginsym,callsym,ifsym,whilesym,readsym,writesym];facbegsys:=[ident,number,lparen];后繼符號集合fsys作為參數: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);在進入某個語法單位時或在語法單位分析結束時,調用TEST,檢查當前單詞是否屬于該語法單元的開始符號或后跟符號集合。╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳TESTTEST開始符號集合與后繼符號集合TEST測試過程流程圖因子的處理過程例:因子的處理過程procedurefactor(fsys:symset);vari:integer;begin入口:test(facbegsys,fsys,24);whilesyminfacbegsysd