Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Handling errors in ANTLR4 JavaScript

I am using ANTLR4 JavaScript to create a sort of a web IDE for a custom language.

It all works great, apart from the fact that errors are logged to the console and I can't figure out a way to redirect those errors somewhere I can present them to the users.

At the moment, they are shown on the JS console like this:

JS Console

Could anyone point me on the right direction (which file I need to edit, etc)?

like image 486
EduAlm Avatar asked May 16 '15 13:05

EduAlm


2 Answers

Cannot speak directly to the Javascript implementation, but for Java there are:

Parser.removeErrorListeners() // removes the default ConsoleErrorListener Parser.addErrorListener(....) // add back a custom error listener

Do this after creating the Parser and before running it.

like image 173
GRosenberg Avatar answered Oct 11 '22 15:10

GRosenberg


You can do this by implementing the antlr4.error.ErrorListener interface and providing one of the interface methods such as syntaxError to be invoked upon each error.

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

Disable the default error listener and enable the custom listener with:

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

Note that you can skip the class and pass in an object with the syntaxError function available. Here's a minimal, complete example on the Expr.g4 grammar:

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();

Gives:

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

See also error handlers.

like image 43
ggorlen Avatar answered Oct 11 '22 16:10

ggorlen