2012-04-30 4 views
5

Tenemos los siguientes sub-parte de una gramática Antlr:Gestión de errores de Antlr de sintaxis o cómo dar un mejor mensaje en el inesperado símbolo

signed_int 
     : SIGN? INT 
    ; 

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

Cuando alguien entra en un valor numérico que todo está bien, pero si por error, escribe algo así como 1O (uno y o de capital) se obtiene un mensaje de error críptico como:

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

¿Qué es una buena manera de manejar este tipo de error? Pensé en definiendo el tipo de token SYMBOL catch-all, pero esto lleva a demasiados errores de construcción del analizador . Continuaré investigando el manejo de errores de Antlr, pero creo que podría publicarlo aquí para buscar algunas ideas. I .

Respuesta

4

Debe anular los métodos reportError en lexer y analizador. Puede hacerlo mediante la adición de este código a su archivo de léxico:

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

y crear un método de partidos en analizador que comprueba si la cadena de entrada coincide con la gramática especificada:

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

A continuación, en el uso de archivos los Parser.matches (entrada); para verificar si la entrada dada coincide con el gramar. Si coincide con el método devuelve verdadero, de lo contrario devuelve falso, por lo que cuando devuelve falso puede dar cualquier mensaje de error personalizado a los usuarios.

Cuestiones relacionadas