feat(charka): nivel 88 + modelo de datos compartido en charka-ir

Los nombres de condición de COBOL (IF ES-VALIDO), que antes el
transpilador evaluaba siempre como false. Y, de paso, se elimina la
duplicación de la resolución del modelo de datos.

- charka-ir gana un módulo `model`: resolve_data(&[DataItem]) ->
  DataModel aplana el árbol de datos a campos elementales (Field con
  FieldKind) y a nombres de condición (ConditionName). El Ir lleva
  ahora un campo `model` — la fuente única de verdad sobre la
  clasificación de PICTURE.
- charka-codegen y charka-shadow consumen ir.model en vez de
  reimplementar cada uno la clasificación, el ancho de PICTURE y la
  normalización de VALUE. charka-codegen ya no depende de charka-bcd.
- Cond::Named (un nivel 88) se resuelve a `padre = valor`: el codegen
  emite la comparación, el intérprete sombra la evalúa.
- Corregido: un dato con hijos de nivel 88 antes se perdía como si
  fuera un grupo; ahora se reconoce como campo elemental.
- Corpus: programa nuevo 10-condicion (semáforo con 88 de texto y de
  número). Verificado: intérprete y crate compilado dan igual salida.

Tests: charka-ir 23, charka-codegen 17, charka-shadow 15. fmt +
clippy limpios.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-21 21:50:06 +00:00
parent 4df7478b71
commit 28ee1ae260
17 changed files with 473 additions and 265 deletions
+10 -3
View File
@@ -75,15 +75,22 @@ Tercera etapa: `Program` → `Ir`. Aquí se parsea cada `Sentence` cruda
árbol de instrucciones.
- `lower(&Program) -> Ir`**total y tolerante**, nunca falla.
- `Ir { program_id, data: Vec<DataItem>, procedures: Vec<Procedure> }`.
El modelo de datos pasa tal cual (sirve de tabla de símbolos).
- `Ir { program_id, data, model, procedures }`. `data` es el árbol de
`DataItem` con su estructura de grupos; `model` es el **modelo de
datos resuelto** (módulo `model`): el árbol aplanado a campos
elementales (`Field` con `FieldKind` numérico/alfanumérico y el
`VALUE` normalizado) más los nombres de condición (nivel 88). Es la
fuente única de verdad sobre «qué tipo de campo describe una
PICTURE» — `charka-codegen` y `charka-shadow` lo consumen en vez de
reimplementar la clasificación.
- `Procedure { name, body: Vec<Stmt> }`. `Stmt` cubre `Move`,
`Display`, `Accept`, `Compute`, `Add`/`Subtract`/`Multiply`/`Divide`,
`If`, `Evaluate`, `Perform`, `GoTo`, `StopRun`, `Goback`, `Exit`,
`Continue`.
- `Expr` — expresiones aritméticas con precedencia y paréntesis (Pratt:
`+ -` < `* /` < `**` der.). `Cond` — comparaciones (símbolo o forma
palabra) unidas por `AND`/`OR`/`NOT`, más nombres de condición (88).
palabra) unidas por `AND`/`OR`/`NOT`, más nombres de condición
(nivel 88), que se resuelven contra el `model` a `padre = valor`.
- Un verbo no soportado se conserva como `Stmt::Unknown { verb,
tokens }` — el lowering jamás aborta.
- COBOL no separa statements con un símbolo: cada uno corta donde