1# Changelog — charka
2
3Transpilador COBOL → Rust. El módulo más grande del ecosistema (Fase D
4del plan macro) — el parser COBOL completo es un esfuerzo multi-mes.
5
6### feat(charka-parser): parser COBOL'85 → AST
7
8Crate nuevo `crates/modules/charka/charka-parser` — la segunda etapa del
9pipeline: `Vec<Token>` → `Program` (AST). Alcance v1: el esqueleto del
10programa.
11
12- `parse(&[Token]) -> Result<Program, ParseError>`. El AST: `Program`
13 (`program_id`, `data`, `paragraphs`), `DataItem`, `Paragraph`,
14 `Sentence`.
15- Particiona el flujo de tokens en las cuatro divisiones por sus
16 encabezados (`X DIVISION`); de la IDENTIFICATION extrae el
17 `PROGRAM-ID`.
18- **DATA division** → árbol de `DataItem`: número de nivel, nombre,
19 cláusula `PICTURE` reensamblada (`S9` `(` `5` `)` `V99` →
20 `S9(5)V99`) y `VALUE`. Anida por número de nivel — 01 y 77 son
21 raíces, 88 cuelga del ítem precedente.
22- **PROCEDURE division** → `Vec<Paragraph>`, cada párrafo con sus
23 `Sentence` (tokens crudos; sin parseo a nivel de statement, eso es
24 `charka-ir`). Las sentencias previas al primer encabezado van a un
25 párrafo implícito de nombre "".
26- Parser tolerante: salta encabezados de `SECTION`, entradas `FD`/`SD`
27 y cláusulas de datos que no sean `PICTURE`/`VALUE`. `ParseError` sólo
28 ante un número de nivel inválido o un dato sin nombre.
29- 15 tests: PROGRAM-ID (forma larga y `ID` corta), ítems planos y
30 anidados, reensamblado de PICTURE, variantes de VALUE, niveles 88,
31 `FILLER`, párrafos y párrafo implícito, encabezado de sección,
32 programa completo de punta a punta, nivel inválido.
33
34### feat(charka-lexer): tokenizador de COBOL
35
36Crate nuevo `crates/modules/charka/charka-lexer` — la primera etapa del
37pipeline del transpilador: texto COBOL → secuencia de `Token`.
38
39- **Lexer deliberadamente tonto**: no conoce keywords ni la cláusula
40 `PICTURE`; emite `Word` para todo identificador y deja la
41 clasificación al parser.
42- Tokens: `Word` (palabras COBOL con guiones internos), `Number`
43 (literal sin signo), `String` (comillas dobladas colapsadas),
44 `Period` (el `.` terminador), `Symbol` (paréntesis, separadores y
45 operadores `+ - * / ** = < > <= >= <>`).
46- Dos formatos de fuente: **fijo** (la tarjeta de 80 columnas — cols
47 1-6 secuencia, 7 indicadora, 8-72 código, 73-80 identificación) y
48 **libre**. Comentarios por la columna indicadora (`*`/`/`) o por `*`
49 inicial en formato libre.
50- Cada `Token` lleva línea y columna 1-based; `LexError` tipado
51 (literal sin cerrar, carácter inesperado).
52- Limitación v1 documentada: no soporta continuación de literales entre
53 líneas (indicador `-`). Subconjunto COBOL'85, el hito intermedio.
54- 17 tests: sentencias, palabras con guiones, literales y comillas
55 dobladas, números vs terminador, operadores, ambos formatos,
56 tracking de posición, errores.
57
58### feat(charka-bcd): aritmética decimal con semántica COBOL
59
60(Pre-existente.) `Picture` + `Decimal` de punto fijo exacto — ver el
61SDD del módulo. 22 tests.
charka.md
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.