Análisis Semántico: Type Checker y Borrow Checker

Archivo: src/semantics.rs

El análisis semántico es la fase del compilador responsable de garantizar que el programa tenga coherencia lógica antes de su ejecución. Forja implementa dos subsistemas principales en este archivo: un Type Checker para validación de tipos e inferencia de tipos estáticos, y un Borrow Checker para la verificación de reglas de pertenencia (ownership) y ciclo de vida de variables.

Estructuras del Ámbito Semántico

enum EstadoVariable

Representa el ciclo de vida de una variable en tiempo de compilación:

struct InfoVariable

Almacena la metadata de cada variable:

struct TablaSimbolos

Estructura de ámbito con soporte de scopes jerárquicos (anidados) representados como un vector de mapas hash (ambitos: Vec<HashMap<String, InfoVariable>>).


BorrowChecker

Definición de BorrowChecker
pub struct BorrowChecker {
    tabla: TablaSimbolos,
    errores: Vec<ErrorForja>,
    variantes_enum: HashMap<String, Vec<String>>,
}

Desglose de Funciones de BorrowChecker

pub fn analizar(&mut self, programa: &Programa) -> Result<(), Vec<ErrorForja>>

fn es_copy(tipo: &Option<Tipo>) -> bool

fn analizar_declaracion(&mut self, decl: &Declaracion)

fn analizar_expresion(&mut self, expr: &Expresion) -> Option<Tipo>


TypeChecker

Definición de TypeChecker
pub struct TypeChecker {
    tabla: TablaSimbolos,
    errores: Vec<ErrorForja>,
    funciones: HashMap<String, (Vec<Option<Tipo>>, Option<Tipo>, Vec<ParametroTipo>)>,
    tipos: HashMap<String, Tipo>,
    traits: HashMap<String, Vec<FirmaMetodo>>,
    variantes_enum: HashMap<String, Vec<String>>,
}

Desglose de Funciones de TypeChecker

pub fn analizar(&mut self, programa: &Programa) -> Result<(), Vec<ErrorForja>>

fn analizar_declaracion(&mut self, decl: &Declaracion)

fn analizar_expresion(&mut self, expr: &Expresion) -> Tipo