Antlr Обработка исключений

Я разработал сложную грамматику, используя Antlr 3, используя дерево AST. ANTLR генерирует Lexer и Parser. Проблема состоит в том, что когда пользователь вводит синтаксис, который, например, недействителен, грамматика ожидает ';', Пользователь не вводит это, тогда в моей Eclipse IDE я получаю следующее исключение:

 line 1:24 mismatched input '' expecting ';'

Как это исключение может быть обработано, потому что я пытаюсь поймать это исключение, но исключение не перехватывается. Это вообще исключение? Я неКажется, я не понимаю, почему это исключение не поймано. Я пытался это выяснить, однако веб-сайт Antlr, похоже, не работает в течение некоторого времени.

Я посмотрел на следующее:Обработка исключений ANTLR с помощью "$5$quot;, Джава и последовал этому примеру, но когда Lexer генерирует код, добавляя RuntimeException (), я получаю недоступный код.

Я не уверен что делать.

Когда я пытаюсь получить количество синтаксических ошибок от парсера, отображается 0.

РЕДАКТИРОВАТЬ:

Я нашел решение, которое работает, посмотрев на:ANTLR не выдает ошибки при неверном вводе

Однако, когда я пытаюсь вернуть сообщение об исключении, оно становится пустым. Я все правильно настроил? Пожалуйста, посмотрите образец грамматики:

grammar i;

options {
output=AST;
}

@header {
package com.data;
}

@rulecatch {
    catch(RecognitionException e) {
        throw e;
   }
}

// by having these below it makes no difference
/**@parser::members {
    @Override
    public void reportError(RecognitionException e) {
        throw new RuntimeException("Exception : " + " " + e.getMessage());
    }
}

@lexer::members {
    @Override
    public void reportError(RecognitionException e) {
       throw new RuntimeException("Exception : " + " " + e.getMessage());
    }
}*/

РЕДАКТИРОВАТЬ:

Пожалуйста, посмотрите, что я имею до сих пор:

grammar i;

options {
output=AST;
}

@header {
package com.data;
}

@rulecatch {
    // ANTLR does not generate its normal rule try/catch
    catch(RecognitionException e) {
        throw e;
    }
}

@parser::members {
    @Override
    public void displayRecognitionError(String[] tokenNames, RecognitionException e) {
        String hdr = getErrorHeader(e);
        String msg = getErrorMessage(e, tokenNames);
        throw new RuntimeException(hdr + ":" + msg);
    }
}

@lexer::members {
    @Override
    public void displayRecognitionError(String[] tokenNames, RecognitionException e) {
        String hdr = getErrorHeader(e);
        String msg = getErrorMessage(e, tokenNames);
        throw new RuntimeException(hdr + ":" + msg);
    }
}

operatorLogic   : 'AND' | 'OR';
value       : STRING;
query       : (select)*;
select      : 'SELECT'^ functions 'FROM table' filters?';';
operator    : '=' | '!=' | '' | '=';
filters : 'WHERE'^ conditions;
members : STRING operator value;
conditions  : (members (operatorLogic members)*);
functions   : '*';
STRING  : ('a'..'z'|'A'..'Z')+;
WS      : (' '|'\t'|'\f'|'\n'|'\r')+ {skip();}; // handle white space between keywords

public class Processor {

public Processor() {

}

/**
 * This method builds the MQL Parser.
 * @param args the args.
 * @return the built IParser.
 */
private IParser buildMQLParser(String query) {
    CharStream cs = new ANTLRStringStream(query);
    // the input needs to be lexed
    ILexer lexer = new ILexer(cs);
          CommonTokenStream tokens = new CommonTokenStream();
    IParser parser = new IParser(tokens);
    tokens.setTokenSource(lexer);
    // use the ASTTreeAdaptor so that the grammar is aware to build tree in AST format
    parser.setTreeAdaptor((TreeAdaptor) new ASTTreeAdaptor().getASTTreeAdaptor());
return parser;
}

/**
 * This method parses the MQL query.
 * @param query the query.
 */
public void parseMQL(String query) {
    IParser parser = buildMQLParser(query);
    CommonTree commonTree = null;
    try {
                     commonTree = (CommonTree) parser.query().getTree();
                    }
    catch(Exception e) {
        System.out.println("Exception :" + " " + e.getMessage());
    }
}
}

public class ASTTreeAdaptor {

public ASTTreeAdaptor() {

}

/**
 * This method is used to create a TreeAdaptor.
 * @return a treeAdaptor.
 */
public Object getASTTreeAdaptor() {
    TreeAdaptor treeAdaptor = new CommonTreeAdaptor() {
        public Object create(Token payload) {
        return new CommonTree(payload);
        }
    };
    return treeAdaptor; 
}
}

Поэтому, когда я ввожу следующее: SELECT * FROM table

без ';' Я получаю исключение MismatchedTokenException:

catch(Exception e) {
     System.out.println("Exception : " + " " e);
}

Когда я пытаюсь:

e.getMessage();

он возвращает ноль.

Ответы на вопрос(2)

Ваш ответ на вопрос