feat(charka): E/S de ficheros — SELECT/FD/OPEN/READ/WRITE/CLOSE

El gran hueco que faltaba para el COBOL real: el procesamiento de
ficheros secuenciales. Una rebanada vertical por los seis crates.

- charka-parser: la ENVIRONMENT division ya no se ignora — se parsea
  FILE-CONTROL (SELECT name ASSIGN TO "ruta"); del FILE SECTION se
  asocia cada FD con su registro 01. Program::files.
- charka-runtime: tipo CobFile — un fichero «line sequential» (cada
  registro una línea). Lectura: carga a memoria. Escritura: acumula y
  vuelca al cerrar.
- charka-ir: Ir::files y los statements Open/Close/Read/Write. READ
  lleva sus bloques AT END / NOT AT END.
- charka-codegen: un campo CobFile por fichero en el struct Program;
  los verbos emiten llamadas al runtime.
- charka-shadow: el intérprete hace E/S de ficheros real.
- Corpus: programa nuevo 18-fichero — escribe tres líneas, las relee
  con READ ... AT END y las muestra. Verificado: el intérprete sombra
  y el crate compilado por scaffold dan la misma salida.

Alcance v1: organización line sequential; sin ficheros indexados ni
relativos, sin FILE STATUS.

Tests: charka-parser 17, charka-runtime 19, charka-ir 30,
charka-codegen 25, charka-shadow 23. fmt + clippy limpios.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-21 22:47:26 +00:00
parent f250fd0765
commit b3278bdb0c
17 changed files with 663 additions and 22 deletions
+13 -5
View File
@@ -111,7 +111,9 @@ Tercera etapa: `Program` → `Ir`. Aquí se parsea cada `Sentence` cruda
miembros (`DataModel::groups`).
- `SET cond... TO TRUE` — la cara de escritura de los nombres de
condición (nivel 88): asigna a su dato padre el valor del 88.
- Fuera de alcance v1: E/S de ficheros, CICS, SQL embebido.
- E/S de ficheros: `Stmt::Open`/`Close`/`Read`/`Write` y `Ir::files`
(de `SELECT` + `FD`). Sólo organización «line sequential».
- Fuera de alcance v1: CICS, SQL embebido.
## charka-runtime
@@ -128,6 +130,9 @@ COBOL en tiempo de ejecución.
justifica a la izquierda y rellena/trunca; `fill` mueve figurativas
(`SPACES`, `ZEROS`).
- `cobol_text_cmp` — comparación alfanumérica con relleno de espacios.
- `CobFile` — un fichero «line sequential»: `open_input` carga las
líneas a memoria, `open_output` acumula, `read`/`write` operan línea
a línea, `close` vuelca a disco lo escrito.
- Reexporta `Decimal`/`Picture`/`Rounding` de `charka-bcd` para que el
código generado sólo necesite `use charka_runtime::*;`.
@@ -158,8 +163,10 @@ del programa COBOL.
- Verificado de punta a punta: un programa COBOL de demostración
transpila a Rust que compila contra `charka-runtime` y produce la
salida correcta.
- E/S de ficheros «line sequential»: un campo `CobFile` por fichero;
`OPEN`/`CLOSE`/`READ`/`WRITE` emiten llamadas a `charka-runtime`.
- Fuera de alcance v1: grupos como campo propio, `REDEFINES`,
`OCCURS` de grupo, E/S de ficheros.
`OCCURS` de grupo.
## charka-shadow
@@ -182,8 +189,8 @@ que corre el `Ir` directamente sobre `charka-runtime`, sin compilar.
## El corpus
`crates/modules/charka/corpus/` — 17 programas COBOL graduados
(`01-hola` … `17-rangopar`), cada uno con su `.expected`. Ejercita el
`crates/modules/charka/corpus/` — 18 programas COBOL graduados
(`01-hola` … `18-fichero`), cada uno con su `.expected`. Ejercita el
pipeline completo de punta a punta. Ver su `README.md`.
## La CLI
@@ -206,4 +213,5 @@ concuerdan.
Próximo hito mayor: salir del subconjunto COBOL'85 puro hacia CICS,
SQL embebido y los dialectos IBM Enterprise; ampliar el codegen
(grupos como campo, `REDEFINES`, `OCCURS` de grupo, E/S de ficheros).
(grupos como campo, `REDEFINES`, `OCCURS` de grupo, ficheros
indexados, `CALL` a subprogramas).