feat(charka): STRING y UNSTRING — manejo de cadenas

Dos verbos comunes de COBOL para construir y partir cadenas.

- IR: Stmt::StringConcat { sources, into } y
  Stmt::Unstring { source, delimiter, into }.
- Parser: STRING a b DELIMITED BY SIZE INTO t END-STRING y
  UNSTRING s DELIMITED BY d INTO a b c END-UNSTRING.
- Codegen: STRING -> format! concatenado; UNSTRING -> un bloque que
  parte con str::split y reparte los trozos a los destinos.
- Shadow: el intérprete concatena / parte el texto y lo reparte.
- Corpus: programa nuevo 12-cadenas. Verificado: el intérprete sombra
  y el crate compilado por scaffold dan la misma salida.

Alcance v1: STRING con DELIMITED BY SIZE (otros delimitadores se
ignoran); sin WITH POINTER ni ON OVERFLOW.

Tests: charka-ir 25, charka-codegen 19, charka-shadow 17. fmt +
clippy limpios.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-21 22:09:10 +00:00
parent 3902763daa
commit 47c49acd47
12 changed files with 269 additions and 10 deletions
@@ -0,0 +1,25 @@
* corpus charka nivel 6: STRING y UNSTRING
IDENTIFICATION DIVISION.
PROGRAM-ID. CADENAS.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NOMBRE PIC X(3) VALUE 'ANA'.
01 WS-APELLIDO PIC X(5) VALUE 'PEREZ'.
01 WS-COMPLETO PIC X(20).
01 WS-CSV PIC X(15) VALUE 'ROJO,VERDE,AZUL'.
01 WS-C1 PIC X(8).
01 WS-C2 PIC X(8).
01 WS-C3 PIC X(8).
PROCEDURE DIVISION.
MAIN.
STRING WS-NOMBRE DELIMITED BY SIZE
WS-APELLIDO DELIMITED BY SIZE
INTO WS-COMPLETO
END-STRING.
DISPLAY 'COMPLETO=' WS-COMPLETO.
UNSTRING WS-CSV DELIMITED BY ',' INTO WS-C1 WS-C2 WS-C3
END-UNSTRING.
DISPLAY 'C1=' WS-C1.
DISPLAY 'C2=' WS-C2.
DISPLAY 'C3=' WS-C3.
STOP RUN.
@@ -0,0 +1,4 @@
COMPLETO=ANAPEREZ
C1=ROJO
C2=VERDE
C3=AZUL
+1
View File
@@ -20,6 +20,7 @@ salida correcta, una línea por `DISPLAY`.
| `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 |
| `12-cadenas` | 6 | `STRING` (concatenar) y `UNSTRING` (partir) |
## Formato