即使在检测到错误之后,javacc中是否还有一种方法可以进一步解析输入文件。我知道有几种方法,如恐慌模式恢复,短语级别恢复等。但我无法想象如何在javacc jjt文件中实现它。 假设我的输入文件是
Line 1: int i
Line 2: int x;
Line 3: int k
所以我想要的是在检测到第1行丢失分号的错误后,继续解析并在第3行找到错误。
答案 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()方法的那个。)但是我们在新发现的分号后找到的是一个函数调用,而不是变量声明。
任何人都可以建议一种方法来解决这个问题。