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>
3.0 KiB
3.0 KiB
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 elPROGRAM-ID. - DATA division → árbol de
DataItem: número de nivel, nombre, cláusulaPICTUREreensamblada (S9(5)V99→S9(5)V99) yVALUE. 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 susSentence(tokens crudos; sin parseo a nivel de statement, eso escharka-ir). Las sentencias previas al primer encabezado van a un párrafo implícito de nombre "". - Parser tolerante: salta encabezados de
SECTION, entradasFD/SDy cláusulas de datos que no seanPICTURE/VALUE.ParseErrorsólo ante un número de nivel inválido o un dato sin nombre. - 15 tests: PROGRAM-ID (forma larga y
IDcorta), í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; emiteWordpara 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
Tokenlleva línea y columna 1-based;LexErrortipado (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.