← Volver a proyectos

Compiladores · Lenguaje de dominio específico

StatsLang

Lenguaje de dominio específico orientado a consultas estadísticas simples, desarrollado con ANTLR4 y Python para aplicar conceptos de análisis léxico, análisis sintáctico, recorrido del árbol de parseo y generación básica de representación intermedia.

Tipo Lenguaje / Compiladores
Estado Académico
Rol Diseño de gramática, parser y generación intermedia
Objetivo Aplicar fundamentos de teoría de compiladores

Problema

En el curso de Teoría de Compiladores era necesario aplicar de forma práctica los conceptos de análisis léxico, análisis sintáctico, construcción de árbol de parseo y generación de una salida intermedia.

Para ello, se planteó el diseño de un lenguaje pequeño y específico que permitiera representar consultas estadísticas simples de forma clara y estructurada.

Solución

StatsLang fue desarrollado como un lenguaje de dominio específico para expresar operaciones estadísticas básicas. El lenguaje permite cargar archivos, realizar consultas con funciones de agregación, aplicar condiciones y declarar histogramas simples.

La gramática fue definida en ANTLR4 mediante un archivo `.g4`. A partir de ella se generaron los componentes necesarios para realizar el análisis léxico y sintáctico desde Python, recorriendo posteriormente el árbol mediante un visitor.

Características principales

  • Definición formal de una gramática con ANTLR4.
  • Reconocimiento de sentencias para carga de archivos.
  • Consultas estadísticas con funciones como avg, sum, count, min y max.
  • Uso de alias mediante la palabra reservada as.
  • Condiciones con operadores de comparación y operadores lógicos.
  • Declaración de histogramas simples con número de bins.
  • Manejo de ejemplos válidos e inválidos.
  • Generación básica de representación intermedia.

Sintaxis del lenguaje

Algunos ejemplos de instrucciones válidas en StatsLang son:

load "ventas.csv";

select avg(precio) where categoria = "ropa";

select avg(nota) as promedio, max(nota), min(nota);

histogram edad bins=5;

Stack técnico

PythonANTLR4Java RuntimeANTLR4 Python RuntimeGramáticas .g4Visitor PatternCLI

Retos técnicos

  • Diseñar una gramática suficientemente clara para reconocer sentencias estadísticas sin aumentar demasiado la complejidad del lenguaje.
  • Separar la parte frontend del compilador, encargada del análisis léxico y sintáctico, de la parte backend, encargada del recorrido y la generación intermedia.
  • Manejar errores sintácticos para diferenciar ejemplos válidos e inválidos.
  • Organizar los archivos generados por ANTLR4 sin mezclarlos con el código fuente principal.

Aprendizajes

Este proyecto me permitió reforzar fundamentos de compiladores mediante una implementación práctica: desde la definición de tokens y reglas de parser hasta el recorrido del árbol de parseo.

También me ayudó a entender mejor cómo se puede diseñar un lenguaje de dominio específico, cómo estructurar un proyecto con frontend y backend de compilador, y cómo documentar una gramática para que sea entendible.