feat(charka): charka-shadow — validador en sombra + corpus COBOL
El pipeline COBOL->Rust queda completo (7 crates) y validado de punta a punta. charka-shadow certifica que el transpilador preserva la semántica del COBOL original con una ejecución sombra: un intérprete que corre el Ir directamente sobre charka-runtime, sin compilar nada. Es una segunda ruta de ejecución, independiente del código que emite charka-codegen — si la sombra y el transpilado divergieran, sería un bug. - interpret(&Ir) -> Outcome ejecuta el IR y captura las líneas de DISPLAY; run_source(&str) corre el pipeline completo. - Tope de pasos (Halt::StepLimit): un bucle que no termina se corta en vez de colgarse. - Módulos: field (datos -> campos vivos) / interp (el motor). Corpus nuevo crates/modules/charka/corpus/ — 7 programas COBOL de complejidad graduada (01-hola .. 07-clasificar) con sus salidas esperadas verificadas a mano: DISPLAY, aritmética con GIVING, IF/ELSE, PERFORM TIMES/UNTIL, grupos, COMPUTE con paréntesis, ROUNDED, IF anidado con AND. Material de prueba del pipeline entero. 11 tests (los 7 del corpus + fuente vacío, STOP RUN, tope de pasos, error de léxico); fmt + clippy limpios. No hay GnuCOBOL en la máquina: la referencia v1 es el corpus; un modo futuro diferenciará contra el compilador real. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
* corpus charka — nivel 1: el programa mínimo
|
||||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. HOLA.
|
||||
PROCEDURE DIVISION.
|
||||
MAIN.
|
||||
DISPLAY 'HOLA, MUNDO'.
|
||||
STOP RUN.
|
||||
@@ -0,0 +1 @@
|
||||
HOLA, MUNDO
|
||||
@@ -0,0 +1,19 @@
|
||||
* corpus charka — nivel 2: datos y aritmética con GIVING
|
||||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. ARITMETICA.
|
||||
DATA DIVISION.
|
||||
WORKING-STORAGE SECTION.
|
||||
01 WS-A PIC 9(4) VALUE 120.
|
||||
01 WS-B PIC 9(4) VALUE 35.
|
||||
01 WS-SUMA PIC 9(5).
|
||||
01 WS-RESTA PIC 9(5).
|
||||
01 WS-PROD PIC 9(8).
|
||||
PROCEDURE DIVISION.
|
||||
MAIN.
|
||||
ADD WS-A WS-B GIVING WS-SUMA.
|
||||
SUBTRACT WS-B FROM WS-A GIVING WS-RESTA.
|
||||
MULTIPLY WS-A BY WS-B GIVING WS-PROD.
|
||||
DISPLAY 'SUMA=' WS-SUMA.
|
||||
DISPLAY 'RESTA=' WS-RESTA.
|
||||
DISPLAY 'PRODUCTO=' WS-PROD.
|
||||
STOP RUN.
|
||||
@@ -0,0 +1,3 @@
|
||||
SUMA=00155
|
||||
RESTA=00085
|
||||
PRODUCTO=00004200
|
||||
@@ -0,0 +1,17 @@
|
||||
* corpus charka — nivel 3: condicionales IF / ELSE
|
||||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. CONDICIONAL.
|
||||
DATA DIVISION.
|
||||
WORKING-STORAGE SECTION.
|
||||
01 WS-NOTA PIC 9(3) VALUE 72.
|
||||
PROCEDURE DIVISION.
|
||||
MAIN.
|
||||
IF WS-NOTA >= 60
|
||||
DISPLAY 'APROBADO'
|
||||
ELSE
|
||||
DISPLAY 'REPROBADO'
|
||||
END-IF.
|
||||
IF WS-NOTA > 90
|
||||
DISPLAY 'CON HONORES'
|
||||
END-IF.
|
||||
STOP RUN.
|
||||
@@ -0,0 +1 @@
|
||||
APROBADO
|
||||
@@ -0,0 +1,15 @@
|
||||
* corpus charka — nivel 4: PERFORM n TIMES y un párrafo aparte
|
||||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. BUCLE.
|
||||
DATA DIVISION.
|
||||
WORKING-STORAGE SECTION.
|
||||
01 WS-CONT PIC 9(3) VALUE 0.
|
||||
01 WS-TOTAL PIC 9(5) VALUE 0.
|
||||
PROCEDURE DIVISION.
|
||||
MAIN.
|
||||
PERFORM SUMAR 5 TIMES.
|
||||
DISPLAY 'TOTAL=' WS-TOTAL.
|
||||
STOP RUN.
|
||||
SUMAR.
|
||||
ADD 1 TO WS-CONT.
|
||||
ADD WS-CONT TO WS-TOTAL.
|
||||
@@ -0,0 +1 @@
|
||||
TOTAL=00015
|
||||
@@ -0,0 +1,16 @@
|
||||
* corpus charka — nivel 4: PERFORM UNTIL en línea (factorial)
|
||||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. FACTORIAL.
|
||||
DATA DIVISION.
|
||||
WORKING-STORAGE SECTION.
|
||||
01 WS-N PIC 9(2) VALUE 6.
|
||||
01 WS-I PIC 9(2) VALUE 1.
|
||||
01 WS-FACT PIC 9(8) VALUE 1.
|
||||
PROCEDURE DIVISION.
|
||||
MAIN.
|
||||
PERFORM UNTIL WS-I > WS-N
|
||||
MULTIPLY WS-I BY WS-FACT
|
||||
ADD 1 TO WS-I
|
||||
END-PERFORM.
|
||||
DISPLAY 'FACTORIAL DE 6 = ' WS-FACT.
|
||||
STOP RUN.
|
||||
@@ -0,0 +1 @@
|
||||
FACTORIAL DE 6 = 00000720
|
||||
@@ -0,0 +1,32 @@
|
||||
* corpus charka — nivel 5: grupos, COMPUTE con paréntesis, ROUNDED
|
||||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. NOMINA.
|
||||
DATA DIVISION.
|
||||
WORKING-STORAGE SECTION.
|
||||
01 WS-EMPLEADO.
|
||||
05 WS-NOMBRE PIC X(10) VALUE 'ANA'.
|
||||
05 WS-HORAS PIC 9(3) VALUE 45.
|
||||
05 WS-TARIFA PIC 9(3)V99 VALUE 8.50.
|
||||
01 WS-BRUTO PIC 9(6)V99 VALUE 0.
|
||||
01 WS-EXTRA PIC 9(6)V99 VALUE 0.
|
||||
01 WS-IMPUESTO PIC 9(6)V99 VALUE 0.
|
||||
01 WS-NETO PIC 9(6)V99 VALUE 0.
|
||||
PROCEDURE DIVISION.
|
||||
MAIN-PARA.
|
||||
PERFORM CALCULAR-BRUTO.
|
||||
PERFORM CALCULAR-IMPUESTO.
|
||||
COMPUTE WS-NETO = WS-BRUTO - WS-IMPUESTO.
|
||||
DISPLAY 'EMPLEADO: ' WS-NOMBRE.
|
||||
DISPLAY 'BRUTO: ' WS-BRUTO.
|
||||
DISPLAY 'IMPUESTO: ' WS-IMPUESTO.
|
||||
DISPLAY 'NETO: ' WS-NETO.
|
||||
STOP RUN.
|
||||
CALCULAR-BRUTO.
|
||||
IF WS-HORAS > 40
|
||||
COMPUTE WS-EXTRA = (WS-HORAS - 40) * WS-TARIFA
|
||||
COMPUTE WS-BRUTO = 40 * WS-TARIFA + WS-EXTRA
|
||||
ELSE
|
||||
COMPUTE WS-BRUTO = WS-HORAS * WS-TARIFA
|
||||
END-IF.
|
||||
CALCULAR-IMPUESTO.
|
||||
COMPUTE WS-IMPUESTO ROUNDED = WS-BRUTO * 0.15.
|
||||
@@ -0,0 +1,4 @@
|
||||
EMPLEADO: ANA
|
||||
BRUTO: 00038250
|
||||
IMPUESTO: 00005738
|
||||
NETO: 00032512
|
||||
@@ -0,0 +1,23 @@
|
||||
* corpus charka — nivel 5: IF anidado y condiciones con AND
|
||||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. CLASIFICAR.
|
||||
DATA DIVISION.
|
||||
WORKING-STORAGE SECTION.
|
||||
01 WS-EDAD PIC 9(3) VALUE 0.
|
||||
01 WS-INDICE PIC 9(2) VALUE 1.
|
||||
PROCEDURE DIVISION.
|
||||
MAIN-PARA.
|
||||
PERFORM CLASIFICAR-PARA 4 TIMES.
|
||||
STOP RUN.
|
||||
CLASIFICAR-PARA.
|
||||
COMPUTE WS-EDAD = WS-INDICE * 25.
|
||||
IF WS-EDAD < 18
|
||||
DISPLAY 'MENOR DE EDAD'
|
||||
ELSE
|
||||
IF WS-EDAD >= 18 AND WS-EDAD < 65
|
||||
DISPLAY 'ADULTO'
|
||||
ELSE
|
||||
DISPLAY 'ADULTO MAYOR'
|
||||
END-IF
|
||||
END-IF.
|
||||
ADD 1 TO WS-INDICE.
|
||||
@@ -0,0 +1,4 @@
|
||||
ADULTO
|
||||
ADULTO
|
||||
ADULTO MAYOR
|
||||
ADULTO MAYOR
|
||||
@@ -0,0 +1,32 @@
|
||||
# Corpus COBOL de charka
|
||||
|
||||
Programas COBOL de prueba, de complejidad **graduada**, para ejercitar
|
||||
el pipeline completo del transpilador (lexer → parser → IR → codegen) y
|
||||
el validador en sombra `charka-shadow`.
|
||||
|
||||
Cada programa `NN-nombre.cob` viene con su `NN-nombre.expected`: la
|
||||
salida correcta, una línea por `DISPLAY`.
|
||||
|
||||
| programa | nivel | qué ejercita |
|
||||
| ------------------- | ----- | -------------------------------------------------- |
|
||||
| `01-hola` | 1 | el programa mínimo — un `DISPLAY` de literal |
|
||||
| `02-aritmetica` | 2 | datos, `ADD`/`SUBTRACT`/`MULTIPLY` con `GIVING` |
|
||||
| `03-condicional` | 3 | `IF` / `ELSE` / `END-IF` |
|
||||
| `04-bucle` | 4 | `PERFORM n TIMES`, un párrafo aparte, `ADD` in situ|
|
||||
| `05-factorial` | 4 | `PERFORM UNTIL` en línea, `MULTIPLY` in situ |
|
||||
| `06-nomina` | 5 | grupos, `COMPUTE` con paréntesis, `ROUNDED`, V99 |
|
||||
| `07-clasificar` | 5 | `IF` anidado, condiciones con `AND` |
|
||||
|
||||
## Formato
|
||||
|
||||
Los fuentes están en **formato libre** de COBOL (la línea entera es
|
||||
código; `*` al inicio es comentario). El comparador del validador
|
||||
**ignora los espacios finales** de cada línea — un campo `PIC X(n)` se
|
||||
muestra con su relleno de espacios, que aquí se omite por legibilidad.
|
||||
|
||||
## La salida esperada
|
||||
|
||||
Las `.expected` se derivaron a mano de la semántica de COBOL'85. Cuando
|
||||
GnuCOBOL esté disponible, `charka-shadow` podrá regenerarlas desde el
|
||||
compilador de referencia y diferenciar contra él — el modo «sombra»
|
||||
pleno (original vs transpilado).
|
||||
Reference in New Issue
Block a user