0

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

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

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

4

1 回答 1

0

我以恐慌模式错误恢复的方式找到了答案,但它也有一些错误。我所做的是编辑我的语法,以便一旦我在输入文件的一行中遇到丢失的字符(在上述情况下为分号)解析器继续进行,直到找到类似的字符。那些相似的字符被称为同步令牌。

请参见下面的示例。首先,我用这个替换了语法中的所有分号标记。

    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);

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

任何人都可以提出解决这个问题的方法。

于 2012-03-10T17:53:26.457 回答