检测错误的语法(错误替代)以便快速修复

时间:2014-09-25 08:09:22

标签: parsing antlr antlr4

在我的ANTLR语法中,我想检测错误的关键字或错误的类型常量,例如'空'而不是' NULL'我在语法中添加了错误替代,例如:

|   extra='null' #error1

如果在我的自定义编辑器中检测到错误的常量,我可以通过用正确的常量替换它来修复它。

但我不知道这是否是解决和检测语法中错误关键字或常量的正确方法。

此外,我试图检测语法中缺少的结束(参见ANTLR第9.4章):

.......
|   'if' '(' expr  expr #error2
|   '{'  exprlist #error3
|   'while' '(' expr  expr #error4
........

但这大大减慢了解析过程,因此我认为这样做是错误的。

我的问题是:

如上所述以这种方式检测错误的关键字,常量等是否正确?

在没有大幅减速的情况下,是否有可能在语法中捕捉到缺失的结束?

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我发现我可以从规则中提取第二个令牌(在该位置添加大括号):

|   'if' '(' expr  expr #error2

使用:

Token myToken = tokens.get(ctx.getChild(2).getSourceInterval().b);
parser.notifyErrorListeners(........

然而,它大大降低了解析器的速度。