Back to flin
flin

Construyendo un analizador léxico desde cero en Rust

Cómo construimos el analizador léxico de FLIN en Rust: del flujo de caracteres a tokens, reconocimiento de palabras clave y escaneo en modo vista.

Juste Thales Gnimavo & Claude | March 26, 2026 2 min flin
EN/ FR/ ES
flinrust

Un analizador léxico es lo primero que encuentra tu código. Convierte caracteres en significado. Antes de que un parser pueda entender la estructura de tu programa, antes de que un verificador de tipos pueda validar su corrección, antes de que un generador de código pueda emitir bytecode -- el analizador léxico debe leer tu archivo fuente un carácter a la vez y producir un flujo de tokens. Es la fase más humilde de un compilador, y posiblemente la más importante.

El analizador léxico de FLIN tiene un desafío inusual: debe manejar dos modos sintácticos fundamentalmente diferentes en el mismo archivo fuente. Los programas FLIN contienen código imperativo -- declaraciones de variables, flujo de control, llamadas a funciones -- intercalado con declaraciones de vista similares a HTML. El lexer debe cambiar entre estos modos sin perder su posición, sin identificar erróneamente tokens ni confundir un operador menor-que con una etiqueta HTML de apertura.

El escáner trimodal

rustpub struct Lexer<'a> {
    source: &'a str,
    chars: Peekable<CharIndices<'a>>,
    line: u32,
    column: u32,
    start: u32,
    mode: LexerMode,
}

#[derive(Debug, Clone, Copy, PartialEq)]
enum LexerMode {
    Code,           // Código normal
    View,           // Dentro de etiquetas HTML
    ViewExpression, // Dentro de {expresión} en vista
}

El modo Code es el predeterminado. Los tokens son operadores, palabras clave, identificadores y literales.

El modo View se activa cuando el lexer encuentra un < seguido de un carácter alfabético. En modo vista, el lexer emite tokens TagOpen, TagName, AttrName, TagClose, TagSelfClose y TagEnd.

El modo ViewExpression se activa cuando el lexer encuentra { mientras está en modo vista. Dentro de las llaves, el lexer revierte a tokenización en modo código.

Al final de la sesión 4, el lexer tenía 97 pruebas unitarias. Cuando empezamos a construir el parser en la sesión 5, el flujo de tokens era confiable. Nunca tuvimos que depurar un error del parser que resultara ser un error del lexer. Ese es el retorno de inversión de las pruebas exhaustivas del lexer.


Esta es la Parte 12 de la serie "Cómo construimos FLIN".

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles

Thales & Claude deblo

El prompt decía que lo anunciara. El modelo no lo hizo. Así que lo hizo el worker: cerrar un silencio de 15 segundos en Déblo Voice

Déblo Voice se quedaba en silencio unos 15 segundos cada vez que una pregunta difícil activaba una búsqueda profunda. El prompt ya exigía un anuncio, pero el modelo de audio nativo emite la llamada a la función como su primer token. Además, el silencio tenía dos partes, la ejecución de la herramienta y la latencia de la respuesta, así que ningún prompt podía cerrarlo. Llevamos la garantía al worker de LiveKit: un anuncio pregrabado con la voz y el idioma de la sesión, y un suave sonido de tecleo mientras el agente piensa. Probado en producción el 16 de octubre de 2026: 14 y 17,5 segundos de silencio del lado del modelo, unos 0,4 segundos percibidos por el usuario.

13 min Oct 16, 2026
deblodeblo-voicevoice-aigemini-live +17
Thales & Claude zerosuite

El servidor que no dimos de baja: vaciar una máquina de producción en una noche, y cada número que comprobamos

Una noche, seis aplicaciones migradas fila por fila, tres copias de seguridad vacías, una sin destino y un servidor cuyo futuro cambió tres veces.

19 min Oct 2, 2026
caspclaude-codeclaude-opus-5.5infrastructure +10
Thales & Claude zerosuite

El orquestador no programa: trece sesiones en un día, un navegador que verifica y saber cuándo parar

Un día, una plataforma privada de un cliente, trece sesiones headless de Claude encadenadas por un orquestador que nunca escribe código. Verificar en el navegador del CEO, agrupar correcciones sin soltar la gate y escribir cuándo cerrar una sesión.

19 min Sep 30, 2026
caspclaude-codeclaude-opus-5.5multi-session +12