feat(charka): OCCURS — tablas y referencias con subíndice
Los arrays de COBOL, que antes el transpilador descartaba en silencio.
Una rebanada vertical amplia que atraviesa el pipeline entero.
- Parser: la cláusula OCCURS n [TIMES] se captura en DataItem.
- IR: Operand::Indexed { name, index } — una referencia ELEM(I), con
subíndice 1-based. Los destinos de los statements pasan de
Vec<String> a Vec<Operand>, así que se puede escribir a un elemento
de tabla (MOVE x TO ELEM(I), COMPUTE ELEM(I) = ...). model::Field
gana occurs: Option<u32>.
- Codegen: un campo OCCURS se emite como Vec<Num>/Vec<Text>,
inicializado con vec![..; n]; una referencia con subíndice indexa el
vector (1-based -> 0-based).
- Shadow: en el intérprete todo campo es un vector — un escalar es de
longitud 1, una tabla de n; las referencias se resuelven a
(nombre, índice).
- Corpus: programa nuevo 11-tabla (llena una tabla con cuadrados y los
suma). Verificado: el intérprete sombra y el crate compilado por
scaffold dan ambos SUMA DE CUADRADOS = 000055.
Alcance v1: OCCURS elemental, una dimensión, subíndice de un operando.
Fuera: OCCURS de grupo, multidimensional, DEPENDING ON.
Tests: charka-parser 16, charka-ir 24, charka-codegen 18,
charka-shadow 16. fmt + clippy limpios.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
* corpus charka — nivel 6: tablas (OCCURS) y subíndices
|
||||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. TABLAS.
|
||||
DATA DIVISION.
|
||||
WORKING-STORAGE SECTION.
|
||||
01 WS-TABLA.
|
||||
05 WS-ELEM PIC 9(4) OCCURS 5 TIMES.
|
||||
01 WS-I PIC 9(2) VALUE 0.
|
||||
01 WS-TOTAL PIC 9(6) VALUE 0.
|
||||
PROCEDURE DIVISION.
|
||||
MAIN.
|
||||
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 5
|
||||
COMPUTE WS-ELEM(WS-I) = WS-I * WS-I
|
||||
END-PERFORM.
|
||||
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 5
|
||||
ADD WS-ELEM(WS-I) TO WS-TOTAL
|
||||
DISPLAY 'ELEM ' WS-I ' = ' WS-ELEM(WS-I)
|
||||
END-PERFORM.
|
||||
DISPLAY 'SUMA DE CUADRADOS = ' WS-TOTAL.
|
||||
STOP RUN.
|
||||
@@ -0,0 +1,6 @@
|
||||
ELEM 01 = 0001
|
||||
ELEM 02 = 0004
|
||||
ELEM 03 = 0009
|
||||
ELEM 04 = 0016
|
||||
ELEM 05 = 0025
|
||||
SUMA DE CUADRADOS = 000055
|
||||
@@ -19,6 +19,7 @@ salida correcta, una línea por `DISPLAY`.
|
||||
| `08-varying` | 4 | `PERFORM VARYING` — el bucle con variable de control|
|
||||
| `09-evaluar` | 5 | `EVALUATE` — el `case` de COBOL, `WHEN` / `OTHER` |
|
||||
| `10-condicion` | 5 | nombres de condición (nivel 88) en `IF` |
|
||||
| `11-tabla` | 6 | tablas (`OCCURS`) y referencias con subíndice |
|
||||
|
||||
## Formato
|
||||
|
||||
|
||||
Reference in New Issue
Block a user