feat(charka): charka-shadow — validador en sombra + corpus COBOL

El pipeline COBOL->Rust queda completo (7 crates) y validado de punta
a punta.

charka-shadow certifica que el transpilador preserva la semántica del
COBOL original con una ejecución sombra: un intérprete que corre el Ir
directamente sobre charka-runtime, sin compilar nada. Es una segunda
ruta de ejecución, independiente del código que emite charka-codegen
— si la sombra y el transpilado divergieran, sería un bug.

- interpret(&Ir) -> Outcome ejecuta el IR y captura las líneas de
  DISPLAY; run_source(&str) corre el pipeline completo.
- Tope de pasos (Halt::StepLimit): un bucle que no termina se corta
  en vez de colgarse.
- Módulos: field (datos -> campos vivos) / interp (el motor).

Corpus nuevo crates/modules/charka/corpus/ — 7 programas COBOL de
complejidad graduada (01-hola .. 07-clasificar) con sus salidas
esperadas verificadas a mano: DISPLAY, aritmética con GIVING,
IF/ELSE, PERFORM TIMES/UNTIL, grupos, COMPUTE con paréntesis,
ROUNDED, IF anidado con AND. Material de prueba del pipeline entero.

11 tests (los 7 del corpus + fuente vacío, STOP RUN, tope de pasos,
error de léxico); fmt + clippy limpios.

No hay GnuCOBOL en la máquina: la referencia v1 es el corpus; un modo
futuro diferenciará contra el compilador real.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-21 21:23:07 +00:00
parent e52b3fb572
commit 4d9ce11b1e
23 changed files with 1039 additions and 9 deletions
+32
View File
@@ -0,0 +1,32 @@
# Corpus COBOL de charka
Programas COBOL de prueba, de complejidad **graduada**, para ejercitar
el pipeline completo del transpilador (lexer → parser → IR → codegen) y
el validador en sombra `charka-shadow`.
Cada programa `NN-nombre.cob` viene con su `NN-nombre.expected`: la
salida correcta, una línea por `DISPLAY`.
| programa | nivel | qué ejercita |
| ------------------- | ----- | -------------------------------------------------- |
| `01-hola` | 1 | el programa mínimo — un `DISPLAY` de literal |
| `02-aritmetica` | 2 | datos, `ADD`/`SUBTRACT`/`MULTIPLY` con `GIVING` |
| `03-condicional` | 3 | `IF` / `ELSE` / `END-IF` |
| `04-bucle` | 4 | `PERFORM n TIMES`, un párrafo aparte, `ADD` in situ|
| `05-factorial` | 4 | `PERFORM UNTIL` en línea, `MULTIPLY` in situ |
| `06-nomina` | 5 | grupos, `COMPUTE` con paréntesis, `ROUNDED`, V99 |
| `07-clasificar` | 5 | `IF` anidado, condiciones con `AND` |
## Formato
Los fuentes están en **formato libre** de COBOL (la línea entera es
código; `*` al inicio es comentario). El comparador del validador
**ignora los espacios finales** de cada línea — un campo `PIC X(n)` se
muestra con su relleno de espacios, que aquí se omite por legibilidad.
## La salida esperada
Las `.expected` se derivaron a mano de la semántica de COBOL'85. Cuando
GnuCOBOL esté disponible, `charka-shadow` podrá regenerarlas desde el
compilador de referencia y diferenciar contra él — el modo «sombra»
pleno (original vs transpilado).