gioser

tawasuyu/brahman

Rust 476TOML 190Markdown 50JSON 176602 Definiciones

⎇ b052c41e3c93a271dfb75b40f0c7b79d1ae9632c docs/changelog/charka.md Markdown · 188 líneas · 9.7 KB Historia crudo

feat(charka): CLI del transpilador — transpile / scaffold / run / check b052c41e3 · sergio ·

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): CLI del transpilador — transpile / scaffold / run / check
7
8App nueva `crates/apps/charka` — el binario `charka`, que vuelve usable
9el pipeline desde la terminal. Cuatro comandos:
10
11- `transpile <in.cob> [-o out.rs]` — emite el código Rust (a un archivo
12  o a la salida estándar).
13- `scaffold <in.cob> -o <dir>` — genera un crate Rust completo
14  (`Cargo.toml` + `src/main.rs`) que depende de `charka-runtime` y
15  compila tal cual.
16- `run <in.cob>` — ejecuta el programa con el intérprete sombra y
17  muestra su salida, sin compilar nada.
18- `check <in.cob> -e <esperado>` — ejecuta y diferencia la salida
19  contra un archivo esperado; reporta las líneas que difieren.
20
21Avisa de los verbos COBOL que aún no se transpilan. Verificado de
22punta a punta contra el corpus: `scaffold` de `06-nomina` genera un
23crate que compila y produce la misma salida que el intérprete sombra —
24las dos rutas de ejecución concuerdan. 4 tests; fmt + clippy limpios.
25
26### feat(charka-shadow): validador en sombra + corpus COBOL
27
28Crate nuevo `crates/modules/charka/charka-shadow` y un corpus de prueba
29`crates/modules/charka/corpus/` — el pipeline COBOL→Rust queda
30completo y validado de punta a punta.
31
32- `charka-shadow` certifica que el transpilador preserva la semántica
33  del COBOL original con una **ejecución sombra**: un intérprete que
34  corre el `Ir` directamente sobre `charka-runtime`, sin compilar nada.
35  Es una segunda ruta de ejecución, independiente del código que emite
36  `charka-codegen`.
37- `interpret(&Ir) -> Outcome` ejecuta el IR y captura las líneas de
38  `DISPLAY`; `run_source(&str)` corre el pipeline completo (lexer →
39  parser → IR → intérprete).
40- Tope de pasos (`Halt::StepLimit`): un bucle que no termina se corta
41  en vez de colgar la ejecución.
42- **Corpus**: 7 programas COBOL de complejidad graduada — `01-hola`
43  (un `DISPLAY`), `02-aritmetica` (`ADD`/`SUBTRACT`/`MULTIPLY`),
44  `03-condicional` (`IF`/`ELSE`), `04-bucle` (`PERFORM TIMES`),
45  `05-factorial` (`PERFORM UNTIL`), `06-nomina` (grupos, `COMPUTE` con
46  paréntesis, `ROUNDED`, `V99`), `07-clasificar` (`IF` anidado, `AND`).
47  Cada uno con su `.expected` verificada a mano.
48- 11 tests: los 7 programas del corpus + fuente vacío, `STOP RUN`,
49  corte por tope de pasos y propagación de error de léxico.
50
51### feat(charka-codegen): emisión de Rust desde el IR
52
53Crate nuevo `crates/modules/charka/charka-codegen` — la etapa final del
54pipeline. `generate(&Ir) -> String` produce un fuente Rust (un
55`main.rs`) que, compilado contra `charka-runtime`, ejecuta la lógica
56del programa COBOL.
57
58- Un `struct Program` con un campo por cada dato elemental — `Num`
59  para los numéricos, `Text` para los alfanuméricos; `Program::new()`
60  los inicializa desde sus cláusulas `VALUE`.
61- Un método `p_<párrafo>(&mut self)` por cada párrafo del PROCEDURE;
62  `run()` los encadena en orden (el «caer» de COBOL); `main()`
63  construye el `Program` y lo corre.
64- Cada `Stmt` → código Rust: `MOVE`→`.store`/`.fill`,
65  `DISPLAY`→`println!`, `COMPUTE` y la aritmética → expresiones
66  `Decimal`, `IF`→`if`/`else`, `PERFORM`→ llamada de método / `for` /
67  `while`, `GO TO`→ llamada + `return`, `STOP RUN`→`process::exit`.
68- Tolerante: lo no transpilable (`Stmt::Unknown`, un dato sin resolver,
69  el operador `**`) se emite como comentario `// charka:`; el código
70  generado siempre compila.
71- Saneado de identificadores COBOL→Rust (incl. choques con keywords).
72- Verificado de punta a punta: un programa COBOL de demostración
73  transpila a Rust que compila contra `charka-runtime` y produce la
74  salida esperada (`COMPUTE`, `IF`, `PERFORM`, `DISPLAY`).
75- 14 tests del fuente emitido; fuera de alcance v1: grupos como campo,
76  `REDEFINES`, `OCCURS`, `PERFORM ... THRU` como rango, E/S.
77
78### feat(charka-runtime): soporte de ejecución — campos Num y Text
79
80Crate nuevo `crates/modules/charka/charka-runtime` — el soporte que los
81programas COBOL transpilados enlazan. `charka-codegen` no emitirá Rust
82autónomo: emitirá Rust que llama a esta biblioteca.
83
84- `Num` — campo numérico (`PIC 9(5)V99`): un `Decimal` conformado a su
85  `Picture`. `store` trunca a la escala declarada; `store_rounded`
86  redondea; al desbordar la parte entera conserva los dígitos de bajo
87  orden (el `ON SIZE ERROR` de COBOL sin cláusula). `display` da los
88  dígitos con relleno de ceros y signo si corresponde.
89- `Text` — campo alfanumérico (`PIC X(n)`) de longitud fija: `store`
90  justifica a la izquierda y rellena con espacios o trunca; `fill`
91  mueve las constantes figurativas (`SPACES`, `ZEROS`).
92- `cobol_text_cmp` — comparación alfanumérica que rellena el más corto
93  con espacios.
94- Reexporta `Decimal`/`Picture`/`Rounding` de `charka-bcd`.
95- Construido antes que `charka-codegen` (la nota de orden del plan los
96  listaba al revés): el codegen emite contra esta API, así que el
97  runtime debe existir primero — y se verifica solo, sin el codegen.
98- 17 tests: campo en cero, `VALUE` inicial, truncado y redondeo,
99  desbordamiento que conserva bajo orden, magnitud sin signo y signo
100  con signo, justificación y relleno de texto, `fill`, comparación.
101
102### feat(charka-ir): representación intermedia — statements tipados
103
104Crate nuevo `crates/modules/charka/charka-ir` — la tercera etapa del
105pipeline: `Program` → `Ir`. El PROCEDURE division pasa de sentencias
106con tokens crudos a un árbol de instrucciones tipadas.
107
108- `lower(&Program) -> Ir` — total y tolerante: nunca falla.
109- `Ir { program_id, data, procedures }`. El modelo de datos (la DATA
110  division) pasa tal cual — sirve de tabla de símbolos.
111- `Stmt` cubre `MOVE`, `DISPLAY`, `ACCEPT`, `COMPUTE`, `ADD`,
112  `SUBTRACT`, `MULTIPLY`, `DIVIDE`, `IF`/`ELSE`/`END-IF`, `PERFORM`
113  (fuera de línea, en línea, `TIMES`, `UNTIL`), `GO TO`, `STOP RUN`,
114  `GOBACK`, `EXIT`, `CONTINUE`.
115- Expresiones de `COMPUTE` con precedencia y paréntesis (`+ -` <
116  `* /` < `**` asociativo a derecha). Condiciones de `IF`/`UNTIL` con
117  comparadores en forma símbolo (`= < > <= >= <>`) o palabra
118  (`EQUAL TO`, `GREATER THAN`...), `AND`/`OR`/`NOT` y nombres de
119  condición (datos de nivel 88).
120- COBOL no termina los statements con un símbolo: el parser delimita
121  las listas de operandos con palabras "frontera" (verbos,
122  terminadores `END-*`/`ELSE`, conectores `TO`/`GIVING`/`BY`...).
123- Un verbo no soportado se conserva como `Stmt::Unknown { verb,
124  tokens }` — el lowering nunca aborta.
125- Fuera de alcance v1: `EVALUATE`, `STRING`/`UNSTRING`, E/S de
126  ficheros, `PERFORM VARYING`, CICS, SQL embebido.
127- 17 tests: MOVE simple y multi-destino, DISPLAY con figurativas,
128  precedencia de COMPUTE, flag ROUNDED, ADD in-place vs GIVING,
129  SUBTRACT, DIVIDE BY/INTO, IF/ELSE, condiciones con AND, nombre de
130  condición, PERFORM párrafo/TIMES/UNTIL en línea, varios statements
131  en una sentencia, verbo desconocido, programa completo.
132
133### feat(charka-parser): parser COBOL'85 → AST
134
135Crate nuevo `crates/modules/charka/charka-parser` — la segunda etapa del
136pipeline: `Vec<Token>` → `Program` (AST). Alcance v1: el esqueleto del
137programa.
138
139- `parse(&[Token]) -> Result<Program, ParseError>`. El AST: `Program`
140  (`program_id`, `data`, `paragraphs`), `DataItem`, `Paragraph`,
141  `Sentence`.
142- Particiona el flujo de tokens en las cuatro divisiones por sus
143  encabezados (`X DIVISION`); de la IDENTIFICATION extrae el
144  `PROGRAM-ID`.
145- **DATA division** → árbol de `DataItem`: número de nivel, nombre,
146  cláusula `PICTURE` reensamblada (`S9` `(` `5` `)` `V99` →
147  `S9(5)V99`) y `VALUE`. Anida por número de nivel — 01 y 77 son
148  raíces, 88 cuelga del ítem precedente.
149- **PROCEDURE division** → `Vec<Paragraph>`, cada párrafo con sus
150  `Sentence` (tokens crudos; sin parseo a nivel de statement, eso es
151  `charka-ir`). Las sentencias previas al primer encabezado van a un
152  párrafo implícito de nombre "".
153- Parser tolerante: salta encabezados de `SECTION`, entradas `FD`/`SD`
154  y cláusulas de datos que no sean `PICTURE`/`VALUE`. `ParseError` sólo
155  ante un número de nivel inválido o un dato sin nombre.
156- 15 tests: PROGRAM-ID (forma larga y `ID` corta), ítems planos y
157  anidados, reensamblado de PICTURE, variantes de VALUE, niveles 88,
158  `FILLER`, párrafos y párrafo implícito, encabezado de sección,
159  programa completo de punta a punta, nivel inválido.
160
161### feat(charka-lexer): tokenizador de COBOL
162
163Crate nuevo `crates/modules/charka/charka-lexer` — la primera etapa del
164pipeline del transpilador: texto COBOL → secuencia de `Token`.
165
166- **Lexer deliberadamente tonto**: no conoce keywords ni la cláusula
167  `PICTURE`; emite `Word` para todo identificador y deja la
168  clasificación al parser.
169- Tokens: `Word` (palabras COBOL con guiones internos), `Number`
170  (literal sin signo), `String` (comillas dobladas colapsadas),
171  `Period` (el `.` terminador), `Symbol` (paréntesis, separadores y
172  operadores `+ - * / ** = < > <= >= <>`).
173- Dos formatos de fuente: **fijo** (la tarjeta de 80 columnas — cols
174  1-6 secuencia, 7 indicadora, 8-72 código, 73-80 identificación) y
175  **libre**. Comentarios por la columna indicadora (`*`/`/`) o por `*`
176  inicial en formato libre.
177- Cada `Token` lleva línea y columna 1-based; `LexError` tipado
178  (literal sin cerrar, carácter inesperado).
179- Limitación v1 documentada: no soporta continuación de literales entre
180  líneas (indicador `-`). Subconjunto COBOL'85, el hito intermedio.
181- 17 tests: sentencias, palabras con guiones, literales y comillas
182  dobladas, números vs terminador, operadores, ambos formatos,
183  tracking de posición, errores.
184
185### feat(charka-bcd): aritmética decimal con semántica COBOL
186
187(Pre-existente.) `Picture` + `Decimal` de punto fijo exacto — ver el
188SDD 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): CLI del transpilador — transpile / scaffold / run / check

App nueva crates/apps/charka — el binario charka, que vuelve usable el pipeline desde la terminal. Cuatro comandos:

Avisa de los verbos COBOL que aún no se transpilan. Verificado de punta a punta contra el corpus: scaffold de 06-nomina genera un crate que compila y produce la misma salida que el intérprete sombra — las dos rutas de ejecución concuerdan. 4 tests; fmt + clippy limpios.

feat(charka-shadow): validador en sombra + corpus COBOL

Crate nuevo crates/modules/charka/charka-shadow y un corpus de prueba crates/modules/charka/corpus/ — el pipeline COBOL→Rust queda completo y validado de punta a punta.

feat(charka-codegen): emisión de Rust desde el IR

Crate nuevo crates/modules/charka/charka-codegen — la etapa final del pipeline. generate(&Ir) -> String produce un fuente Rust (un main.rs) que, compilado contra charka-runtime, ejecuta la lógica del programa COBOL.

feat(charka-runtime): soporte de ejecución — campos Num y Text

Crate nuevo crates/modules/charka/charka-runtime — el soporte que los programas COBOL transpilados enlazan. charka-codegen no emitirá Rust autónomo: emitirá Rust que llama a esta biblioteca.

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.

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.

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.

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.