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-ir): representación intermedia — statements tipados
7
8Crate nuevo `crates/modules/charka/charka-ir` — la tercera etapa del
9pipeline: `Program` → `Ir`. El PROCEDURE division pasa de sentencias
10con tokens crudos a un árbol de instrucciones tipadas.
11
12- `lower(&Program) -> Ir` — total y tolerante: nunca falla.
13- `Ir { program_id, data, procedures }`. El modelo de datos (la DATA
14 division) pasa tal cual — sirve de tabla de símbolos.
15- `Stmt` cubre `MOVE`, `DISPLAY`, `ACCEPT`, `COMPUTE`, `ADD`,
16 `SUBTRACT`, `MULTIPLY`, `DIVIDE`, `IF`/`ELSE`/`END-IF`, `PERFORM`
17 (fuera de línea, en línea, `TIMES`, `UNTIL`), `GO TO`, `STOP RUN`,
18 `GOBACK`, `EXIT`, `CONTINUE`.
19- Expresiones de `COMPUTE` con precedencia y paréntesis (`+ -` <
20 `* /` < `**` asociativo a derecha). Condiciones de `IF`/`UNTIL` con
21 comparadores en forma símbolo (`= < > <= >= <>`) o palabra
22 (`EQUAL TO`, `GREATER THAN`...), `AND`/`OR`/`NOT` y nombres de
23 condición (datos de nivel 88).
24- COBOL no termina los statements con un símbolo: el parser delimita
25 las listas de operandos con palabras "frontera" (verbos,
26 terminadores `END-*`/`ELSE`, conectores `TO`/`GIVING`/`BY`...).
27- Un verbo no soportado se conserva como `Stmt::Unknown { verb,
28 tokens }` — el lowering nunca aborta.
29- Fuera de alcance v1: `EVALUATE`, `STRING`/`UNSTRING`, E/S de
30 ficheros, `PERFORM VARYING`, CICS, SQL embebido.
31- 17 tests: MOVE simple y multi-destino, DISPLAY con figurativas,
32 precedencia de COMPUTE, flag ROUNDED, ADD in-place vs GIVING,
33 SUBTRACT, DIVIDE BY/INTO, IF/ELSE, condiciones con AND, nombre de
34 condición, PERFORM párrafo/TIMES/UNTIL en línea, varios statements
35 en una sentencia, verbo desconocido, programa completo.
36
37### feat(charka-parser): parser COBOL'85 → AST
38
39Crate nuevo `crates/modules/charka/charka-parser` — la segunda etapa del
40pipeline: `Vec<Token>` → `Program` (AST). Alcance v1: el esqueleto del
41programa.
42
43- `parse(&[Token]) -> Result<Program, ParseError>`. El AST: `Program`
44 (`program_id`, `data`, `paragraphs`), `DataItem`, `Paragraph`,
45 `Sentence`.
46- Particiona el flujo de tokens en las cuatro divisiones por sus
47 encabezados (`X DIVISION`); de la IDENTIFICATION extrae el
48 `PROGRAM-ID`.
49- **DATA division** → árbol de `DataItem`: número de nivel, nombre,
50 cláusula `PICTURE` reensamblada (`S9` `(` `5` `)` `V99` →
51 `S9(5)V99`) y `VALUE`. Anida por número de nivel — 01 y 77 son
52 raíces, 88 cuelga del ítem precedente.
53- **PROCEDURE division** → `Vec<Paragraph>`, cada párrafo con sus
54 `Sentence` (tokens crudos; sin parseo a nivel de statement, eso es
55 `charka-ir`). Las sentencias previas al primer encabezado van a un
56 párrafo implícito de nombre "".
57- Parser tolerante: salta encabezados de `SECTION`, entradas `FD`/`SD`
58 y cláusulas de datos que no sean `PICTURE`/`VALUE`. `ParseError` sólo
59 ante un número de nivel inválido o un dato sin nombre.
60- 15 tests: PROGRAM-ID (forma larga y `ID` corta), ítems planos y
61 anidados, reensamblado de PICTURE, variantes de VALUE, niveles 88,
62 `FILLER`, párrafos y párrafo implícito, encabezado de sección,
63 programa completo de punta a punta, nivel inválido.
64
65### feat(charka-lexer): tokenizador de COBOL
66
67Crate nuevo `crates/modules/charka/charka-lexer` — la primera etapa del
68pipeline del transpilador: texto COBOL → secuencia de `Token`.
69
70- **Lexer deliberadamente tonto**: no conoce keywords ni la cláusula
71 `PICTURE`; emite `Word` para todo identificador y deja la
72 clasificación al parser.
73- Tokens: `Word` (palabras COBOL con guiones internos), `Number`
74 (literal sin signo), `String` (comillas dobladas colapsadas),
75 `Period` (el `.` terminador), `Symbol` (paréntesis, separadores y
76 operadores `+ - * / ** = < > <= >= <>`).
77- Dos formatos de fuente: **fijo** (la tarjeta de 80 columnas — cols
78 1-6 secuencia, 7 indicadora, 8-72 código, 73-80 identificación) y
79 **libre**. Comentarios por la columna indicadora (`*`/`/`) o por `*`
80 inicial en formato libre.
81- Cada `Token` lleva línea y columna 1-based; `LexError` tipado
82 (literal sin cerrar, carácter inesperado).
83- Limitación v1 documentada: no soporta continuación de literales entre
84 líneas (indicador `-`). Subconjunto COBOL'85, el hito intermedio.
85- 17 tests: sentencias, palabras con guiones, literales y comillas
86 dobladas, números vs terminador, operadores, ambos formatos,
87 tracking de posición, errores.
88
89### feat(charka-bcd): aritmética decimal con semántica COBOL
90
91(Pre-existente.) `Picture` + `Decimal` de punto fijo exacto — ver el
92SDD 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-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
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.