2012-03-10 29 views
0

即使在檢測到錯誤之後,javacc中是否還有解析輸入文件的方法?我知道有幾種方式,例如恐慌模式恢復,短語級別恢復等等。但我不知道如何在javacc jjt文件中實現它。 舉一個例子假設我輸入文件在Javacc中恢復多個錯誤

Line 1: int i 
Line 2: int x; 
Line 3: int k 

所以我要在1號線檢測缺少分號的錯誤後,進行分析並找到第3行的錯誤太多的東西。

回答

0

我以恐慌模式錯誤恢復的方式找到答案,但它也有一些錯誤。我所做的是編輯我的語法,以便在輸入文件的一行中遇到缺少的字符(在上述情況下,分號)解析器繼續執行,直至找到相似的字符。這些相似的字符稱爲同步令牌。

請看下面的例子。 首先我用我的語法替換了所有的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); 

所以在上面的例子中,它返回到變量聲明規則(因爲它是所謂的分號()方法中的一個。)但是我們之後新發現查找找到第一個分號後分號是函數調用,而不是變量聲明。

任何人都可以請建議一種方法來解決這個問題。