# 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-codegen): emisión de Rust desde el IR Crate nuevo `crates/modules/charka/charka-codegen` — la etapa final del pipeline. `generate(&Ir) -> String` produce un fuente Rust (un `main.rs`) que, compilado contra `charka-runtime`, ejecuta la lógica del programa COBOL. - Un `struct Program` con un campo por cada dato elemental — `Num` para los numéricos, `Text` para los alfanuméricos; `Program::new()` los inicializa desde sus cláusulas `VALUE`. - Un método `p_
(&mut self)` por cada párrafo del PROCEDURE;
`run()` los encadena en orden (el «caer» de COBOL); `main()`
construye el `Program` y lo corre.
- Cada `Stmt` → código Rust: `MOVE`→`.store`/`.fill`,
`DISPLAY`→`println!`, `COMPUTE` y la aritmética → expresiones
`Decimal`, `IF`→`if`/`else`, `PERFORM`→ llamada de método / `for` /
`while`, `GO TO`→ llamada + `return`, `STOP RUN`→`process::exit`.
- Tolerante: lo no transpilable (`Stmt::Unknown`, un dato sin resolver,
el operador `**`) se emite como comentario `// charka:`; el código
generado siempre compila.
- Saneado de identificadores COBOL→Rust (incl. choques con keywords).
- Verificado de punta a punta: un programa COBOL de demostración
transpila a Rust que compila contra `charka-runtime` y produce la
salida esperada (`COMPUTE`, `IF`, `PERFORM`, `DISPLAY`).
- 14 tests del fuente emitido; fuera de alcance v1: grupos como campo,
`REDEFINES`, `OCCURS`, `PERFORM ... THRU` como rango, E/S.
### feat(charka-runtime): soporte de ejecución — campos Num y Text
Crate nuevo `crates/modules/charka/charka-runtime` — el soporte que los
programas COBOL transpilados enlazan. `charka-codegen` no emitirá Rust
autónomo: emitirá Rust que llama a esta biblioteca.
- `Num` — campo numérico (`PIC 9(5)V99`): un `Decimal` conformado a su
`Picture`. `store` trunca a la escala declarada; `store_rounded`
redondea; al desbordar la parte entera conserva los dígitos de bajo
orden (el `ON SIZE ERROR` de COBOL sin cláusula). `display` da los
dígitos con relleno de ceros y signo si corresponde.
- `Text` — campo alfanumérico (`PIC X(n)`) de longitud fija: `store`
justifica a la izquierda y rellena con espacios o trunca; `fill`
mueve las constantes figurativas (`SPACES`, `ZEROS`).
- `cobol_text_cmp` — comparación alfanumérica que rellena el más corto
con espacios.
- Reexporta `Decimal`/`Picture`/`Rounding` de `charka-bcd`.
- Construido antes que `charka-codegen` (la nota de orden del plan los
listaba al revés): el codegen emite contra esta API, así que el
runtime debe existir primero — y se verifica solo, sin el codegen.
- 17 tests: campo en cero, `VALUE` inicial, truncado y redondeo,
desbordamiento que conserva bajo orden, magnitud sin signo y signo
con signo, justificación y relleno de texto, `fill`, comparación.
### 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