Un compilador básico desarrollado en Python que implementa análisis léxico y sintáctico para un lenguaje de programación simplificado, con interfaz gráfica y generación de árboles sintácticos visuales.
- Características
- Requisitos del Sistema
- Instalación
- Uso
- Gramática Soportada
- Componentes del Proyecto
- Ejemplos de Código
- Análisis Implementado
- Contribución
- Autor
- Análisis Léxico Completo: Reconocimiento de tokens, palabras reservadas, operadores y literales
- Análisis Sintáctico: Construcción de árboles sintácticos abstractos (AST)
- Interfaz Gráfica Moderna: Editor de código con resaltado y áreas de resultados
- Visualización de Árboles: Generación automática de diagramas de árboles sintácticos
- Tabla de Símbolos: Seguimiento de identificadores y sus tipos
- Detección de Errores: Manejo de errores léxicos y sintácticos
- Soporte Completo de Operadores: Aritméticos, lógicos, comparación y ternarios
- Python 3.7 o superior
- PLY (Python Lex-Yacc)
- Tkinter (incluido con Python)
- Graphviz
- python-graphviz
- Clonar el repositorio:
git clone https://github.com/OscarChitay/p1-copiler.git
cd p1-copiler- Instalar dependencias:
pip install ply graphviz-
Instalar Graphviz (sistema):
Windows:
- Descargar desde: https://graphviz.org/download/
- Agregar al PATH del sistema
Linux (Ubuntu/Debian):
sudo apt-get install graphviz
macOS:
brew install graphviz
- Ejecutar la aplicación:
python main.py-
Escribir código en el editor (panel izquierdo)
-
Realizar análisis:
- Clic en "Análisis Léxico" para tokenizar el código
- Clic en "Análisis Sintáctico" para generar el árbol sintáctico
-
Ver resultados:
- Los tokens aparecen en el panel superior derecho
- El árbol sintáctico en texto en el panel medio derecho
- La tabla de símbolos en el panel inferior derecho
- El diagrama visual se abre automáticamente
if, else, for, while, int, float, string
- Enteros:
123,456 - Flotantes:
3.14,2.5 - Cadenas:
"Hola mundo" - Identificadores:
variable,contador
+ (suma)
- (resta)
* (multiplicación)
/ (división)
-- (decremento)
&& (AND lógico)
|| (OR lógico)
< (menor que)
> (mayor que)
== (igual)
!= (no igual)
? : (operador ternario)
= (asignación)
if (condicion) {
// código
}
if (condicion) {
// código
} else {
// código alternativo
}for (inicio; condicion; incremento) {
// código
}
while (condicion) {
// código
}resultado = condicion ? valor_si_true : valor_si_false;p1-copiler/
│
├── main.py # Interfaz gráfica principal
├── lexico.py # Analizador léxico (tokens)
├── sintactico.py # Analizador sintáctico (gramática)
├── diagram.py # Generador de diagramas
├── parsetab.py # Tabla de análisis generada por PLY
├── parser.out # Información de estados del parser
└── README.md # Documentación del proyecto
- Define todos los tokens del lenguaje
- Implementa reglas de reconocimiento léxico
- Maneja palabras reservadas e identificadores
- Procesa literales numéricos y de cadena
- Define la gramática del lenguaje
- Implementa reglas de precedencia de operadores
- Construye árboles sintácticos abstractos
- Maneja estructuras de control y expresiones
- Genera diagramas visuales de árboles sintácticos
- Utiliza Graphviz para renderizado
- Crea representaciones jerárquicas claras
- Interfaz gráfica con Tkinter
- Editor de código con funcionalidades básicas
- Integra análisis léxico y sintáctico
- Muestra resultados y tabla de símbolos
int x;
float y;
string nombre;
x = 10;
y = 3.14;
nombre = "Hola";int contador;
contador = 0;
if (contador < 10) {
contador = contador + 1;
}
while (contador > 0) {
contador--;
}
for (int i = 0; i < 5; i++) {
// código del bucle
}int a;
int b;
int mayor;
mayor = a > b ? a : b;int resultado;
resultado = (a + b) * c && d || e == f;- ✅ Reconocimiento de tokens
- ✅ Identificación de palabras reservadas
- ✅ Procesamiento de literales
- ✅ Manejo de operadores
- ✅ Detección de errores léxicos
- ✅ Construcción de AST
- ✅ Validación de sintaxis
- ✅ Precedencia de operadores
- ✅ Estructuras de control
- ✅ Expresiones complejas
- ✅ Operador ternario
- ✅ Operadores de decremento
- ✅ Tabla de símbolos
- ✅ Visualización de árboles
- ✅ Interfaz gráfica intuitiva
- ✅ Exportación de diagramas
Este compilador es ideal para:
- Aprendizaje: Entender conceptos de compiladores
- Prototipado: Desarrollo rápido de analizadores
- Educación: Enseñanza de análisis léxico/sintáctico
- Investigación: Base para extensiones más complejas
Carácter ilegal: @ en la posición 15
Error sintáctico en 'token_problemático'
El analizador maneja automáticamente:
- Conflictos shift/reduce
- Precedencia de operadores
- Asociatividad de expresiones
- No implementa análisis semántico
- No genera código objeto
- Tabla de símbolos básica (sin ámbitos)
- Sin optimizaciones
- Análisis semántico completo
- Generación de código intermedio
- Manejo de funciones
- Ámbitos de variables
- Tipos de datos complejos (arrays, structs)
- Optimizaciones del compilador
python -u main.pyrm -f parser.out parsetab.py
rm -rf __pycache__/python sintactico.py- Tokens soportados: 25+
- Reglas gramaticales: 40+
- Líneas de código: ~500
- Archivos: 4 principales + generados
- Fork el proyecto
- Crear una rama feature (
git checkout -b feature/AmazingFeature) - Commit los cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abrir un Pull Request
Este proyecto está bajo la Licencia MIT. Ver LICENSE para más detalles.
Oscar Chitay
- GitHub: @OscarChitay
- Email: [[email protected]]
- PLY (Python Lex-Yacc) por las herramientas de análisis
- Graphviz por la visualización de grafos
- Comunidad de Python por las librerías
Si encuentras algún problema o tienes preguntas:
- Revisa los Issues existentes
- Crea un nuevo Issue si es necesario
- Proporciona código de ejemplo que reproduzca el problema
Desarrollado como parte del curso de Compiladores - Universidad Mariano Gálvez