在Javacc中恢复多个错误

时间:2012-03-10 09:29:24

标签: javacc

即使在检测到错误之后,javacc中是否还有一种方法可以进一步解析输入文件。我知道有几种方法,如恐慌模式恢复,短语级别恢复等。但我无法想象如何在javacc jjt文件中实现它。 假设我的输入文件是

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

所以我想要的是在检测到第1行丢失分号的错误后,继续解析并在第3行找到错误。

1 个答案:

答案 0 :(得分: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);

所以在上面的例子中找到第一个分号后,它返回到变量声明规则(因为它是调用semicolon()方法的那个。)但是我们在新发现的分号后找到的是一个函数调用,而不是变量声明。

任何人都可以建议一种方法来解决这个问题。