Error handling Antlr4识别错误后,如何要求应用程序自动修复错误?
我们知道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;
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让你这么做