Ver Mensaje Individual
  #7
Antiguo 31 de agosto de 2026, 15:40
Eslopes
Creador de
PowerRustCOBOL
Guru de los Gurus: Por solidos y amplios conocimientos - Issue reason: Por ámplios conocimientos en la materia Concurso: Tercer puesto: Ganador/a del Tercer puesto en un concurso - Issue reason: Juego  Innovación: Por aportar innovaciones - Issue reason: Por aportar soluciones innovadoras 
Última Actividad 27.10.2026 07:38
Posts Posts: 396
Likes enviados Enviados: 31
Likes recibidos Recibidos: 172

• Corregido — una constante figurativa toma el tamaño de aquello contra lo que se escribe
- VALUE ALL "literal" rellena su elemento: PICTURE X(6) VALUE ALL "ABC" es "ABCABC". Todas las demás constantes figurativas son de un solo carácter y las ramas anteriores del código rellenaban con él; ALL es la única cuya unidad puede ser más ancha que un byte, así que caía en el valor por defecto del elemento y este quedaba lleno de espacios (NC211A FIG-TEST-1/2). ALL delante de otra figurativa nunca llega a esa ruta: el parser pliega ALL SPACES a SPACES.
- Una constante figurativa en una relación se repite hasta el tamaño del otro operando: IF QT = QUOTE con QT PICTURE XXX compara """ contra """. Con un solo carácter se comparaba contra " rellenado a la derecha con espacios, que no es igual. SPACE y ZERO nunca mostraron el defecto — el relleno que ya recibe un operando corto produce justo lo que SPACE repetiría, y ZERO se compara algebraicamente —, así que QUOTE, HIGH-VALUE y LOW-VALUE lo cargaban en solitario (NC211A FIG-TEST-3).

• Corregido — HIGH-VALUE es un byte, no un carácter
HIGH-VALUE es 0xFF, que no es UTF-8 válido y no tiene grafía de un byte de ancho. Toda ruta que llevara un registro a través de un String de Rust lo sustituía por un U+FFFD de tres bytes y desplazaba dos posiciones cada campo posterior. El elemento seguía leyéndose como "algún valor alto", de modo que solo lo delataba un campo situado más adelante en el registro.
- CobolEnvironment gana group_bytes, display_bytes, set_group_bytes y set_bytes; set_group delega ahora en la forma de bytes, de modo que el corte y el relleno que hace un movimiento de grupo ocurren sobre bytes en todo el trayecto. MOVE <group> TO <group> toma los bytes almacenados del emisor. STRING ensambla su resultado como bytes, compara los delimitadores byte a byte y almacena a través del nuevo store_bytes (NC217A STR-TEST-GF-9). No cubierto: la modificación por referencia (X (1:1)) sigue leyendo la forma de texto; es el siguiente miembro de esta familia.

• Corregido — JUSTIFIED RIGHT sobre un elemento alfabético
La cláusula solo se registraba para PicKind::Alphanumeric, así que PICTURE A(5) JUSTIFIED RIGHT se analizaba, se olvidaba, y cada MOVE hacia el elemento alineaba a la izquierda. Faltaban las dos mitades de la regla: un emisor corto se empuja a la derecha, y uno largo pierde sus caracteres más a la izquierda (NC107A JUST-TEST-03, JUST-TEST-04; también cinco aserciones en NC105A).

• Corregido — la prueba de clase NUMERIC
Un elemento cuya PICTURE no lleva signo operacional es numérico solo cuando cada posición de carácter contiene un dígito. Leerlo con parse::<f64> aceptaba un signo, un punto decimal, un exponente y espacios alrededor, así que PICTURE X(5) con "+1234" respondía "numérico" (NC211A CC--TEST-GF-48, NC174A CLASS-TEST-GF-8/10). La declaración decide, como siempre: un elemento numérico que contiene caracteres — cosa que un MOVE de grupo puede producir — conserva la lectura basada en el valor.

• Corregido — dos reglas independientes de REDEFINES
- Una superposición lleva los bytes del destino a un par numérico. La sincronización filtraba todo carácter no-dígito y rellenaba lo que quedaba, así que "00ABCDEFGHI 4321 " se releía como 004321000000000000 e IS NUMERIC respondía que sí sobre un elemento lleno de letras. Cuando los bytes sí deletrean dígitos, la lectura numérica no cambia (NC174A CLASS-TEST-GF-8).
- Un REDEFINES de nivel 01 puede describir más almacenamiento del que redefine. NC107A superpone a un REDEF10 de 46 bytes un REDEF11 de 92 bytes y un REDEF12 de 120, y luego lee más allá del final del elemento redefinido. Los bytes más allá de la longitud propia de una descripción no le corresponde declararlos a esa descripción, así que el par conserva los suyos; renderizar la más corta sobre la más larga rellenaba la cola con espacios y la borraba (RDF-TEST-9, RDF-TEST-10; también dos en NC252A).



Post añadido a las 09:35. Post anterior a las 09:34


• Corregido — un símbolo de moneda alfabético flota a lo largo de toda su tirada
CURRENCY SIGN IS "W" convierte PICTURE WWWWW en una cadena de moneda flotante. Cuando el símbolo es una letra, la tirada llega como un único identificador — WWWWW, no cinco tokens —, de modo que comprobar si había un identificador de un solo carácter rechazaba toda picture de moneda flotante que no usara $ (NC107A CURR-TEST-1).

• Corregido — STRING
- DELIMITED BY gobierna toda la serie de emisores que lo precede, no solo aquel tras el que está escrito (COBOL-85 6.24.3). Ligarlo al último emisor dejaba a los anteriores sin frase, lo que equivale a DELIMITED BY SIZE, así que se anexaba cada uno entero y STRING "A0" "B0D" ... DELIMITED BY ZERO construía "A0B0D" donde el estándar quiere "ABCDE" (NC217A STR-TEST-GF-10, GF-11, GF-14).
- STRING ... INTO <group> alcanza a los hijos del grupo. Un grupo no posee slot de almacenamiento, así que escribir en su propio slot dejaba el registro intacto (STR-TEST-GF-21) — el mismo despacho por el que ya pasan INSPECT y ACCEPT.

• Corregido — un operando ordinal de CLASS o ALPHABET en su propia línea de código
Un número que abre una línea se lexea como número de nivel siempre que pueda serlo, y 1-49, 66, 77 y 88 todos pueden. La posición ordinal de A es exactamente 66, así que CLASS ORDINAL-A-ONLY IS seguido de 66 en la línea siguiente llegaba como LevelNumber(66), no casaba con nada y la clase no describía ningún carácter. Solo la DATA DIVISION tiene números de nivel y el lexer no tiene contexto de división; la propia cláusula dice qué es el número. Tanto CLASS como ALPHABET arrastraban el mismo hueco (NC174A CLASS-TEST-GF-39/41/43).

• Arnés de pruebas — las sustituciones de implementador del CCVS
XXXXX090 y XXXXX091 son los marcadores del conjunto para las posiciones ordinales de A y D en el juego de caracteres del implementador; NC174A y NC254A declaran las mismas tres clases dos veces, una con literales y otra con estos marcadores, y comprueban que ambas coinciden. nist_conformance los sustituye ahora (66 y 69), rellenados hasta los ocho caracteres del propio marcador para que el área de secuencia del formato fijo en las columnas 73-80 no se arrastre al área de contenido. Es la misma clase de entrada del implementador que ya suministran los ajustes de interruptores y los mazos de operador.

• Pruebas
test_figurative_and_byte_fidelity.rs (6), test_justified_class_currency.rs (6), test_string_delimiter_series.rs (5).

=== PowerRustCOBOL 1.62.41 — 2026-08-28 ===

NIST CCVS85 Nucleus (NC): nombres de condición cualificados, las reglas del MOVE con operando de grupo, HIGH-VALUE como byte, lo que CORRESPONDING no puede emparejar, y el único barrido que comparte una serie INSPECT ... TALLYING. NC246A, NC104A y NC105A quedan limpios, así que la ejecución pasa de 87 -> 90 de 95 y las aserciones fallidas bajan de 53 -> 17 (99,6 % de 4555). La compilación se mantiene en 95 de 95. Ningún otro módulo fue tocado (GOLDEN RULE #9).

• Corregido — un nombre de condición cualificado elige la declaración que nombra
Un mismo nombre de nivel 88 puede declararse bajo varios grupos — CCVS85 declara EQUALS-A bajo tres tablas separadas — y una referencia los distingue con OF/IN, exactamente como una referencia a datos. El entorno guardaba una sola entrada por nombre, así que la última declaración ganaba silenciosamente cada búsqueda y el subíndice escrito en la referencia se aplicaba entonces al huésped equivocado: EQUALS-M OF ... OF GROUP-1-TABLE (13) probaba la ocurrencia 13 de una tabla que solo tiene cuatro, no leía nada y salía falso. La pista era que el caso más difícil pasaba: la tabla tridimensional resultaba estar declarada en último lugar (NC246A QUAL-TEST-08/10/11, NC250A).
cond_names guarda ahora cada declaración en orden de fuente con su propia ruta de cualificación, y cond_name_qual resuelve contra ella con la misma regla de subsecuencia que resolve_canonical usa para los nombres de datos.



Post añadido a las 09:37. Post anterior a las 09:35


• Corregido — un operando de grupo transporta bytes, no valores
COBOL-85 6.18.4 hace un movimiento alfanumérico-a-alfanumérico siempre que cualquiera de los operandos sea un elemento de grupo: la PICTURE del otro operando aporta su tamaño y nada más. Un receptor de grupo ya seguía esa regla; un emisor de grupo no, así que un receptor elemental seguía editando, des-editando o parseando lo que llegaba.
- MOVE <grupo con "123ABC"> TO <PIC 0XXXXX0> deja "123ABC ", no el editado "0123AB0" (NC105A MOVE-TEST-F1-20); hacia un PIC 9999V999 deja esos seis caracteres y un espacio, que el REDEFINES PIC X(7) del elemento relee (F1-17); hacia un PIC 99 trunca a "12" (F1-16). JUSTIFIED RIGHT sigue decidiendo qué extremo rellena y cuál se pierde: un grupo de quince bytes hacia un PIC A(7) JUSTIFIED conserva sus siete de más a la derecha (NC107A JUST-TEST-04). Un grupo distribuye sus propios bytes en sus hijos tal cual: a un hijo alfanumérico-editado se le reimponían sus caracteres de inserción sobre una porción ya editada, convirtiendo "1 A05" en "1 0A" (NC105A F1-13). Y una cláusula VALUE en un grupo llega a sus hijos: se almacenaba en el slot propio del grupo — y un grupo no tiene slot que nadie relea —, así que 01 MOVE29A VALUE "$123.45". 02 MOVE30 PIC $999.99. dejaba MOVE30 vacío (NC104A MOVE-TEST-F1-29).
Nuevos: CobolEnvironment::set_verbatim_bytes (el escritor "los bytes son bytes", usado también por la distribución de grupo) y set_move_bytes (lo mismo con la regla de alineación del movimiento alfanumérico).

• Corregido — HIGH-VALUE rellena su receptor, y un grupo se lee como bytes
0xFF no es un carácter, así que HIGH-VALUE no podía viajar por la ruta de relleno de cadena que usan SPACE y ZERO y quedaba en manos de CobolValue::assign, que ponía un byte y rellenaba el resto con espacios. A un receptor de grupo le iba peor: el valor pasaba por as_display_string y llegaba como los tres bytes de U+FFFD.
- MOVE HIGH-VALUE TO <PIC X(10)> son diez bytes 0xFF; hacia un grupo se distribuye entre los hijos (NC105A MOVE-TEST-F1-67). Un receptor alfanumérico-editado sigue colocando sus caracteres de inserción — el relleno solo alcanza las posiciones de origen, así que PIC XX0XXBXXX contiene FF FF '0' FF FF ' ' FF FF FF (F1-69); apply_alnum_edit trabaja ahora sobre bytes. Leer un operando de grupo también es exacto a nivel de byte: eval_expr sintetizaba un grupo a través de un String, así que un grupo lleno de HIGH-VALUE comparaba desigual con HIGH-VALUE y se leía con el triple de su propio ancho. Bajo una PROGRAM COLLATING SEQUENCE la constante nombra un carácter ordinario y los bytes de ese carácter son la unidad de relleno, como antes.

• Corregido — lo que CORRESPONDING no puede emparejar, y lo que debe alcanzar
- COBOL-85 6.18.4 GR1 excluye un elemento descrito con REDEFINES o RENAMES. Una reagrupación de nivel 66 recibía el elemento homónimo del emisor y sobrescribía los dos elementos que renombra (NC209A MOV-TEST-F2-5), y lo mismo le ocurría al elemento bajo una rama REDEFINES (F2-6). La exclusión recae en la declaración, no en el nombre: los niveles 66 ya no entran en ItemSym.children en absoluto, y un elemento redefinidor se omite por clave — excluir por nombre rompía un elemento normal que simplemente comparte nombre con un 66 en otro lugar (F2-4).
- Cualquiera de los dos operandos puede nombrar una ocurrencia de una tabla de grupos. La tabla de símbolos se indexa por el elemento base, así que MOVE CORRESPONDING ... TO C-FLOCK (4) no casaba con nada y la sentencia no movía nada en absoluto. Los subíndices del operando se trasladan ahora a cada clave hija emparejada, y la recursión los sigue trasladando (NC209A MOV-TEST-F2-7, -F2-8).



Post añadido a las 09:38. Post anterior a las 09:37


• Corregido — una serie INSPECT ... TALLYING comparte un solo barrido
COBOL-85 6.17.3 inspecciona el elemento una vez, de izquierda a derecha; en cada posición de carácter los operandos se prueban en el orden en que se escribieron, el primero que casa toma la posición, y el barrido continúa pasados los caracteres que consumió. Antes cada operando barría el elemento entero por su cuenta, así que los mismos caracteres se contaban varias veces: TALLYING t1 FOR ALL "AA" t2 FOR ALL "A" sobre "AABA" daba t2 = 3 donde el estándar da 1 (NC216A INS-TEST-F1-27), y un operando FOR LEADING contaba una tirada cuyo primer carácter ya había tomado un operando anterior (INS-TEST-F3-19). CHARACTERS cuenta ahora solo las posiciones que ningún operando anterior reclamó. Cada operando conserva su propia ventana BEFORE/AFTER, calculada una vez sobre el elemento tal como está.

• Pruebas
test_qualified_condition_names.rs (5) y test_group_sender_moves.rs (8) son nuevos; test_figurative_and_byte_fidelity.rs (+4), test_qualified_goto_and_corr.rs (+4) y test_inspect.rs (+5) crecieron. Dos de las pruebas de nombres de condición afirman el mismo programa en ambos órdenes de declaración: la propiedad es la independencia del orden, no una respuesta concreta.

=== PowerRustCOBOL 1.62.42 — 2026-08-28 ===

NIST CCVS85 Nucleus (NC) está completo: 95 de 95 en compilación y en ejecución, con 0 aserciones fallidas de 4614. La ejecución pasa de 90 -> 95 de 95; todos los programas del módulo corren ahora hasta el final, donde NC201A antes no terminaba en absoluto. Nueve correcciones, cada una de ellas una regla de COBOL-85 que faltaba y no una capacidad nueva. La compilación del conjunto completo no cambia: 420 de 434. Ningún otro módulo fue tocado (GOLDEN RULE #9).

• Corregido — un RENAMES de nivel 66 se cualifica por su registro
Un 66 no tiene padre en la jerarquía de niveles, así que se registraba bajo su nombre a secas y quedaba totalmente fuera de la resolución de nombres. De ahí seguían tres cosas: dos registros que declaraban el mismo nombre 66 resolvían al que se hubiera parseado en último lugar, así que MOVE "CALIFORNIA" TO RENAME-5 OF T-RENAMES-DATA aterrizaba en el otro registro; un nombre compartido con un elemento de datos ordinario resolvía al elemento de datos, así que HARRY OF A-GLOB leía un campo sin relación en lugar de la reagrupación; y RENAME-6 IN T-RENAMES-DATA — una lectura cualificada — nunca consultaba la tabla de RENAMES y volvía como 0.
Cada 66 toma ahora como ruta de ancestros el registro que reagrupa, se indexa igual que un elemento de datos y entra en by_leaf, de modo que resolve_canonical lo alcanza con la regla ordinaria de subsecuencia; los operandos de la cláusula RENAMES se resuelven en ese mismo registro. (NC209A MOV-TEST-F2-5, NC252A RENAM-TEST-8/9/10.)

• Corregido — una tabla renombrada aporta todas sus ocurrencias
elem_order guarda una entrada por declaración, así que un elemento OCCURS cubierto aportaba un único slot: 66 RENAME-7 RENAMES ITEM-1 THRU TABLE-2 se releía como "BOSTO" en lugar de "BOSTON MASSACHUSETTS" (NC252A RENAM-TEST-11).

• Corregido — un RENAMES sobre un único elemento es ese elemento
COBOL-85 da a tal elemento la descripción del elemento que renombra. 66 RENAME-12 RENAMES WIDGET-4, donde WIDGET-4 es PIC 9(4), es un elemento numérico de cuatro dígitos — así que ADD 3500 TO RENAME-12 con 8000 dentro desborda. El receptor era la clave propia del RENAMES, que nada relee, así que ON SIZE ERROR nunca se disparaba y además no se almacenaba nada (NC252A RENAM-TEST-16/17).

• Corregido — un nombre de condición 88 sobre un grupo prueba los bytes del grupo
Un grupo no posee slot: el grupo ES sus hijos. Leer su propio slot hacía falsa toda condición declarada sobre un grupo, contuviera lo que contuviera el registro — 01 TABLE-86. 88 B86 VALUE "ABCABC". 02 ... nunca casaba con los seis bytes que el registro realmente contenía (NC250A IF--TEST-87/88).



Post añadido a las 09:39. Post anterior a las 09:38


• Corregido — una constante figurativa se dimensiona al otro operando, VALUE incluido
ALL literal se repite hasta el tamaño del operando con el que se compara, en ambos sentidos: IF IF-D6 EQUAL TO ALL "BA" contra un elemento de diez caracteres es "BABABABABA", no "BA" rellenado con espacios. La misma regla se aplica a una constante figurativa escrita como VALUE de un 88: 88 B VALUE QUOTE sobre un huésped PIC X(4) son cuatro comillas, y 88 D VALUE ALL "BAC" es "BACB". Solo VALUE SPACE había funcionado siempre, porque su relleno resulta ser el carácter que repite (NC250A IF--TEST-4, IF--TEST-26, IF--TEST-28).

• Corregido — un operando de grupo es de categoría alfanumérica
Emparejarlo con un elemento numérico toma la comparación no numérica, en la que el lado numérico se convierte en sus caracteres rellenados por la derecha: PIC 9(5) con 12345 es "12345 " contra un grupo de diez bytes con "0000012345", y desiguales. Se estaban comparando algebraicamente (NC250A IF--TEST-77).

• Corregido — NOT delante de un objeto de abreviatura niega la relación
En una condición de relación combinada abreviada, un NOT seguido de un objeto y no de un operador relacional niega la relación implícita: a > b OR NOT c es a > b OR NOT (a > c). Se leía como una prueba de la verdad propia del objeto, que da la misma respuesta solo cuando el objeto es cero — por eso NC250A IF-TEST-122 pasó siempre e IF-TEST-123, cuyo operando es 12, no.

• Corregido — una serie INSPECT ... REPLACING comparte un solo barrido
El estándar da a una serie de operandos de reemplazo una única inspección compartida de izquierda a derecha, como ya la tenía una serie de conteo: en cada posición los operandos se prueban en el orden escrito, el primero que casa reemplaza esos caracteres y el barrido continúa pasados ellos. Aplicados de uno en uno, cada operando veía la salida del anterior — FIRST "L " BY "ZZ" AFTER INITIAL "AL" borraba justo el "L " sobre el que estaba anclado el operando siguiente, y "BAD" sobrevivía hasta el final (NC216A INS-TEST-F3-19).

• Corregido — un elemento DISPLAY con signo no tiene signo menos entre sus caracteres
INSPECT lee las posiciones de carácter de un elemento, y un elemento DISPLAY con signo lleva su signo como sobreperforación en un dígito, no en una posición propia. Así que INSPECT <PIC S9(5) con -12345> TALLYING ... FOR ALL "-" es 0. El signo se restaura a la salida, de modo que un REPLACING sobre los dígitos no lo cambia. SIGN IS ... SEPARATE CHARACTER no se ve afectado: ahí el signo sí es una posición (NC216A INS-TEST-F1-23).

• Corregido — las superposiciones REDEFINES anidadas se mantienen sincronizadas
Una clave dentro de más de una superposición conservaba solo la última clase construida, y una única bandera global suprimía todo refresco posterior en lugar de solo la escritura que rebotaba de vuelta. Entre ambas cosas, una escritura a través de una redefinición de nivel 01 llegaba al registro redefinido y ahí se detenía: MOVE 11 TO RDFDATA16 nunca alcanzaba el RDF3 REDEFINES RDFDATA3 de su interior, ni el RDF3-5-1 REDEFINES RDF3-5 dentro de aquel, por cuyo 88 pregunta la prueba. Los enlaces llevan ahora todas las clases a las que pertenece una clave, y la guarda bloquea solo la descripción que se está escribiendo (NC252A RDF-TEST-12/13).



Post añadido a las 09:40. Post anterior a las 09:39


• Corregido — PERFORM ... WITH TEST AFTER VARYING, y lo que un bucle VARYING deja tras de sí
Tres reglas separadas de PERFORM VARYING, y la razón por la que NC201A nunca terminaba:
- WITH TEST AFTER se parseaba y se descartaba para la forma VARYING, así que todo bucle así corría con prueba-antes. Un cuerpo que asigna sus propias variables de bucle — NC201A PFM-TEST-F4-14 fija las dos — aumentaba entonces la exterior más allá de su valor de terminación en cada pasada y nunca satisfacía la condición en el punto donde se probaba. Ese único programa era la totalidad de la columna de "timed out" del módulo. La grafía en línea PERFORM WITH TEST AFTER VARYING ... END-PERFORM se rechazaba de plano y ahora parsea. Un identificador AFTER se restablece a su valor FROM cuando termina su bucle, antes de aumentar el nivel inmediatamente exterior, así que una variable interior no sobrevive a su propio bucle; la más exterior sí (PFM-TEST-F4-3, PFM-TEST-F4-4). Y un identificador VARYING con subíndice sigue a su subíndice: se resolvía una sola vez, así que el aumento escribía una ocurrencia fija mientras el UNTIL — evaluado en fresco — leía otra (PFM-TEST-F4-24).

• Pruebas
test_qualified_renames.rs (6), test_condition_operands.rs (8), test_inspect_series_and_signs.rs (5), test_nested_redefines.rs (3) y test_perform_varying_forms.rs (4) son nuevos; cada uno fija la regla y no el programa, y varios fijan el caso que seguía pasando por la razón equivocada.
Las pruebas propias de cobolt-ast vuelven a compilar: tests/test_ast_construction.rs venía inicializando DataDecl y Program sin campos que esos tipos ganaron hace varias sesiones, así que las 31 pruebas de esa crate llevaban tiempo sin ejecutarse. Se suministran los campos que faltaban.

=== PowerRustCOBOL 1.62.43 — 2026-08-28 ===

NIST CCVS85 Sequential I/O (SQ) compila por completo — 85 de 85 — y pasa de 10 -> 44 de 85 en ejecución. Los veinte programas que se estrellaban de inmediato ahora corren todos: compartían un único defecto. Las aserciones pasan de 215 PASS / 190 FAIL a 471 PASS / 162 FAIL, y el único programa que agotaba el tiempo ya no lo hace. Compilación del conjunto completo: 420 -> 422 de 434. Nucleus no cambia: 95 de 95 en ambos ejes, 4 614 aserciones sin ninguna fallida (GOLDEN RULE #9: SQ es el módulo en curso, y el techo de NC se protege re-midiéndolo tras cada cambio). Esta versión restaura además la propiedad Picture del TextBox, presente en las versiones más tempranas y eliminada en algún momento sin causa.

• Corregido — los párrafos de una declarativa conservan sus nombres
Cada párrafo de una sección de DECLARATIVES se aplanaba en una sola lista de sentencias y los nombres se tiraban, así que un manejador USE no podía alcanzar su propio código: PERFORM DECL-FAIL y GO TO OUTPUT-ERROR-PROCESS morían con "undefined paragraph", y el manejador ejecutaba el cuerpo de todos los párrafos en secuencia salvo que un GO TO escapara antes. Ese único defecto es todo el clúster de veinte programas estrellados (SQ122A, SQ132A, SQ226A y diecisiete más).
Un manejador se entra ahora por el principio de su sección y fluye hasta el final de la sección, con sus párrafos nombrados. Estos viven en su propio espacio de nombres, que el estándar impone en ambos sentidos: el control nunca cae del cuerpo principal a una declarativa, y un nombre declarado en ambos resuelve a la copia de la declarativa mientras corre un manejador y a la del cuerpo en el resto de los casos. El cuerpo principal sigue a las declarativas en ese espacio, así que un manejador puede también hacer PERFORM de un párrafo de la porción no declarativa — y toda sección declarativa está incluida en él, porque el manejador de EXTEND de SQ226A ejecuta con PERFORM un párrafo que pertenece a la sección del manejador de OUTPUT.
Eslopes is offline   Responder Con Cita