Universidad Interamericana de PanamáMateria: Compiladores InicioDocumentaciónTema 11Tema 4

Documentación del taller

Portal de mini-compiladores · Universidad Interamericana de Panamá · Materia: Compiladores. Aquí se explica qué hace cada compilador, cómo funciona y cómo está organizado el proyecto.

1. Resumen

El proyecto reúne dos mini-compiladores que trabajan en conjunto. Siguen el flujo que pide el taller: código fuente → análisis léxico → sintáctico → validación semántica → generación de código → compilación → ejecutable o resultado → evidencia.

texto de configuración (.calc)
        │
        ▼   Tema 11: léxico → sintáctico → semántico
     XML / JSON
        │
        ▼   Tema 4: validación → diseño de botones → código C
   ┌────┴─────────────────────────┐
   ▼                              ▼
mingw-w64 → calc.exe        Emscripten → calculadora en el navegador
(Windows, sin dependencias)
  • Tema 11 · Compilador de lenguaje de configuración (nivel intermedio): convierte un texto que describe una calculadora en un archivo XML y JSON.
  • Tema 4 · Compilador de calculadora (nivel básico): toma ese XML y genera una calculadora real. Incluye además el compilador de expresiones aritméticas del taller.

2. Estructura de carpetas

temporal_taller_colaborativo/
├── package.json            Scripts: npm start / npm test
├── README.md               Resumen corto del proyecto
├── builds/                 Compilaciones generadas (se borran a las 2 horas)
├── server/
│   ├── index.js            Servidor HTTP: API y archivos estáticos
│   ├── config-compiler.js  TEMA 11: lexer, parser, semántica, XML/JSON
│   ├── calc-builder.js     TEMA 4: lee el XML, genera C y compila .exe y Emscripten
│   ├── expr-compiler.js    TEMA 4: compilador de expresiones (10 + 5 * 2)
│   ├── xml.js              Lector de XML mínimo
│   ├── util.js             Dibujo de árboles y sugerencias "¿quiso decir…?"
│   ├── test.js             Pruebas automáticas
│   └── templates/
│       ├── engine.h        Motor de cálculo en C (compartido por .exe y web)
│       ├── main_win.c      Ventana de Windows (Win32)
│       ├── main_wasm.c     Puente para Emscripten
│       └── app.html.tpl    Página web de la calculadora
└── public/
    ├── index.html          Inicio
    ├── documentacion.html  Esta página
    ├── tema11.html         Landing page del Tema 11
    ├── tema4.html          Landing page del Tema 4
    ├── css/style.css       Estilos
    ├── js/common.js        Funciones compartidas del navegador
    └── img/logo-uip.png    Logo de la universidad

Archivos que se generan en cada compilación (builds/<id>/)

ArchivoQué es
config.hConstantes salidas del XML: título, tamaño, colores, decimales y qué funciones están activas (HAS_SIN…)
buttons.hTabla de botones (posición, texto, qué insertan, tipo)
engine.h, main_win.c, main_wasm.cCopias de las plantillas, para poder ver el código completo
calc.exeCalculadora de Windows (64 bits, sin dependencias)
calc.js + app.htmlCalculadora para el navegador compilada con Emscripten

3. Cómo ejecutarlo

Requisitos en el servidor: Node 18 o superior, gcc, x86_64-w64-mingw32-gcc (mingw-w64) y emcc (Emscripten).

npm start                 # http://localhost:3000
PORT=4100 npm start       # para usar otro puerto
npm test                  # pruebas automáticas

El flujo en la web: Tema 11 → escribir la configuración → Compilar esta calculadora en el Tema 4 → Tema 4 → Compilar calculadora → descargar calc.exe o probarla en el navegador.

4. Tema 11 · Compilador de lenguaje de configuración

Procesa un lenguaje pequeño que describe una calculadora y produce su configuración en XML y JSON. Archivo: server/config-compiler.js.

El lenguaje

// Calculadora científica con tema oscuro
calculadora "MiCalc" {
  titulo: "Mi Calculadora"
  modo: cientifica
  tema: oscuro
  funciones: [suma, resta, multiplicacion, division, potencia, raiz, sin, cos, pi]
  decimales: 4
  color_operadores: #ff8800
  color_igual: #00aa55
}
PropiedadValorPor defecto
titulotexto entre comillas, 1–40 caracteresel nombre
modobasica | cientificabasica
temaclaro | oscuroclaro
funcionesbásicas: suma resta multiplicacion division porcentaje
científicas: potencia raiz sin cos tan log ln pi
las 4 operaciones
decimalesentero de 0 a 102
ancho, altopíxeles (280–800 y 360–900)360 × 520 (640 si es científica)
color_fondo color_pantalla color_texto color_botones color_operadores color_igual#rrggbb o #rgbsegún el tema

Gramática

programa   := 'calculadora' CADENA '{' propiedad* '}'
propiedad  := IDENTIFICADOR ':' valor
valor      := IDENTIFICADOR | NUMERO | COLOR | CADENA | lista
lista      := '[' IDENTIFICADOR ( ',' IDENTIFICADOR )* ']'

Etapas

  1. Análisis léxico. Recorre el texto y produce tokens (PALABRA_CLAVE, IDENTIFICADOR, CADENA, NUMERO, COLOR, llaves, corchetes, : y ,). Ignora espacios y comentarios //. Reporta caracteres no reconocidos, colores mal escritos y cadenas sin cerrar.
  2. Análisis sintáctico. Descenso recursivo según la gramática. Construye el árbol (AST). Si hay un error sigue leyendo desde la siguiente propiedad, para mostrar varios errores a la vez.
  3. Validación semántica. Revisa que cada propiedad exista, no esté repetida, tenga el tipo correcto y esté en rango. Las funciones científicas exigen modo: cientifica. Avisa si el contraste entre texto y pantalla es muy bajo. Si escribes mal una palabra, sugiere la correcta (¿quiso decir 'cientifica'?).
  4. Generación de código. Aplica los valores por defecto y escribe el XML y el JSON.

Salida (XML)

<?xml version="1.0" encoding="UTF-8"?>
<calculadora nombre="MiCalc" version="1.0">
  <titulo>Mi Calculadora</titulo>
  <modo>cientifica</modo>
  <ventana ancho="360" alto="640"/>
  <tema nombre="oscuro">
    <color elemento="fondo" valor="#1e1e1e"/>
    <color elemento="operadores" valor="#ff8800"/>
    ...
  </tema>
  <precision decimales="4"/>
  <funciones>
    <funcion nombre="suma"/>
    <funcion nombre="sin"/>
    ...
  </funciones>
</calculadora>

Este XML es el contrato entre los dos temas: el Tema 4 solo necesita este formato.

5. Tema 4 · Compilador de calculadora

Toma el XML y genera una calculadora. Archivos: server/calc-builder.js y server/templates/.

  1. Lectura y validación del XML. Verifica el elemento raíz, el modo, el tema, los colores, los rangos y las funciones. Si algo falla, lo informa y no compila.
  2. Diseño de botones. Según el modo y las funciones decide qué botones existen y dónde van. En modo científico agrega ( ) y los botones de las funciones elegidas. Los operadores que no estén en el XML no aparecen.
  3. Generación de código C. Escribe config.h (colores, tamaño, decimales y las banderas HAS_*) y buttons.h (la tabla de botones).
  4. Compilación real. Se ejecutan dos compiladores en paralelo.
# Windows: ejecutable nativo de 64 bits, sin dependencias
x86_64-w64-mingw32-gcc -O2 -s -static -mwindows -o calc.exe main_win.c -lgdi32 -luser32 -lm

# Navegador: Emscripten
emcc -O2 main_wasm.c -o calc.js --no-entry -sMODULARIZE=1 -sEXPORT_NAME=CalcModule -sSINGLE_FILE=1 ...

El motor de cálculo (engine.h)

Es un intérprete de expresiones escrito en C. Es el mismo código para el .exe y para el navegador. Las funciones desactivadas en el XML devuelven "Función no disponible".

expr   := term (('+' | '-') term)*
term   := unario (('*' | '/') unario)*
unario := ('-' | '+') unario | potencia
potencia := post ('^' unario)?
post   := primario '%'*
primario := NUMERO | '(' expr ')' | pi | sqrt(expr) | sin(expr) | cos(expr) | tan(expr) | log(expr) | ln(expr)
  • sin, cos y tan usan grados.
  • % divide entre 100 (50% = 0.5).
  • Detecta errores de sintaxis, división entre cero y operaciones no válidas (raíz de un negativo, logaritmo de cero).

Teclado: dígitos y operadores, Enter o = para calcular, Backspace para borrar y Esc o C para limpiar.

6. Compilador de expresiones

Es el compilador clásico que pide la tabla del taller para el Tema 4 (aceptar suma, resta, multiplicación y división). Archivo: server/expr-compiler.js. Está en la pestaña Expresiones del Tema 4.

10 + 5 * (2 - 1) / 4
  1. Léxico: números (con decimales), + - * / y paréntesis.
  2. Sintáctico: árbol de la expresión con la precedencia correcta.
  3. Semántico: evalúa las constantes para detectar división entre cero antes de generar código.
  4. Código intermedio: instrucciones de tres direcciones.
  5. Código C: un programa que imprime el resultado.
  6. Compilación y ejecución: gcc lo ejecuta para mostrar el resultado, y mingw genera expr.exe para descargar.
t1 = 2.0 - 1.0
t2 = 5.0 * t1
t3 = t2 / 4.0
t4 = 10.0 + t3          →  Resultado: 11.25

7. API del servidor

RutaRecibeDevuelve
POST /api/config/compile{ source } texto del Tema 11tokens, árbol, errores, avisos, XML y JSON
POST /api/calc/build{ xml }configuración, botones, código C, enlaces al .exe y a la versión web, registro de compilación
POST /api/expr/compile{ source } expresióntokens, árbol, código intermedio, código C, resultado y enlace a expr.exe
GET /builds/<id>/<archivo>—archivos de una compilación (solo una lista permitida)

8. Seguridad

  • El texto del usuario nunca se pega tal cual en el código C: los números, colores y listas se validan y los textos se escriben como caracteres Unicode escapados.
  • En el compilador de expresiones solo llegan a C literales numéricos y operadores generados por el propio compilador.
  • El servidor limita el tamaño de las peticiones, limita las compilaciones simultáneas, aplica tiempo máximo a los compiladores y no deja leer archivos fuera de public/ y builds/.
  • Las compilaciones se borran a las 2 horas.

9. Pruebas

npm test comprueba: la compilación correcta del Tema 11, los errores de cada fase, las sugerencias, que el XML del Tema 11 lo acepte el Tema 4, el rechazo de nombres peligrosos y el compilador de expresiones completo (resultado, división entre cero y errores de sintaxis).

10. Equipo

  • Carlos Zachrisson
  • Karen Arauz