处理 ANTLR4 中的错误 JavaScript

Handling errors in ANTLR4 JavaScript

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

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

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

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

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

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

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

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

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

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

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

请注意,您可以跳过 class 并传入一个具有 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