Definición de Tokens
Archivo: src/token.rs
El token es la unidad atómica de información léxica en Forja. En lugar de procesar texto plano carácter por carácter en el Parser, el compilador procesa una secuencia estructurada de Tokens provista por el Lexer.
Enumeración TokenKind
Define todos los tipos posibles de lexemas detectables en Forja, clasificados en cinco grupos principales:
1. Palabras Clave (Keywords)
Palabras con significado sintáctico especial reservadas por el lenguaje:
| Palabra | TokenKind | Propósito |
|---|---|---|
variable / var | Variable | Declara una variable mutable. |
constante / const | Constante | Declara una constante inmutable. |
mut | Mut | Modifica mutabilidad de parámetros o referencias. |
si | Si | Inicia una estructura condicional. |
sino | Sino | Rama alternativa para el condicional. |
mientras | Mientras | Bucle controlado por condición booleana. |
para | Para | Bucle clásico de estilo C (inicialización; condición; incremento). |
repetir | Repetir | Bucle de repetición fija (ej: repetir 5 veces). |
clase | Clase | Declara una nueva definición de tipo estructurado (Clase). |
constructor | Constructor | Declara la función constructora de una clase. |
este | Este | Referencia a la instancia actual del objeto (similar a this o self). |
nuevo | Nuevo | Instanciación de una clase (ej: nuevo Persona()). |
funcion / fun | Funcion | Declara una función o método. |
prestado | Prestado | Declara que un parámetro se pasa por referencia. |
escribir | Escribir | Función nativa para imprimir salida en terminal. |
leer | Leer | Función nativa para capturar entrada del usuario. |
BD | BD | Palabra clave dedicada para APIs de almacenamiento de bases de datos. |
verdadero | Verdadero | Literal booleano True. |
falso | Falso | Literal booleano False. |
nulo | Nulo | Valor nulo (ausencia de valor). |
retornar | Retornar | Devuelve un valor desde una función. |
importar | Importar | Carga módulos externos y librerías. |
tipo | Tipo | Declara enums algebraicos. |
coincidir | Coincidir | Inicia una expresión de Pattern Matching. |
caso | Caso | Brazo de Pattern Matching. |
externo / externa | Externo | Indica una firma FFI vinculada a bibliotecas nativas de C. |
hilo | Hilo | Lanza un hilo verde / concurrencia ligera. |
canal | Canal | Crea un canal para comunicación entre hilos. |
enviar | Enviar | Envía un mensaje por canal. |
recibir | Recibir | Bloquea y recibe un mensaje desde un canal. |
unir | Unir | Bloquea esperando la finalización de un hilo. |
trait | Trait | Define interfaces / traits para polimorfismo. |
implementa | Implementa | Implementa un trait para una clase específica. |
seleccionar | Seleccionar | Selección no bloqueante de canales (select concurrente). |
tiempo | Tiempo | Rama de timeout en seleccionar. |
otro | Otro | Rama por defecto en seleccionar. |
2. Tipos de Datos Primitivos
TipoTexto: Representa la palabra claveTexto.TipoEntero: Representa la palabra claveEntero.TipoDecimal: Representa la palabra claveDecimal.TipoBooleano: Representa la palabra claveBooleano.
3. Símbolos
Tokens de un solo carácter o caracteres combinados con significado sintáctico estructurado:
Arroba(@): Usado para anotaciones y metadatos.Amp(&): Referencias de préstamos (Borrowing).LlaveAbrir() yLlaveCerrar(): Delimitan bloques de sentencias y ámbitos de scopes.ParenAbrir(() yParenCerrar()): Parámetros, argumentos y precedencia aritmética.CorcheteAbrir([) yCorcheteCerrar(]): Declaraciones de arreglos, indexaciones y mapas.Coma(,): Separador de parámetros, argumentos, elementos de arreglos y variantes.Punto(.): Operador de acceso a miembros y métodos en objetos.DosPuntos(:): Declaraciones de tipo y enlaces.PuntoComa(;): Terminador de declaraciones y sentencias.Interrogacion(?): Propagación de excepciones / errores.Igual(=): Operador de inicialización y asignación.
4. Operadores (Aritméticos, Relacionales y Lógicos)
- Aritméticos:
Mas(+),Menos(-),Por(*),Dividido(/),Porcentaje(%). - Relacionales:
Mayor(>),Menor(<),MayorIgual(>=),MenorIgual(<=),IgualIgual(==),Diferente(!=). - Lógicos:
Y(&&),O(||),Pipe(|- separador de patrones),No(!).
5. Literales y Especiales
Identificador(String): Nombres definidos por el usuario para variables, funciones, etc.Numero(i64): Literales enteros.Decimal(f64): Literales decimales de punto flotante.Texto(String): Literales de cadena de caracteres.Caracter(char): Literal de carácter único.DocComment(String): Comentarios especiales de documentación del compilador (tres barras///).EOF: Fin de archivo (indica al parser el cese de lectura).Error(char): Token de error que envuelve caracteres no reconocidos.
Estructura Token
Vincula un tipo de token específico a su posición física en el archivo fuente para garantizar reportes de diagnóstico precisos.
Definición de Token
pub struct Token {
pub kind: TokenKind,
pub linea: usize,
pub columna: usize,
} Desglose de Funciones de Token
pub fn new(kind: TokenKind, linea: usize, columna: usize) -> Self
- ¿Por qué?: Facilita la creación ágil de instancias de token durante el proceso de tokenización.
- ¿Cómo?: Constructor clásico de inicialización de campos en stack.
- ¿Para qué?: Instanciar y almacenar cada lexema escaneado por el Lexer.
Implementaciones de Rasgos (Traits)
impl fmt::Display for TokenKind
- ¿Por qué?: Permite imprimir una representación textual amigable y comprensible del token en consola.
- ¿Cómo?: Realiza un match exhaustivo sobre
selfpara devolver el lexema textual representativo de cada variante (por ejemplo, escribe"+"paraTokenKind::Maso"variable"paraTokenKind::Variable). - ¿Para qué?: Utilizado para mensajes de error del parser (ej: "se esperaba '}', se obtuvo 'identificador'").
impl fmt::Display for Token
- ¿Por qué?: Formatea el token con sus coordenadas de origen.
- ¿Cómo?: Invoca el Display de `TokenKind` adjuntando los valores numéricos de línea y columna.
- ¿Para qué?: Visualización rápida del token durante depuraciones internas del pipeline.