javacc 中是否有办法在检测到错误后进一步解析输入文件。我知道有几种方法,例如恐慌模式恢复,短语级别恢复等。但我不知道如何在 javacc jjt 文件中实现它。例如假设我的输入文件是
Line 1: int i
Line 2: int x;
Line 3: int k
所以我想要的是在第 1 行检测到缺少分号的错误后,继续解析并在第 3 行找到错误。
javacc 中是否有办法在检测到错误后进一步解析输入文件。我知道有几种方法,例如恐慌模式恢复,短语级别恢复等。但我不知道如何在 javacc jjt 文件中实现它。例如假设我的输入文件是
Line 1: int i
Line 2: int x;
Line 3: int k
所以我想要的是在第 1 行检测到缺少分号的错误后,继续解析并在第 3 行找到错误。
我以恐慌模式错误恢复的方式找到了答案,但它也有一些错误。我所做的是编辑我的语法,以便一旦我在输入文件的一行中遇到丢失的字符(在上述情况下为分号)解析器继续进行,直到找到类似的字符。那些相似的字符被称为同步令牌。
请参见下面的示例。首先,我用这个替换了语法中的所有分号标记。
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);
所以在上面的例子中找到第一个分号后,它返回到变量声明规则(因为它是调用分号()方法的那个。)但是我们在新找到的分号之后发现的是一个函数调用,而不是一个变量声明.
任何人都可以提出解决这个问题的方法。