Proyecto final
Integrantes:
David Ríos Arboleda
Samuel Molina Echeverri
Nuestro sistema implementa un analizador sintáctico para gramáticas libres de contexto capaz de
determinar si una gramática es LL(1), SLR(1) o ninguna, y realizar el análisis correspondiente. El
código procesa la gramática mediante la función read_grammar(), que divide las producciones en
símbolos individuales, incluyendo casos especiales como "(S)", "S+" o "T*" mediante reglas
específicas.
Para el análisis LL(1), calculamos los conjuntos FIRST y FOLLOW de forma iterativa. La tabla de
parsing se construye verificando posibles conflictos entre producciones para un mismo par (no
terminal, terminal). Cuando detectamos ambigüedades, el sistema determina que la gramática no
es LL(1). En el caso SLR(1), generamos el autómata LR(0) y usamos los conjuntos FOLLOW para
decidir reducciones, marcando como conflicto cualquier estado que requiera múltiples acciones
con el mismo terminal.
El Parser principal funciona con un sistema de pila: en LL(1) expande no terminales según la tabla
predictiva, mientras que en SLR(1) alterna entre desplazamientos y reducciones guiado por la tabla
de acciones. Las cadenas de entrada se validan con un marcador de fin ($), devolviendo "yes" o
"no" según si son aceptadas.
Problemas identificados:
El tratamiento de producciones complejas en read_grammar() puede fallar con ciertas gramáticas
no contempladas
El cálculo de FOLLOW presenta dificultades con recursión izquierda en algunos casos
La detección de conflictos no especifica el tipo ni ubicación exacta del problema
Algunos de estos problemas ya fueron solucionados a la fecha que se entrega este documento, por
el momento conteníamos con la solución de read_grammar()