d3cdbb2d2d
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>
62 lines
3.0 KiB
Markdown
62 lines
3.0 KiB
Markdown
# Changelog — charka
|
|
|
|
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
|
|
pipeline del transpilador: texto COBOL → secuencia de `Token`.
|
|
|
|
- **Lexer deliberadamente tonto**: no conoce keywords ni la cláusula
|
|
`PICTURE`; emite `Word` para todo identificador y deja la
|
|
clasificación al parser.
|
|
- Tokens: `Word` (palabras COBOL con guiones internos), `Number`
|
|
(literal sin signo), `String` (comillas dobladas colapsadas),
|
|
`Period` (el `.` terminador), `Symbol` (paréntesis, separadores y
|
|
operadores `+ - * / ** = < > <= >= <>`).
|
|
- Dos formatos de fuente: **fijo** (la tarjeta de 80 columnas — cols
|
|
1-6 secuencia, 7 indicadora, 8-72 código, 73-80 identificación) y
|
|
**libre**. Comentarios por la columna indicadora (`*`/`/`) o por `*`
|
|
inicial en formato libre.
|
|
- Cada `Token` lleva línea y columna 1-based; `LexError` tipado
|
|
(literal sin cerrar, carácter inesperado).
|
|
- Limitación v1 documentada: no soporta continuación de literales entre
|
|
líneas (indicador `-`). Subconjunto COBOL'85, el hito intermedio.
|
|
- 17 tests: sentencias, palabras con guiones, literales y comillas
|
|
dobladas, números vs terminador, operadores, ambos formatos,
|
|
tracking de posición, errores.
|
|
|
|
### feat(charka-bcd): aritmética decimal con semántica COBOL
|
|
|
|
(Pre-existente.) `Picture` + `Decimal` de punto fijo exacto — ver el
|
|
SDD del módulo. 22 tests.
|