0
即使在檢測到錯誤之後,javacc中是否還有解析輸入文件的方法?我知道有幾種方式,例如恐慌模式恢復,短語級別恢復等等。但我不知道如何在javacc jjt文件中實現它。 舉一個例子假設我輸入文件在Javacc中恢復多個錯誤
Line 1: int i
Line 2: int x;
Line 3: int k
所以我要在1號線檢測缺少分號的錯誤後,進行分析並找到第3行的錯誤太多的東西。
即使在檢測到錯誤之後,javacc中是否還有解析輸入文件的方法?我知道有幾種方式,例如恐慌模式恢復,短語級別恢復等等。但我不知道如何在javacc jjt文件中實現它。 舉一個例子假設我輸入文件在Javacc中恢復多個錯誤
Line 1: int i
Line 2: int x;
Line 3: int k
所以我要在1號線檢測缺少分號的錯誤後,進行分析並找到第3行的錯誤太多的東西。
我以恐慌模式錯誤恢復的方式找到答案,但它也有一些錯誤。我所做的是編輯我的語法,以便在輸入文件的一行中遇到缺少的字符(在上述情況下,分號)解析器繼續執行,直至找到相似的字符。這些相似的字符稱爲同步令牌。
請看下面的例子。 首先我用我的語法替換了所有的SEMICOLON標記。
Semicolon()
然後添加這個新的生產規則。
void Semicolon() :
{}
{
try
{
<SEMICOLON>
} catch (ParseException e) {
Token t;
System.out.println(e.toString());
do {
t = getNextToken();
} while (t.kind != SEMICOLON && t!=null && t.kind != EOF);
}
}
一旦我遇到缺少字符解析器搜索類似的字符。當它找到這樣的字符時,它返回到調用它的規則。
示例: - 假設變量聲明中缺少分號。
int a=10 <--- no semicolon
所以解析器搜索一個分號。在某一點它找到了一個分號。
___(some code)__; method(param1);
所以在上面的例子中,它返回到變量聲明規則(因爲它是所謂的分號()方法中的一個。)但是我們之後新發現查找找到第一個分號後分號是函數調用,而不是變量聲明。
任何人都可以請建議一種方法來解決這個問題。