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.

ComponenteDescripción
IrConstructorEstado del constructor: symbols, var_map: HashMap<String, MemIdx> y next_mem
tipo_to_ir(&Tipo) -> IrTypeMapea tipos de AST (Entero, Decimal, Booleano, resto) a IrType
expr_to_ir(&Expresion) -> ValueIdBaja 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) -> IrProgramConvierte 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.

Uso del builder: El constructor no escribe instrucciones directamente: delega todo en IrBuilder de ir.rs, que asigna ValueIds y mantiene el bloque actual.
Limitación: Las expresiones 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().