資源描述:
《pl0編譯程序的語(yǔ)法錯(cuò)誤處理》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。
1、2021/6/21PL0ERR.DOC2/2PL0編譯程序的語(yǔ)法錯(cuò)誤處理1.基本法則關(guān)鍵字法則:語(yǔ)法結(jié)構(gòu),尤其是每種構(gòu)造語(yǔ)句和說(shuō)明,以關(guān)鍵字開(kāi)頭。鎮(zhèn)定法則:發(fā)現(xiàn)非法結(jié)構(gòu)后,即跳過(guò)后面的輸入正文,直到下一個(gè)可以正確地后隨當(dāng)前正在分析的句子結(jié)構(gòu)的符號(hào)為止。亦即每一分析程序知道在其當(dāng)前活動(dòng)點(diǎn)的后繼符號(hào)的集合。2.處理方法(1)給每個(gè)分析函數(shù)提供一個(gè)參數(shù)FSYS,它指明可能的后繼符號(hào)。在每個(gè)函數(shù)的末尾包括一個(gè)測(cè)試,以保證輸入正文的下一個(gè)符號(hào)真的屬于后繼符號(hào)集(如果有語(yǔ)法錯(cuò)誤的話)。(2)為了盡量減少忽略
2、直到下一個(gè)后繼符號(hào)為止的中間所有正文,在后繼符號(hào)集添加一些關(guān)鍵字,它們專門標(biāo)記那些不容忽略的結(jié)構(gòu)的開(kāi)始符。因此,作為參數(shù)傳遞給分析函數(shù)的就不僅是后繼符號(hào)了,可稱為停止符號(hào)。具體來(lái)說(shuō),先用一些明顯的關(guān)鍵字給它們賦予初值,然后隨著分析子目標(biāo)的層次的深入,逐步補(bǔ)充別的合法符號(hào)。TEST函數(shù)就是用來(lái)完成這些驗(yàn)證工作的,它有三個(gè)參數(shù):①可允許的下一個(gè)符號(hào)的集合S1;若當(dāng)前符號(hào)不屬于此集合,則當(dāng)即得到一個(gè)錯(cuò)誤。②另加的停止符號(hào)集S2,這些符號(hào)的出現(xiàn)雖然是錯(cuò)的,但是它們絕對(duì)不應(yīng)被忽略而跳過(guò)。③整數(shù)N,表示有關(guān)
3、錯(cuò)誤的代碼。voidTEST(SYMSETS1,SYMSETS2,intN){if(!SymIn(S1)){ERROR(N);while(!SymIn(S1+S2))GetSym();}}(3)TEST也可以用作分析函數(shù)的入口,以驗(yàn)證當(dāng)前符號(hào)是否為允許的頭符號(hào)。在下述情況下,這一方法值得推薦。比如規(guī)則A::=a1S1
4、…
5、anSn
6、X的翻譯結(jié)果是if(SYM==a1)S1();else…if(SYM==an)Sn();elseX();此時(shí),分析函數(shù)X是無(wú)條件被調(diào)用的。此時(shí),參數(shù)S1必須為X的頭符
7、號(hào)集合,而S2則選為A的后繼符號(hào)集合FOLLOW(A)。以因子(FACTOR)的語(yǔ)法分析函數(shù)為例,在函數(shù)FACTOR的入口處調(diào)用了一次TEST函數(shù),它的實(shí)參S1是因子開(kāi)始符號(hào)的集合(FACBEGSYS),S2是每個(gè)函數(shù)的形參FSYS調(diào)用時(shí)實(shí)參的傳遞值。當(dāng)編譯程序第一次調(diào)用BLOCK時(shí),F(xiàn)SYS的實(shí)參為:[.]與說(shuō)明開(kāi)始符和語(yǔ)句開(kāi)始符的和集。以后隨著調(diào)用語(yǔ)法分析函數(shù)層次的深入,F(xiàn)SYS的傳遞值逐步增加。例如,調(diào)用STATEMENT時(shí)增加了[;]和[ENDSYM];在表達(dá)式語(yǔ)法分析中調(diào)用TERM時(shí)又
8、增加了[+]和[-],進(jìn)而調(diào)用FACTOR時(shí)又增加了[*]和[/];這樣在進(jìn)入因子分析函數(shù)時(shí),即使當(dāng)前符號(hào)不是因子開(kāi)始符,出錯(cuò)后只要跳過(guò)一定的符號(hào),遇到在FSYS2021/6/21PL0ERR.DOC2/2中或在因子開(kāi)始符號(hào)集合中的單詞符號(hào),均可繼續(xù)正常進(jìn)行語(yǔ)法分析。在FACTOR函數(shù)的出口處也調(diào)用了TEST,不過(guò)這時(shí)的S1和S2的實(shí)參恰恰相反,說(shuō)明當(dāng)時(shí)FSYS集合的單詞符號(hào)都是因子正常出口時(shí)允許的單詞符號(hào),而因子的開(kāi)始符號(hào)為可恢復(fù)正常語(yǔ)法分析的補(bǔ)充單詞符號(hào)。以上處理方案具有這樣的性質(zhì):試圖通過(guò)
9、略過(guò)輸入正文的一個(gè)或多個(gè)符號(hào)來(lái)恢復(fù)分析的正常步驟。在錯(cuò)誤僅為漏掉一個(gè)符號(hào)所引起的所有情況下,它都不是適宜的策略。經(jīng)驗(yàn)表明,這類錯(cuò)誤基本上限于那種僅有語(yǔ)法作用而不代表行動(dòng)的符號(hào)。PL0中的分號(hào)即為一例。把一些關(guān)鍵字添加到后繼符號(hào)集合中去,使得分析程序不再盲目地跳過(guò)后面的符號(hào),好象漏掉的符號(hào)已經(jīng)補(bǔ)上了一樣。從以下分析復(fù)合語(yǔ)句的程序段,可以看出上述思想。它在效果上等于在關(guān)鍵字前面插入了漏掉的分號(hào)。STATBEGSYS是‘語(yǔ)句’的頭符號(hào)集合(FIRST集)。if(sym==BEGINSYM){GetSy
10、m();STATEMENT([SEMICOLON,ENDSYM]+FSYS);while(SYMIN[SEMICOLON]+STATBEGSYS){if(SYM==SEMICOLON)GetSym();elseERROR(10);STATEMENT([SEMICOLON,ENDSYM]+FSYS);}if(SYM==ENDSYM)GetSym();elseERROR(17);}