# Changelog — charka Transpilador COBOL → Rust. El módulo más grande del ecosistema (Fase D del plan macro) — el parser COBOL completo es un esfuerzo multi-mes. ### feat(charka-ir): representación intermedia — statements tipados Crate nuevo `crates/modules/charka/charka-ir` — la tercera etapa del pipeline: `Program` → `Ir`. El PROCEDURE division pasa de sentencias con tokens crudos a un árbol de instrucciones tipadas. - `lower(&Program) -> Ir` — total y tolerante: nunca falla. - `Ir { program_id, data, procedures }`. El modelo de datos (la DATA division) pasa tal cual — sirve de tabla de símbolos. - `Stmt` cubre `MOVE`, `DISPLAY`, `ACCEPT`, `COMPUTE`, `ADD`, `SUBTRACT`, `MULTIPLY`, `DIVIDE`, `IF`/`ELSE`/`END-IF`, `PERFORM` (fuera de línea, en línea, `TIMES`, `UNTIL`), `GO TO`, `STOP RUN`, `GOBACK`, `EXIT`, `CONTINUE`. - Expresiones de `COMPUTE` con precedencia y paréntesis (`+ -` < `* /` < `**` asociativo a derecha). Condiciones de `IF`/`UNTIL` con comparadores en forma símbolo (`= < > <= >= <>`) o palabra (`EQUAL TO`, `GREATER THAN`...), `AND`/`OR`/`NOT` y nombres de condición (datos de nivel 88). - COBOL no termina los statements con un símbolo: el parser delimita las listas de operandos con palabras "frontera" (verbos, terminadores `END-*`/`ELSE`, conectores `TO`/`GIVING`/`BY`...). - Un verbo no soportado se conserva como `Stmt::Unknown { verb, tokens }` — el lowering nunca aborta. - Fuera de alcance v1: `EVALUATE`, `STRING`/`UNSTRING`, E/S de ficheros, `PERFORM VARYING`, CICS, SQL embebido. - 17 tests: MOVE simple y multi-destino, DISPLAY con figurativas, precedencia de COMPUTE, flag ROUNDED, ADD in-place vs GIVING, SUBTRACT, DIVIDE BY/INTO, IF/ELSE, condiciones con AND, nombre de condición, PERFORM párrafo/TIMES/UNTIL en línea, varios statements en una sentencia, verbo desconocido, programa completo. ### feat(charka-parser): parser COBOL'85 → AST Crate nuevo `crates/modules/charka/charka-parser` — la segunda etapa del pipeline: `Vec` → `Program` (AST). Alcance v1: el esqueleto del programa. - `parse(&[Token]) -> Result`. El AST: `Program` (`program_id`, `data`, `paragraphs`), `DataItem`, `Paragraph`, `Sentence`. - Particiona el flujo de tokens en las cuatro divisiones por sus encabezados (`X DIVISION`); de la IDENTIFICATION extrae el `PROGRAM-ID`. - **DATA division** → árbol de `DataItem`: número de nivel, nombre, cláusula `PICTURE` reensamblada (`S9` `(` `5` `)` `V99` → `S9(5)V99`) y `VALUE`. Anida por número de nivel — 01 y 77 son raíces, 88 cuelga del ítem precedente. - **PROCEDURE division** → `Vec`, cada párrafo con sus `Sentence` (tokens crudos; sin parseo a nivel de statement, eso es `charka-ir`). Las sentencias previas al primer encabezado van a un párrafo implícito de nombre "". - Parser tolerante: salta encabezados de `SECTION`, entradas `FD`/`SD` y cláusulas de datos que no sean `PICTURE`/`VALUE`. `ParseError` sólo ante un número de nivel inválido o un dato sin nombre. - 15 tests: PROGRAM-ID (forma larga y `ID` corta), ítems planos y anidados, reensamblado de PICTURE, variantes de VALUE, niveles 88, `FILLER`, párrafos y párrafo implícito, encabezado de sección, programa completo de punta a punta, nivel inválido. ### feat(charka-lexer): tokenizador de COBOL Crate nuevo `crates/modules/charka/charka-lexer` — la primera etapa del pipeline del transpilador: texto COBOL → secuencia de `Token`. - **Lexer deliberadamente tonto**: no conoce keywords ni la cláusula `PICTURE`; emite `Word` para todo identificador y deja la clasificación al parser. - Tokens: `Word` (palabras COBOL con guiones internos), `Number` (literal sin signo), `String` (comillas dobladas colapsadas), `Period` (el `.` terminador), `Symbol` (paréntesis, separadores y operadores `+ - * / ** = < > <= >= <>`). - Dos formatos de fuente: **fijo** (la tarjeta de 80 columnas — cols 1-6 secuencia, 7 indicadora, 8-72 código, 73-80 identificación) y **libre**. Comentarios por la columna indicadora (`*`/`/`) o por `*` inicial en formato libre. - Cada `Token` lleva línea y columna 1-based; `LexError` tipado (literal sin cerrar, carácter inesperado). - Limitación v1 documentada: no soporta continuación de literales entre líneas (indicador `-`). Subconjunto COBOL'85, el hito intermedio. - 17 tests: sentencias, palabras con guiones, literales y comillas dobladas, números vs terminador, operadores, ambos formatos, tracking de posición, errores. ### feat(charka-bcd): aritmética decimal con semántica COBOL (Pre-existente.) `Picture` + `Decimal` de punto fijo exacto — ver el SDD del módulo. 22 tests.