我正在做一個專案,需要決議各種語法上無效的程式,這些程式是通過將連續的標記串列隨機插入種子程式或從中洗掉一些標記來生成的。我想將這些無效程式決議為不完整的決議樹。以下面的代碼片段為例:
{
printf("hello");
int
}
int之后沒有識別符號。
我可以強制 Antlr 將其決議為部分正確的樹嗎?
- code snippet
- LeftBrace {
- ExpressionStatement printf("hello");
- unknown node int
- RightBrace }
另一個例子:
{
printf("hello");
}(
有一個多余的 ( 在宣告之后。這是我想要的:
- code snippet
- LeftBrace {
- ExpressionStatement printf("hello");
- RightBrace }
- unknown node (
uj5u.com熱心網友回復:
根據您想要識別“壞”輸入的程度,ANTLR 默認執行此操作。
ANTLR 的功能之一是它的錯誤恢復程序,它只會執行這種令牌插入和令牌忽略以嘗試決議您的輸入。該DefaultErrorStrategy會忽視或在努力恢復決議插入單個記號。如果這不起作用,它將消耗令牌(忽略它們),直到找到有效的“下一個令牌”并繼續處理。應該清楚的是,輸入與有效輸入的偏差越嚴重,我們對錯誤恢復的期望就越小。
當然,它會在輸入的那些點識別錯誤,但我假設您希望保留該行為。當然,您可以放置??自己的 ErrorHandler 并覆寫該行為。
您還可以提供自己的ANTLRErrorStrategy實作。(可能會擴展已經非常好的并且是 ANTLR 開發中備受關注的焦點的 DefaultErrorStrategy。)
The Definitive ANTLR 4 Reference中對錯誤恢復進行了廣泛的介紹。如果您打算對 ANLTR 進行更深入的研究(正如您的問題所暗示的那樣),我建議這本書幾乎是“強制性閱讀”
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/378394.html
上一篇:從React組件匯出/匯入常量
