es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Puedo obligar a Antlr a analizar un programa sintácticamente inválido y devolver un árbol de análisis?

Estoy trabajando en un proyecto que requiere analizar diversos programas sintácticamente inválidos, los cuales son generados al insertar aleatoriamente una lista consecutiva de tokens en el programa semilla, o al eliminar algunos tokens de él. Quiero analizar estos programas inválidos para obtener árboles de análisis incompletos.
Toma el siguiente fragmento de código como ejemplo:

{
 printf("hello");
 int 
}

No hay un identificador después de int.

¿Puedo hacer que Antlr lo analice y genere un árbol parcialmente correcto como este?

  • Fragmento de código
    • LlaveIzquierda {
    • StatementDeExpresión printf(“hello”);
    • nodo desconocido int
    • LlaveDerecha }

Otro ejemplo:

{
 printf("hello");
}(

Hay un paréntesis redundante después de la declaración.
Esto es lo que quiero:

  • Fragmento de código
    • LlaveIzquierda {
    • StatementDeExpresión printf(“hello”);
    • LlaveDerecha }
    • nodo desconocido (
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible forzar a Antlr a analizar programas no válidos en árboles de análisis incompletos ajustando las reglas de gramática y el mecanismo de manejo de errores en el analizador.

    Para manejar el caso en el que no hay un identificador después de “int”, podemos modificar la regla de gramática para la declaración de variables para permitir un identificador opcional:

    varDeclaration
        : 'int' ID? ';'   // ID es opcional
        ;
    

    Luego, podemos definir un listener de errores personalizado que ignore el error de identificador faltante y continúe analizando:

    public class CustomErrorListener extends BaseErrorListener {
        @Override
        public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int pos, String msg, RecognitionException e) {
            if (msg.contains("missing ID at '}'")) {
                // ignorar el error
            } else {
                // reportar otros errores y detener el análisis
                throw new ParseCancellationException(msg);
            }
        }
    }
    

    Con estas modificaciones, Antlr será capaz de analizar el fragmento de código en un árbol parcialmente correcto según lo deseado.

    De manera similar, para manejar el caso en el que hay un paréntesis abierto redundante, podemos modificar la regla de expresión para permitir un paréntesis de cierre opcional:

    expr
        : '(' expr ')'     // paréntesis opcionales
        | // otras reglas
        ;
    

    Luego, podemos definir otro listener de errores personalizado que ignore el error de paréntesis inesperado y continúe analizando:

    public class CustomErrorListener2 extends BaseErrorListener {
        @Override
        public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int pos, String msg, RecognitionException e) {
            if (msg.contains("extraneous input '(' expecting")) {
                // ignorar el error
            } else {
                // reportar otros errores y detener el análisis
                throw new ParseCancellationException(msg);
            }
        }
    }
    

    Con estas modificaciones, Antlr será capaz de analizar el fragmento de código en un árbol parcialmente correcto con el paréntesis redundante como un nodo desconocido.

Comments are closed.