¿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 (
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:
Luego, podemos definir un listener de errores personalizado que ignore el error de identificador faltante y continúe analizando:
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:
Luego, podemos definir otro listener de errores personalizado que ignore el error de paréntesis inesperado y continúe analizando:
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.