feat(charka): charka-parser — COBOL'85 (subconjunto) a AST

Segunda etapa del transpilador: Vec<Token> -> Program. Alcance v1 = el
esqueleto del programa.

- parse(&[Token]) -> Result<Program, ParseError>. AST: Program
  (program_id, data, paragraphs), DataItem, Paragraph, Sentence.
- Particiona el flujo en las 4 divisions por sus encabezados; extrae el
  PROGRAM-ID de la IDENTIFICATION.
- DATA division -> árbol de DataItem: nivel, nombre, PICTURE
  reensamblado (S9 ( 5 ) V99 -> S9(5)V99) y VALUE. Anida por número de
  nivel (01/77 raíces, 88 cuelga del precedente).
- PROCEDURE division -> Vec<Paragraph> con Sentence de tokens crudos
  (sin parseo de statement). Sentencias previas al primer encabezado
  van a un párrafo implícito "".
- Tolerante: salta SECTION, FD/SD y cláusulas que no sean PIC/VALUE.
- 15 tests verdes; fmt + clippy limpios.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-21 20:04:00 +00:00
parent ab56b35e9f
commit d3cdbb2d2d
7 changed files with 773 additions and 7 deletions
+28
View File
@@ -3,6 +3,34 @@
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-parser): parser COBOL'85 → AST
Crate nuevo `crates/modules/charka/charka-parser` — la segunda etapa del
pipeline: `Vec<Token>``Program` (AST). Alcance v1: el esqueleto del
programa.
- `parse(&[Token]) -> Result<Program, ParseError>`. El AST: `Program`
(`program_id`, `data`, `paragraphs`), `DataItem`, `Paragraph`,
`Sentence`.
- Particiona el flujo de tokens en las cuatro divisiones por sus
encabezados (`X DIVISION`); de la IDENTIFICATION extrae el
`PROGRAM-ID`.
- **DATA division** → árbol de `DataItem`: número de nivel, nombre,
cláusula `PICTURE` reensamblada (`S9` `(` `5` `)` `V99`
`S9(5)V99`) y `VALUE`. Anida por número de nivel — 01 y 77 son
raíces, 88 cuelga del ítem precedente.
- **PROCEDURE division** → `Vec<Paragraph>`, cada párrafo con sus
`Sentence` (tokens crudos; sin parseo a nivel de statement, eso es
`charka-ir`). Las sentencias previas al primer encabezado van a un
párrafo implícito de nombre "".
- Parser tolerante: salta encabezados de `SECTION`, entradas `FD`/`SD`
y cláusulas de datos que no sean `PICTURE`/`VALUE`. `ParseError` sólo
ante un número de nivel inválido o un dato sin nombre.
- 15 tests: PROGRAM-ID (forma larga y `ID` corta), ítems planos y
anidados, reensamblado de PICTURE, variantes de VALUE, niveles 88,
`FILLER`, párrafos y párrafo implícito, encabezado de sección,
programa completo de punta a punta, nivel inválido.
### feat(charka-lexer): tokenizador de COBOL
Crate nuevo `crates/modules/charka/charka-lexer` — la primera etapa del