2012-04-30 5 views
5

abbiamo le seguenti sotto-parte di una grammatica Antlr:Gestione degli errori Antlr sintassi o il modo di dare un messaggio migliore su token imprevisto

signed_int 
     : SIGN? INT 
    ; 

INT : '0'..'9'+ 
     ; 

Quando qualcuno entra un valore numerico è tutto a posto, ma se erroneamente digitare qualcosa di simile a 1O (uno e o capitale) si ottiene un messaggio di errore di criptico come:

error 1 : Missing token at offset 14 
near [Index: 0 (Start: 0-Stop: 0) ='<missing COLON>'  type<24> Line: 26 LinePos:14] 
: syntax error... 

cosa è un buon modo per gestire questo tipo di errore? Ho pensato a definendo il tipo di token SYMBOL catch-all, ma questo ha portato a troppi errori di generazione di parser . Continuerò a esaminare la gestione degli errori di Antlr, ma I ha pensato che avrei postato questo qui per cercare alcuni approfondimenti.

risposta

4

È necessario eseguire l'override dei metodi reportError in lexer e parser. Puoi farlo aggiungendo questo codice al file lexer:

@Override 
public void reportError(RecognitionException e) { 
    throw new RuntimeException(e); 
} 

E creare un metodo di partite nel parser che controlla se la stringa di input corrisponde la grammatica specificata:

public static boolean matches(String input) { 
    try { 
     regExLexer lexer = new regExLexer(new ANTLRStringStream(input)); 
     regExParser parser = new regExParser(new CommonTokenStream(lexer)); 
     parser.goal(); 
     return true; 
    } catch (RuntimeException e) { 
     return false; 
    } 
    catch (Exception e) { 
     return false; 
    } 
    catch (OutOfMemoryError e) { 
     return false; 
    } 

} 

@Override 
public void reportError(RecognitionException e) { 
    throw new RuntimeException(e); 
} 

Poi nel vostro uso di file the Parser.matches (input); per verificare se l'input fornito corrisponde a gramar. Se corrisponde al metodo restituisce true, altrimenti restituisce false, quindi quando restituisce false puoi dare un messaggio di errore personalizzato agli utenti.