語(yǔ)法分析器是編譯器前端的核心
語(yǔ)法分析器的兩項(xiàng)主要任務(wù)泞歉,分別:
- 是根據(jù)詞法分析器提供的記號(hào)流逼侦,為語(yǔ)法正確的輸入構(gòu)造分析樹(shù)(或語(yǔ)法樹(shù));
- 檢查輸入中的語(yǔ)法 / 詞法錯(cuò)誤腰耙,并調(diào)用出錯(cuò)處理程序進(jìn)行相應(yīng)的處理偿洁。
語(yǔ)法錯(cuò)誤的處理
源程序中的錯(cuò)誤可以分為詞法/語(yǔ)法錯(cuò)誤、語(yǔ)義錯(cuò)誤兩類沟优。前者主要形式是命名不合法涕滋、關(guān)鍵字書(shū)寫(xiě)錯(cuò)誤、語(yǔ)法結(jié)構(gòu)有問(wèn)題(比如缺分號(hào)挠阁、該配對(duì)的東西不配對(duì))等宾肺;后者則可分為靜態(tài)/動(dòng)態(tài)兩種,靜態(tài)例如類型使用錯(cuò)誤侵俗、參數(shù)使用錯(cuò)誤等锨用,動(dòng)態(tài)語(yǔ)義錯(cuò)誤則是無(wú)窮遞歸這類邏輯性的問(wèn)題。
語(yǔ)法錯(cuò)誤的處理目標(biāo)
- 不多不漏地報(bào)告所有錯(cuò)誤出現(xiàn)的準(zhǔn)確位置隘谣;
- 發(fā)現(xiàn)一個(gè)錯(cuò)誤后能夠繼續(xù)分析增拥,做到一次分析完整個(gè)程序啄巧,再一次性指出所有錯(cuò)誤;
- 盡量小地降低分析速度(分析速度和掃描遍數(shù)有關(guān))掌栅。
語(yǔ)法錯(cuò)誤的基本恢復(fù)策略
- 緊急恢復(fù):拋棄掉一些輸入秩仆,直到遇到同步記號(hào);
- 短語(yǔ)級(jí)恢復(fù):對(duì)錯(cuò)誤進(jìn)行串替換猾封,糾正錯(cuò)誤澄耍;
- 出錯(cuò)產(chǎn)生式:用出錯(cuò)產(chǎn)生式捕捉(預(yù)測(cè))錯(cuò)誤;
- 全局糾正:找到和錯(cuò)誤輸入序列 x 最相近的序列 y晌缘,然后用 y 替換掉 x 齐莲。
例如:
x = a+b
y = c+d;
緊急恢復(fù):x = a+b+d; // 丟棄掉 b 后的記號(hào),直到遇到 +
短語(yǔ)級(jí)恢復(fù): x = a+b; // 加入分號(hào)
在寫(xiě)程序時(shí)磷箕,要養(yǎng)成減少錯(cuò)誤的好習(xí)慣:每次用變量选酗、參數(shù)時(shí),要在使用之前進(jìn)行初始化岳枷,并在直接使用之前檢查一下是否出現(xiàn)值為空等問(wèn)題星掰,防止出現(xiàn)不可預(yù)知的錯(cuò)誤