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

Parsing 检测错误语法(错误替代)以快速修复,parsing,antlr,antlr4,Parsing,Antlr,Antlr4,在我的ANTLR语法中,我想检测错误的关键字或错误类型的常量,例如“null”而不是“null”。我在语法中添加了错误选项,例如: | extra='null' #error1 如果在我的自定义编辑器中检测到错误的常量,我可以用正确的常量替换它来修复它 但我不知道这是否是解决和检测语法中错误关键字或常量的正确方法 此外,我还尝试检测语法中缺少的结束语,参见ANTLR书籍第9.4章: ....... | 'if' '(' expr expr #error2 | '{' exprl

在我的ANTLR语法中,我想检测错误的关键字或错误类型的常量,例如“null”而不是“null”。我在语法中添加了错误选项,例如:

|   extra='null' #error1
如果在我的自定义编辑器中检测到错误的常量,我可以用正确的常量替换它来修复它

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

此外,我还尝试检测语法中缺少的结束语,参见ANTLR书籍第9.4章:

.......
|   'if' '(' expr  expr #error2
|   '{'  exprlist #error3
|   'while' '(' expr  expr #error4
........
但这大大减慢了解析过程,因此我认为这样做是错误的

我的问题是:

以上述方式检测错误的关键字、常数等是否正确

是否有可能在不大幅降低速度的情况下捕捉到语法中缺少的结尾


非常感谢您的帮助。

我发现我可以从规则中提取第二个标记,在该位置添加括号:

|   'if' '(' expr  expr #error2
与:

但是,它大大降低了解析器的速度

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