您可以通过实现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。