AST – Árbol de Sintaxis Abstracta

Archivo: src/ast.rs424 líneas

¿Por qué existe?

El AST (Abstract Syntax Tree) es la representación estructurada del código fuente de Forja después del análisis léxico y sintáctico. Cada nodo del árbol captura un elemento del lenguaje (expresiones, declaraciones, tipos, patrones) con todos sus datos semánticos, permitiendo que las fases posteriores del compilador —análisis semántico, generación de bytecode, formateo, transpilación— trabajen sobre una estructura de datos rica y tipada en lugar de texto plano.

Estructura raíz

Programa

Representa la unidad de compilación completa. Es la raíz del AST generado por el parser.

CampoTipoDescripción
declaraciones Vec<Declaracion> Lista ordenada de declaraciones del programa (funciones, clases, variables, imports, etc.)

Operadores

Operador — Operadores binarios (12 variantes)

VarianteCategoríaSímbolo ForjaDescripción
SumaAritmético+Suma de dos expresiones
RestaAritmético-Resta de dos expresiones
MultiplicacionAritmético*Multiplicación de dos expresiones
DivisionAritmético/División de dos expresiones
ModuloAritmético%Módulo (resto de división) de dos expresiones
MayorRelacional>Comparación mayor que
MenorRelacional<Comparación menor que
MayorIgualRelacional>=Comparación mayor o igual que
MenorIgualRelacional<=Comparación menor o igual que
IgualIgualRelacional==Comparación de igualdad
DiferenteRelacional!=Comparación de desigualdad
YLógicoyConjunción lógica (AND)
OLógicooDisyunción lógica (OR)

OperadorUnario — Operadores unarios (2 variantes)

VarianteSímbolo ForjaDescripción
Negar-exprNegación numérica: invierte el signo de la expresión
No!exprNegación lógica: invierte el valor booleano de la expresión

Sistema de Tipos

Tipo — Tipos de datos (12 variantes)

VarianteDescripciónEjemplo Forja
EnteroNúmero entero (i64)variable x: Entero = 42
DecimalNúmero de punto flotante (f64)variable x: Decimal = 3.14
TextoCadena de caracteres (String)variable s: Texto = "hola"
BooleanoValor booleano (bool)variable b: Booleano = cierto
NuloValor nulo (null)variable n: Nulo = nulo
ExactoNúmero exacto de precisión arbitraria (i128 + escala u32)variable e: Exacto = 10.50 exacto
Clase(String)Nombre de clase definida por el usuariovariable p: Persona = ...
Arreglo(Box<Tipo>)Arreglo de elementos de tipo Tvariable arr: [Entero] = [1, 2, 3]
Funcion(Vec<Tipo>, Box<Tipo>)Tipo función: (parametros) → retornovariable f: (Entero) → Texto
Resultado(Box<Tipo>, Box<Tipo>)Resultado con Ok(T) y Error(E)variable r: Resultado<Entero, Texto>
Opcion(Box<Tipo>)Valor opcional Option(T)variable o: Opcion<Entero>
RasgoObjeto(String)Un rasgo usado como tipo base (polimorfismo)variable r: Mostrable
Parametro(String)Parámetro de tipo genérico (T, U, etc.)funcion id<T>(x: T) → T { x }

Estructuras auxiliares

ParametroTipo

Representa un parámetro de tipo genérico en una función o clase (como T en funcion foo<T>(x: T)).

CampoTipoDescripción
nombreStringNombre del parámetro de tipo (ej: "T", "U")

Parametro

Parámetro de función, con soporte para préstamos (referencias) y tipo opcional (inferido).

CampoTipoDescripción
nombreStringNombre del parámetro
prestadoboolSi es una referencia prestada (&T)
mutableboolSi es una referencia mutable (&mut T)
tipoOption<Tipo>Tipo del parámetro. None si se infiere

VariableClase

Campo declarado dentro de una clase.

CampoTipoDescripción
nombreStringNombre del campo
tipoOption<Tipo>Tipo del campo. None si se infiere

Atributo

Anotación o atributo (como @derive, @test) que puede aplicarse a funciones, clases, enums.

CampoTipoDescripción
nombreStringNombre del atributo (ej: "derive", "test")
argumentosVec<String>Argumentos del atributo (ej: ["Mostrar", "Igualdad"])

Variante

Variante de un tipo enum (ej: Alguno(Entero)).

CampoTipoDescripción
nombreStringNombre de la variante (ej: "Alguno")
tiposVec<Tipo>Tipos de datos asociados a la variante

Patron — Patrones de matching (4 variantes)

VarianteDescripciónEjemplo Forja
Variable(String)Víncula el valor a una variable en el brazocaso x -> ...
Literal(Expresion)Coincide contra un valor literalcaso 42 -> ...
Constructor(String, Vec<Patron>)Coincide contra un constructor con sub-patrones para sus camposcaso Alguno(v) -> ...
IgnorarComodín que ignora el valor (equivale a _)caso _ -> ...

Contrato — Design by Contract

Representa una precondición (requiere), postcondición (asegura) o invariante (siempre).

CampoTipoDescripción
condicionExpresionExpresión booleana que debe cumplirse
mensajeOption<String>Mensaje de error opcional si la condición falla

Metodo

Método completo (con cuerpo) dentro de una clase o implementación de rasgo.

CampoTipoDescripción
nombreStringNombre del método
parametrosVec<Parametro>Parámetros del método
tipo_retornoOption<Tipo>Tipo de retorno (opcional, se infiere)
cuerpoVec<Declaracion>Cuerpo del método como lista de declaraciones
precondicionesVec<Contrato>Precondiciones (requiere) del método
postcondicionesVec<Contrato>Postcondiciones (asegura) del método

FirmaMetodo

Firma de método sin cuerpo, usada en definiciones de rasgo (interfaz).

CampoTipoDescripción
nombreStringNombre del método
parametrosVec<Parametro>Parámetros del método
tipo_retornoOption<Tipo>Tipo de retorno (opcional, se infiere)

BrazoMatch

Brazo individual dentro de una expresión coincidir.

CampoTipoDescripción
patronPatronPatrón contra el que se compara
cuerpoVec<Declaracion>Declaraciones a ejecutar si el patrón coincide

BrazoSeleccionar

Brazo individual dentro de una expresión seleccionar (select sobre canales).

CampoTipoDescripción
recepcionOption<(String, Expresion)>Some(variable, canal) para recepción; None para default/tiempo
timeout_msu64Tiempo de espera en ms (0 = default/inmediato)
cuerpoVec<Declaracion>Declaraciones a ejecutar si el brazo se selecciona

Expresiones

Expresion — Todas las expresiones del lenguaje (32 variantes)

Literales y valores

VarianteDescripciónEjemplo Forja
LiteralNumero(i64)Literal entero de 64 bits42, -10
LiteralDecimal(f64)Literal de punto flotante3.14, -0.5
LiteralTexto(String)Literal de cadena"hola mundo"
LiteralBooleano(bool)Literal booleanocierto, falso
LiteralNuloLiteral nulonulo
LiteralExacto(i128, u32)Literal exacto (coeficiente + escala)10.50 exacto

Identificadores y acceso

VarianteDescripciónEjemplo Forja
Identificador { nombre, linea, columna }Referencia a variable, función o miembrox, PI
AccesoMiembro { objeto, miembro }Acceso a miembro de objetopersona.nombre
Index { objeto, indice }Acceso por índice a arregloarr[0]
Grupo(Box<Expresion>)Expresión agrupada entre paréntesis(a + b) * c
Referencia { expr, mutable }Referencia (préstamo) a una expresión&x, &mut x

Operaciones aritméticas y lógicas

VarianteDescripciónEjemplo Forja
Binaria { izq, op, der }Operación binaria entre dos expresionesa + b, x > 5
Unaria { op, expr }Operación unaria sobre una expresión-x, !cond
Ternario { cond, si_verdadero, si_falso }Operador ternario condicionalcond ? cierto : falso
Try(Box<Expresion>)Operador de propagación de erroresexpresion?

Llamadas e instanciación

VarianteDescripciónEjemplo Forja
LlamadaFuncion { nombre, argumentos }Llamada a función por nombreescribir("hola")
LlamadaMetodo { objeto, metodo, argumentos }Llamada a método sobre objetolista.agregar(5)
Instanciacion { clase, argumentos }Instanciación de clasenuevo Persona("Ana")
Closure { parametros, cuerpo }Función anónima (closure)func(x) { x + 1 }

Estructuras de datos

VarianteDescripciónEjemplo Forja
Arreglo(Vec<Expresion>)Arreglo literal[1, 2, 3]
Mapa(Vec<(Expresion, Expresion)>)Mapa literal (clave → valor)#{"clave": valor}

Constructores de tipo algebraico

VarianteDescripciónEjemplo Forja
Ok(Box<Expresion>)Constructor Ok de ResultadoOk(42)
Error(Box<Expresion>)Constructor Error de ResultadoError("falló")
Algo(Box<Expresion>)Constructor Algo de OpcionAlgo(42)
ResultadoReferencia al valor de retorno (para postcondiciones)resultado
Anterior(Box<Expresion>)Valor anterior de una expresión (para contratos)anterior(x)

Asignaciones como expresión

VarianteDescripciónEjemplo Forja
Asignacion { variable, valor }Asignación como expresión (retorna el valor)x = 5
AsignacionCampo { objeto, campo, valor }Asignación a campo como expresiónobj.campo = valor
ArraySet { array, valor }Asignación por índice como expresiónarr[i] = valor

Concurrencia y control

VarianteDescripciónEjemplo Forja
Hilo { cuerpo }Creación de hilo ligerohilo { ... }
CanalNuevoCreación de canal de comunicacióncanal()
Seleccionar { brazos }Selección entre múltiples canales (select)seleccionar { ... }
Coincidir { expr, brazos }Pattern matching sobre una expresióncoincidir expr { ... }

Declaraciones

Declaracion — Todas las declaraciones del lenguaje (20 variantes)

Variables y asignaciones

VarianteDescripciónEjemplo Forja
Variable { mutable, nombre, tipo, valor, linea, columna }Declaración de variable (inmutable o mutable)variable x = 5 / variable mutable y = 10
Asignacion { nombre, valor, linea, columna }Asignación a variable existentex = 10
AsignacionMiembro { objeto, miembro, valor, linea, columna }Asignación a campo de objetoeste.nombre = "Ana"
AsignacionIndex { nombre, indice, valor, linea, columna }Asignación por índicearr[0] = 10
AsignacionMultiple { variables, mutable, valor }Asignación múltiple (ej: canal tx, rx)variable tx, rx = canal()

Funciones

VarianteDescripciónEjemplo Forja
Funcion { nombre, parametros_tipo, parametros, tipo_retorno, cuerpo, externa, enlace_nombre, atributos, doc, precondiciones, postcondiciones }Declaración de función completa con soporte para genéricos, FFI, atributos, documentación y contratosfuncion sumar(a: Entero, b: Entero) → Entero { a + b }

Clases, enums, rasgos

VarianteDescripciónEjemplo Forja
Clase { nombre, parametros_tipo, campos, metodos, atributos, invariantes }Declaración de clase con campos, métodos, genéricos, atributos e invariantesclase Persona { ... }
Enum { nombre, variantes, atributos }Declaración de tipo enum algebraicotipo Opcion = Alguno(Entero) | Ninguno
Rasgo { nombre, metodos }Declaración de rasgo (interfaz)rasgo Mostrable { ... }
Implementacion { rasgo_nombre, clase_nombre, metodos }Implementación de rasgo para una claseimplementar Mostrable para Persona { ... }

Control de flujo

VarianteDescripciónEjemplo Forja
Si { condicion, bloque_verdadero, bloque_falso }Condicional con rama opcional sinosi cond { ... } sino { ... }
Mientras { condicion, bloque }Bucle mientras condicionalmientras cond { ... }
Para { inicializacion, condicion, incremento, bloque }Bucle para estilo Cpara (variable i = 0; i < 10; i = i + 1) { ... }
Repetir { cantidad, bloque }Bucle con cantidad fija de repeticionesrepetir 5 { ... }
Cuando { condicion, cuerpo, linea, columna }Bloque reactivo/observador (cuando una condición cambia)cuando x > 10 { ... }
Retornar { valor }Retorno de valor de funciónretornar 42
RomperRompe el bucle actualromper
ContinuarContinua con la siguiente iteración del buclecontinuar

Módulos y otros

VarianteDescripciónEjemplo Forja
Importar(String)Importación de móduloimportar math o importar "/ruta/absoluta"
ImportarExterna(String)Cargar librería externa (FFI)importar externa "libreria.dll"
LlamadaFuncion { nombre, argumentos }Llamada a función como statementescribir("hola")
AccesoMiembro { objeto, miembro }Acceso a miembro como statementobjeto.metodo()
Expresion(Expresion)Expresión usada como statement (ej: efecto secundario)x + 1

Métodos auxiliares

Declaracion::es_externa()

FirmaDescripción
pub fn es_externa(&self) -> boolRetorna cierto si la declaración es una función externa (FFI), es decir, Declaracion::Funcion { externa: true, .. }

Pipeline de compilación

El AST es el centro del pipeline del compilador Forja:

  1. Código fuente → lexer produce tokens
  2. Tokens → parser construye el AST (Programa)
  3. AST → análisis semántico (resolución de nombres, verificación de tipos)
  4. AST → generación de bytecode o código nativo (ASM/LLVM)
  5. AST → formateo de código (formatter.rs recorre el AST)
  6. AST → transpilación a otros lenguajes

Diagrama de relación

┌─────────────┐     ┌─────────────┐     ┌──────────────────┐
│  lexer.rs   │────▶│  parser.rs  │────▶│  ast.rs (AST)    │
└─────────────┘     └─────────────┘     └────────┬─────────┘
                                                  │
                    ┌─────────────────────────────┼─────────────────────────────┐
                    │                             │                             │
                    ▼                             ▼                             ▼
          ┌─────────────────┐          ┌──────────────────┐          ┌──────────────────┐
          │  semantica.rs   │          │  bytecode.rs     │          │  formatter.rs    │
          │  (verificación)  │          │  (generación)     │          │  (formateo)       │
          └─────────────────┘          └────────┬─────────┘          └──────────────────┘
                                                 │
                                    ┌────────────┼────────────┐
                                    │            │            │
                                    ▼            ▼            ▼
                          ┌────────────┐ ┌────────────┐ ┌────────────┐
                          │ compiler_  │ │ compiler_  │ │ vm_jit.rs / │
                          │ asm.rs     │ │ llvm.rs    │ │ vm_fast.rs │
                          └────────────┘ └────────────┘ └────────────┘