【问题标题】:Handling errors in ANTLR4 JavaScript处理 ANTLR4 JavaScript 中的错误
【发布时间】:2015-05-16 13:07:13
【问题描述】:

我正在使用 ANTLR4 JavaScript 为自定义语言创建一种网络 IDE。

这一切都很好,除了错误被记录到控制台而且我想不出一种方法将这些错误重定向到我可以将它们呈现给用户的地方。

目前,它们在 JS 控制台上显示如下:

谁能指出我正确的方向(我需要编辑哪个文件等)?

【问题讨论】:

  • 不能直接与 Javascript 实现对话,但对于 Java 有 Parser.removeErrorListeners(),它删除了默认的 ConsoleErrorListener 和 Parser.addErrorListener(....),添加回您自己的自定义错误监听器。在创建解析器之后运行它之前执行此操作。
  • @GRosenberg 谢谢,这帮助我弄清楚了!您可以将其发布为答案以便我接受吗?

标签: javascript error-handling antlr4


【解决方案1】:

无法直接与 Javascript 实现对话,但对于 Java,有:

Parser.removeErrorListeners() // 移除默认的 ConsoleErrorListener Parser.addErrorListener(....) // 添加自定义错误监听器

在创建解析器之后运行它之前执行此操作。

【讨论】:

    【解决方案2】:

    您可以通过实现antlr4.error.ErrorListener 接口并提供其中一种接口方法(例如syntaxError)来在每个错误时调用。

    class ExprErrorListener extends antlr4.error.ErrorListener {
      syntaxError(recognizer, offendingSymbol, line, column, msg, err) {
        ...
      }
    }
    

    禁用默认错误侦听器并启用自定义侦听器:

    parser.removeErrorListeners();
    parser.addErrorListener(new ExprErrorListener());
    

    请注意,您可以跳过该类并使用可用的syntaxError 函数传入一个对象。这是Expr.g4 语法的最小完整示例:

    const antlr4 = require("antlr4");
    const {ExprLexer} = require("./parser/ExprLexer");
    const {ExprParser} = require("./parser/ExprParser");
    
    const expression = "2 + 8 * 9 - \n";
    const input = new antlr4.InputStream(expression);
    const lexer = new ExprLexer(input);
    const tokens = new antlr4.CommonTokenStream(lexer);
    
    const parser = new ExprParser(tokens);
    parser.buildParseTrees = true;
    parser.removeErrorListeners();
    parser.addErrorListener({
      syntaxError: (recognizer, offendingSymbol, line, column, msg, err) => {
        console.error(`${offendingSymbol} line ${line}, col ${column}: ${msg}`);
      }
    });
    
    const tree = parser.prog();
    

    给予:

    [@6,12:12='\n',<10>,1:12] line 1, col 12: mismatched input '\n' expecting {'(', ID, INT}
    

    另见error handlers

    【讨论】:

    • 什么是@6?这对用户有什么用处?
    • @MikeB 我不确定 - 这可能与语法有关,但就这个答案而言,它无关紧要。我只是将 Antlr 传递给回调的任何内容转储以表明它有效。您可以使用这些信息做任何您需要的事情。
    猜你喜欢
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 2016-07-16
    • 1970-01-01
    • 2013-07-21
    相关资源
    最近更新 更多