gioser

tawasuyu/brahman

Rust 476TOML 190Markdown 50JSON 176602 Definitions

⎇ 85156c15090f0ae5116737b7c07cddae23cbf7f3 docs/changelog/charka.md Markdown · 116 lines · 6.0 KB History raw

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