Este proyecto está diseñado para analizar gramáticas formales y calcular los conjuntos FIRST y FOLLOW para cada símbolo no terminal. Es una herramienta educativa útil para estudiantes y profesionales que trabajan en compiladores, análisis sintáctico y teoría de lenguajes formales.
- Descripción
- Características
- Requisitos
- Instalación
- Uso
- Estructura del Proyecto
- Ejemplo
- Contribuciones
- Licencia
El programa está implementado en Python y permite al usuario ingresar una gramática definida en un archivo de texto. A partir de esta gramática, el programa calcula y muestra los conjuntos FIRST y FOLLOW para cada símbolo no terminal. Estos conjuntos son fundamentales en la construcción de analizadores sintácticos, especialmente en los métodos de análisis predictivo.
- Parseo de Gramáticas: Lee gramáticas desde archivos de texto en un formato específico.
- Cálculo de Conjuntos FIRST: Determina los posibles símbolos terminales que pueden aparecer al inicio de las cadenas derivadas de cada no terminal.
- Cálculo de Conjuntos FOLLOW: Determina los símbolos que pueden seguir a cada no terminal en las derivaciones.
- Interfaz de Línea de Comandos: Interfaz simple para interactuar con el programa mediante la terminal.
- Soporte para ε-Producciones: Maneja correctamente producciones que derivan en la cadena vacía (ε).
- Python 3.6 o superior.
-
Clonar el Repositorio:
git clone https://github.com/josefdc/FirstAndFollows.git
-
Navegar al Directorio del Proyecto:
cd FirstAndFollows -
Crear y Activar un Entorno Virtual (Opcional pero Recomendado):
python3 -m venv venv source venv/bin/activate -
Instalar Dependencias:
Este proyecto utiliza únicamente la biblioteca estándar de Python, por lo que no es necesario instalar dependencias adicionales.
-
Preparar el Archivo de Gramática:
Crea un archivo de texto (por ejemplo,
grammar1.txt) con la definición de tu gramática. El formato debe ser el siguiente:SímboloInicial NoTerminal -> Producción1 | Producción2 | ... | ProducciónN ...Ejemplo:
exp exp -> term exp' exp' -> + term exp' | - term exp' | ε term -> factor term' term' -> * factor term' | / factor term' | ε factor -> ( exp ) | num | idEn este ejemplo,
expes el símbolo inicial, y las producciones se definen utilizando->para separar el lado izquierdo del derecho y|para múltiples alternativas. La cadena vacía se representa comoε. -
Ejecutar el Programa:
Desde la terminal, ejecuta el script principal:
python main.py
-
Ingresar el Nombre del Archivo de Gramática:
Cuando se te solicite, ingresa el nombre del archivo que contiene la gramática (por ejemplo,
grammar1.txt).Introduce el nombre del archivo que contiene la gramática: grammar1.txt -
Ver los Resultados:
El programa mostrará los conjuntos FIRST y FOLLOW calculados para cada símbolo no terminal.
Conjuntos FIRST:
FIRST(exp) = { (, id, num } FIRST(exp') = { +, -, ε } FIRST(factor) = { (, id, num } FIRST(term) = { (, id, num } FIRST(term') = { *, /, ε }Conjuntos FOLLOW:
FOLLOW(exp) = { $, ) } FOLLOW(exp') = { $, ) } FOLLOW(factor) = { $, ), *, +, -, / } FOLLOW(term) = { $, ), +, - } FOLLOW(term') = { $, ), +, - }
FirstAndFollows/
├── grammar1.txt # Archivo de gramática de ejemplo
├── grammar.txt # Archivo de gramática adicional (puede contener otra gramática)
├── main.py # Script principal para calcular FIRST y FOLLOW
└── README.md # Este archivo
main.py: Contiene la implementación de la claseGrammarque maneja el análisis de la gramática y el cálculo de los conjuntos FIRST y FOLLOW. También incluye funciones auxiliares para parsear la gramática desde un archivo y ejecutar el programa.
Contenido de grammar1.txt:
exp
exp -> term exp'
exp' -> + term exp' | - term exp' | ε
term -> factor term'
term' -> * factor term' | / factor term' | ε
factor -> ( exp ) | num | id
Ejecución:
$ python main.py
Introduce el nombre del archivo que contiene la gramática: grammar1.txtConjuntos FIRST:
FIRST(exp) = { (, id, num }
FIRST(exp') = { +, -, ε }
FIRST(factor) = { (, id, num }
FIRST(term) = { (, id, num }
FIRST(term') = { *, /, ε }
Conjuntos FOLLOW:
FOLLOW(exp) = { $, ) }
FOLLOW(exp') = { $, ) }
FOLLOW(factor) = { $, ), *, +, -, / }
FOLLOW(term) = { $, ), +, - }
FOLLOW(term') = { $, ), +, - }
¡Las contribuciones son bienvenidas! Si deseas mejorar este proyecto, por favor sigue estos pasos:
- Fork el Repositorio.
- Crea una Rama de Característica:
git checkout -b nueva-caracteristica
- Realiza tus Cambios y Commit:
git commit -m "Descripción de la característica" - Push a la Rama:
git push origin nueva-caracteristica
- Abre un Pull Request.
Este proyecto está licenciado bajo la Licencia MIT.