Error handling Antlr4识别错误后,如何要求应用程序自动修复错误?

Error handling Antlr4识别错误后,如何要求应用程序自动修复错误?,error-handling,antlr4,Error Handling,Antlr4,我们知道Antlr4正在使用同步和返回恢复机制。例如,我有以下简单语法: grammar Hello; r : prefix body ; prefix: 'hello' ':'; body: INT ID ; INT: [0-9]+ ; ID : [a-z]+ ; WS : [ \t\r\n]+ -> skip ; 我使用以下侦听器获取输入: public class HelloLoader extends HelloBaseListener { String input;

我们知道Antlr4正在使用同步和返回恢复机制。例如,我有以下简单语法:

grammar Hello;
r  : prefix body ;
prefix: 'hello' ':';
body: INT ID ;
INT: [0-9]+ ;
ID : [a-z]+ ; 
WS : [ \t\r\n]+ -> skip ;
我使用以下侦听器获取输入:

public class HelloLoader extends HelloBaseListener {
    String input;
    public void exitR(HelloParser.RContext ctx) {
        input = ctx.getText();
    }
}
我的HelloRunner中的主要方法如下所示:

public static void main(String[] args) throws IOException {
    CharStream input = CharStreams.fromStream(System.in);
    HelloLexer lexer = new HelloLexer(input);
    CommonTokenStream tokens = new CommonTokenStream(lexer);
    HelloParser parser = new HelloParser(tokens);
    ParseTree tree = parser.r();
    ParseTreeWalker walker = new ParseTreeWalker();
    HelloLoader loader = new HelloLoader();
    walker.walk(loader, tree);
    System.out.println(loader.input); 
}
现在,如果我输入正确的输入“hello:1 morning”,我将获得预期的
hello:1 morning

如果输入错误“您好;早上1点”怎么办?我将获得以下输出:

line 1:6 token recognition error at: ';'
line 1:8 missing ':' at '1'
hello<missing ':'>1morning
行1:6令牌识别错误位于:';'
第1:8行在“1”处缺少“:”
你好
似乎Antlr4自动识别出一个错误的标记“;”并将其删除;但是,它不会巧妙地在相应的位置添加“:”,而只是声明


我的问题是:有没有办法解决这个问题,这样当Antlr发现错误时,它会自动修复它?如何实现这种编码?我们还需要其他工具吗

解析器的输入通常来自某个源文件,该源文件包含(据推测)符合某种语法的代码或文本。语法错误的典型使用场景是提醒用户,以便可以更正源文件

如注释所示,您可以插入自己的错误恢复系统,但在尝试将单个令牌插入令牌流并恢复之前,请考虑这是一个非常有限的解决方案。为什么?考虑一个更丰富的语法,对于一个给定的令牌来说,许多或几十个或几百个其他令牌<强>可以合法地遵循< <强> >。那么,单一代币替换策略将如何工作


g4示例是一个普通语法的缩影,即ANTLR的“hello world”。但大多数情况下,对于非平凡语法,对于不完美语法,我们能做的最好的事情就是简单地提醒用户,以便纠正语法。

我认为您可以尝试使用自定义错误恢复机制来扩展现有机制。。。我很确定ANTLR让你这么做