feat(charka): charka-ir — representación intermedia con statements tipados

Tercera etapa del transpilador: 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. La DATA
  division pasa tal cual y 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 (Pratt).
  Condiciones con comparadores símbolo/palabra, AND/OR/NOT y nombres
  de condición (nivel 88).
- Delimita statements por palabras frontera (COBOL no los separa con
  un símbolo). Verbo no soportado -> Stmt::Unknown con tokens crudos.
- Módulos: ast / kw / cursor / expr / stmt. 17 tests; fmt + clippy
  limpios.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-21 20:23:19 +00:00
parent b95383b01a
commit 71a4068d12
11 changed files with 1462 additions and 4 deletions
+31
View File
@@ -3,6 +3,37 @@
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-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