Я построил свой лексер и анализатор в ANTLR, и они работают очень хорошо в том смысле, что когда пользовательский код не может проанализировать, он выводит полезные сообщения об ошибках в STDERR, показывая точную строку no. и т.д.
Проблема в том, что мне нужно извлечь эту информацию для отображения сообщений об ошибках в моем редакторе Eclipse в правильных положениях, но, похоже, они недоступны нигде, кроме как в STDERR. Я в основном ищу какой-то myParser.getErrorMessages ().
Кто-нибудь сталкивался с решением этой проблемы?
Я нашел ссылку ниже, но это работает только в том случае, если пользовательский код частично анализируется (т.е. мы все еще получаем AST). Когда он полностью терпит неудачу, вы не получаете дерево обратно.
http://tech.puredanger.com/2007/02/01/recovering-line-and-column-numbers-in-your-antlr-ast/
Я также нашел этот точный вопрос в официальном FAQ ANTLR ... но я действительно не понимаю его решения. Кто-нибудь может перевести это для меня? Я не использую ни один из классов, на которые он ссылается, и он говорит о v4 (который еще не выпущен).
http://www.antlr.org/wiki/display/ANTLR3/Pattern+for+returning+errors+from+ANTLR+in+data+structures%2C+not+STDERR
Мой код выглядит следующим образом:
FileInputStream fis = new FileInputStream("UserCode.txt");
ANTLRInputStream input = new ANTLRInputStream(fis);
MyLexer lexer = new MyLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
MyParser parser = new MyParser(tokens);
CommonTree tree = (CommonTree)parser.flow().getTree();
MyAST ast = new MyAST(tree);