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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user