Constructor IR desde AST (ir_constructor.rs)
Archivo: src/ir_constructor.rs (283 líneas)
¿Por qué existe?
Convierte el AST de Forja a la representación intermedia SSA definida en ir.rs. Es la primera etapa del frontend que abandona la sintaxis y trabaja con bloques básicos e instrucciones de bajo nivel. La versión actual es simplificada: maneja literales, operaciones binarias, si, mientras, funcion y retornar.
Arquitectura / Estructuras clave
La estructura IrConstructor mantiene una tabla de símbolos compartida y un mapa de variables a slots de memoria, que asigna índices crecientes mediante alloc_mem / get_mem. Cada función resetea ese mapa.
| Componente | Descripción |
|---|---|
IrConstructor | Estado del constructor: symbols, var_map: HashMap<String, MemIdx> y next_mem |
tipo_to_ir(&Tipo) -> IrType | Mapea tipos de AST (Entero, Decimal, Booleano, resto) a IrType |
expr_to_ir(&Expresion) -> ValueId | Baja expresiones: literales, identificadores (vía Load), binarias y unarias |
decl_to_ir(&Declaracion) | Baja declaraciones: Variable (Alloca + Store), Asignacion, LlamadaFuncion, Si, Mientras, Retornar, Funcion |
function_to_ir(&Declaracion) -> Option<SsaFunction> | Traduce una función completa: emite Alloca/Param/Store por parámetro y agrega un Return(None) implícito si falta |
program_to_ir(&Programa) -> IrProgram | Convierte todas las funciones del programa a un IrProgram |
Cómo se integra
Es el productor del IR SSA. El control flow de si genera tres bloques (then, else, merge) con un Branch condicional; mientras genera header, body y exit con back-edge al header. El resultado alimenta a ir_ssa.rs (construcción SSA completa con φ-nodes) y luego a ir_to_bytecode.rs.
IrBuilder de ir.rs, que asigna ValueIds y mantiene el bloque actual.LlamadaFuncion (como expresión), LlamadaMetodo, cierres, instanciación de clases y accesos a campos aún no están implementadas y caen silenciosamente a emit_const_nil().