2016-02-16 2 views
1

Я пытаюсь получить Сообщи ошибки от ANTLR, но я запуталсяANTLRErrorListener получить ошибки Сообщ

я заменил стандартный ErrorListener как в этом reference question

public String runAntlr(String sqlFile){ 
    ANTLRErrorListener error = new BaseErrorListener(); 

    ANTLRInputStream input; 

    try { 
     input = new ANTLRFileStream(sqlFile); 
    } catch (Exception e) { 
     return e.toString(); 
    } 

    tsqlLexer lexer = new tsqlLexer(input); 
    CommonTokenStream tokens = new CommonTokenStream(lexer); 
    tsqlParser parser = new tsqlParser(tokens); 

    parser.removeErrorListeners(); 
    lexer.removeErrorListeners(); 
    parser.addErrorListener(error); 
    lexer.addErrorListener(error); 

    ParseTree tree = parser.tsql_file(); 
    new MyTsqlVisitor().visit(tree); 

    System.out.println(error); 
    return "Analysis successful"; 
} 

Это был текст в моей консоли после бег:

run: 
line 2:16 mismatched input 'as' expecting '.' 
line 2:19 no viable alternative at input 'date' 
line 5:38 mismatched input 'where' expecting {EXCEPT, INTERSECT, UNION, ')'} 
BUILD SUCCESSFUL (total time: 5 seconds) 

После добавления ANTLRErrorListener

run: 
[email protected] 
BUILD SUCCESSFUL (total time: 4 seconds) 

Правильно ли я использовал ANTLRErrorListener?

+0

' error.toString() 'тоже не работает – xNappy

+0

Вы реализовали его вообще? ошибка - это всего лишь экземпляр BaseErrorListener, который генерируется antlr с пустыми методами, если я правильно помню? – cantSleepNow

+0

Я реализовал интерфейс 'ANTLRErrorListener', удалил' ErrorListener' из 'parser' и' lexer' и добавил новый – xNappy

ответ

0

Он работает сейчас, вот мое решение:

Первая моя реализация MyAntlrErrorListener:

public static MyAntlrErrorListener INSTANCE = new MyAntlrErrorListener(); 

//When the value is false, the syntaxError method returns without displaying errors. 
private static final boolean REPORT_SYNTAX_ERRORS = true; 

private String errorMsg = ""; 

@Override 
public void syntaxError(Recognizer<?, ?> recognizer, 
         Object offendingSymbol, 
         int line, 
         int charPositionInLine, 
         String msg, 
         RecognitionException re) { 

    if (!REPORT_SYNTAX_ERRORS) { 
     return; 
    } 

    String sourceName = recognizer.getInputStream().getSourceName(); 
    if (!sourceName.isEmpty()) { 
     sourceName = String.format("%s:%d:%d: ", sourceName, line, charPositionInLine); 
    } 

    System.err.println(sourceName+"line "+line+":"+charPositionInLine+" "+msg); 
    errorMsg = errorMsg + "\n" + sourceName+"line "+line+":"+charPositionInLine+" "+msg; 
} 

@Override 
public String toString() { 
    return errorMsg; 
}  

и я получаю ErrorMsg в моем главном классе, как это:

... 
lexer.removeErrorListeners(); 
lexer.addErrorListener(MyAntlrErrorListener.INSTANCE); 
parser.removeErrorListeners(); 
parser.addErrorListener(MyAntlrErrorListener.INSTANCE); 

... 

return MyAntlrErrorListener.INSTANCE.toString();