Rational Developer for System z

Recorrido por el código de ejemplo

En este tema se realiza un recorrido por fragmentos de código de ejemplo y se describe cómo la salida de los preprocesadores puede enlazarse utilizando el mecanismo de información de retorno de error de y el soporte de múltiples preprocesadores de Rational Developer for System z.

Fragmentos de código

Este ejemplo hace referencia a los siguientes fragmentos de código:
Segmento COBOL
El siguiente segmento de programa COBOL es del código fuente DEMODATA. Este programa se ha preprocesado y compilado. Las líneas que empiezan por FRAGMENT están en la línea 48, 55 y 74. La sentencia de visualización escrita incorrectamente "DSPLAY" está en la línea 54. El miembro NOTTHERE falta intencionadamente en la concatenación de FRAGMNT para que el preprocesador indique un error en esa línea.
       Procedure Division.
FRAGMENT HELLO;
           Initialize Program-pass-fields
                      Program-other-fields
                      Program-flags.
           copy  MYINC6.
           Perform until Loop-done
               Dsplay " "
FRAGMENT NOTTHERE;
               Display "Enter a name or Q to quit:"
               Move Spaces to Input-name
               Accept Input-name
               IF Input-name = Spaces
                 Move "Q" to Input-name
               End-IF

               Move 1 to Char-count
               Inspect Input-name Tallying Char-count For Leading Spaces
               Move Input-name(Char-count: 30 - Char-count) to Temp-name

               If function upper-case (Temp-name) = "Q"
                     or Temp-name = Spaces
                  Set Loop-done to true
               Else
                  Call 'PrintApp' using Program-pass-fields
               End-if
           End-perform.
FRAGMENT BYE;
           Goback.
Fragment MEL.A001.DATA.FRAGMENT(BYE)
***************************************************
*BYE
***************************************************
Fragment MEL.A001.DATA.FRAGMENT(HELLO)
 **************************************************
 *HELLO
 ***************************************************

Salida del preprocesador

El código de ejemplo al final de esta sección muestra el archivo XML de salida del preprocesador. El archivo XML del preprocesador contiene un conjunto de valores para el fuente leído, <FILEREFERENCETABLE>. Este archivo XML también tiene los mensajes que el preprocesador ha generado entre el código <MESSAGE>. Los valores de <OUTFILEREFERENCETABLE> describen los archivos de salida que el preprocesador ha creado para que el compilador los consuma. Los valores de <STATEMENTTABLE> describen cada línea de salida que el preprocesador ha creado. Cada uno de los cuádruples ordenados describe una sola línea de salida de la manera siguiente:
(oln,ofn,iln,ifn)
oln
Número de línea de salida. Este es el número de línea en el archivo fuente expandido.
ofn
Número de archivo de salida. Este es el número del archivo de salida. A menudo un preprocesador emitirá solamente un archivo de salida, pero es posible que un preprocesador escriba miembros de copia para el compilador.
iln
Número de línea de entrada. Este es el número de línea del archivo de entrada que se procesó para provocar que se escribiera la línea de salida.
ifn
Número de archivo de entrada. Este es el número de archivo del archivo de entrada que se lee. Contiene la línea de entrada descrita por iln.
A partir del archivo XML del preprocesador puede determinarse la siguiente información:
<?xml version="1.0" standalone="yes"?>
<BUILD>
<PACKAGE>
<FILEREFERENCETABLE>
<FILECOUNT>3</FILECOUNT>
<FILE>
<FILENUMBER>1</FILENUMBER>
<FILENAME>
MEL.A001.DATA.COBOL(DEMODATA)
</FILENAME>
</FILE>
<FILE>
<FILENUMBER>2</FILENUMBER>
<FILENAME>
MEL.A001.DATA.FRAGMENT(HELLO)
</FILENAME>
</FILE>
<FILE>
<FILENUMBER>3</FILENUMBER>
<FILENAME>
MEL.A001.DATA.FRAGMENT(BYE)
</FILENAME>
</FILE>
</FILEREFERENCETABLE>
<MESSAGE>
<MSGNUMBER>DEMO9999E</MSGNUMBER>
<MSGLINE>55</MSGLINE>
<MSGFILE>1</MSGFILE>
<MSGTEXT>
DD:FRAGMNT(NOTTHERE) not found
</MSGTEXT>
</MESSAGE>
<OUTFILEREFERENCETABLE>
<OUTFILECOUNT>
1
</OUTFILECOUNT>
<OUTFILE>
<OUTFILENUMBER>
1
</OUTFILENUMBER>
<OUTFILENAME>
SYS09225.T113157.RA000.MEL1.TEMPFILE.H01
</OUTFILENAME>
</OUTFILE>
</OUTFILEREFERENCETABLE>
<STATEMENTTABLE>
(1,1,1,1);(2,1,2,1);(3,1,3,1);(4,1,4,1);(5,1,5,1);(6,1,6,1);
(7,1,7,1);(8,1,8,1);(9,1,9,1);(10,1,10,1);(11,1,11,1);(12,1,12,1);
(13,1,13,1);(14,1,14,1);(15,1,15,1);(16,1,16,1);(17,1,17,1);(18,1,18,1);
(19,1,19,1);(20,1,20,1);(21,1,21,1);(22,1,22,1);(23,1,23,1);(24,1,24,1);
(25,1,25,1);(26,1,26,1);(27,1,27,1);(28,1,28,1);(29,1,29,1);(30,1,30,1);
(31,1,31,1);(32,1,32,1);(33,1,33,1);(34,1,34,1);(35,1,35,1);(36,1,36,1);
(37,1,37,1);(38,1,38,1);(39,1,39,1);(40,1,40,1);(41,1,41,1);(42,1,42,1);
(43,1,43,1);(44,1,44,1);(45,1,45,1);(46,1,46,1);(47,1,47,1);(48,1,1,2);
(49,1,2,2);(50,1,3,2);(51,1,49,1);(52,1,50,1);(53,1,51,1);(54,1,52,1);
(55,1,53,1);(56,1,54,1);(57,1,55,1);(58,1,56,1);(59,1,57,1);(60,1,58,1);
(61,1,59,1);(62,1,60,1);(63,1,61,1);(64,1,62,1);(65,1,63,1);(66,1,64,1);
(67,1,65,1);(68,1,66,1);(69,1,67,1);(70,1,68,1);(71,1,69,1);(72,1,70,1);
(73,1,71,1);(74,1,72,1);(75,1,73,1);(76,1,1,3);(77,1,2,3);(78,1,3,3);
(79,1,75,1);(80,1,76,1);(81,1,77,1);(82,1,78,1);(83,1,79,1);
</STATEMENTTABLE>
</PACKAGE>
</BUILD>

Salida del compilador

El código de ejemplo al final de esta sección muestra el archivo XML de salida del compilador. El compilador genera el archivo XML del compilador cuando se utilizan las opciones de compilador adecuadas. Estas opciones de compilador se insertan automáticamente cuando se realiza una comprobación de sintaxis, una compilación o una operación de mostrar dependencias. El archivo XML del compilador tiene un formato algo distinto al del archivo XML del preprocesador. Los preprocesadores y los programas de creación escritos por usuario deberán seguir el formato del archivo XML del preprocesador.

El archivo XML del compilador muestra que hay un error de compilación: &quot;DSPLAY&quot; no es válido. Se ha saltado al siguiente verbo, punto o definición de nombre de procedimiento. Este error pertenece a la línea 56 del archivo de entrada 1, SYS09225.T113157.RA000.MEL1.TEMPFILE.H01. El compilador solo informa de errores en el archivo que se le ha proporcionado. El compilador no conoce la existencia de MEL.A001.DATA.COBOL(DEMODATA). Conoce el archivo de entrada número 1, SYS09225.T113157.RA000.MEL1.TEMPFILE.H01. A partir del convenio de denominación y del procedimiento JCL que se utilizó para invocar al preprocesador y al compilador, puede determinar que SYS09225.T113157.RA000.MEL1.TEMPFILE.H01 es un archivo temporal que se ha suprimido una vez finalizado el trabajo.

Combinando los dos archivos XML, puede encontrar la línea de fuente correcta con la que correlacionar el error de compilación:
  • Se ha informado del error de compilación en el archivo número 1.
  • La FILEREFERENCETABLE del compilador indica que el archivo 1 es SYS09225.T113157.RA000.MEL1.TEMPFILE.H01.
  • A partir del archivo XML del preprocesador, puede encontrar el archivo SYS09225.T113157.RA000.MEL1.TEMPFILE.H01 en la OUTFILEREFERENCETABLE. Tiene un OUTFILENUMBER de 1. Así, el número del archivo de salida es 1, y el número de línea de salida es 56.
Expresado de otra forma:
oln = 56
ofn = 1
A partir de la STATEMENTTABLE, debe encontrar iln, y ifn donde el cuádruple ordenado es (56,1,iln,ifn). A partir de esta información, puede determinar los siguientes valores:
iln = 54
ifn = 1
Resumiendo, el compilador ha informado de un error en la línea 56 del archivo SYS09225.T113157.RA000.MEL1.TEMPFILE.H01. Esta línea corresponde a la línea 54 de MEL.A001.DATA.COBOL(DEMODATA). El error del compilación deberá figurar en la línea 54 del archivo MEL.A001.DATA.COBOL(DEMODATA).
<?xml version="1.0" standalone="yes"?>
<!-- ************************************************************************************ -->
<BUILD>
<PACKAGE>
<FILEREFERENCETABLE>
<FILECOUNT>2</FILECOUNT>
<FILE>
<FILENUMBER>1</FILENUMBER>
<FILENAME>SYS09225.T113157.RA000.MEL1.TEMPFILE.H01</FILENAME>
</FILE>
<FILE>
<FILENUMBER>2</FILENUMBER>
<FILENAME>MEL.A001.COPYLIB1.COPYLIB(MYINC6)</FILENAME>
</FILE>
</FILEREFERENCETABLE>
<MESSAGE>
<MSGNUMBER>IGYPS2112-E</MSGNUMBER>
<MSGLINE>55</MSGLINE>
<MSGFILE>1</MSGFILE>
<MSGTEXT>
La sentencia "PERFORM" no tenía un terminador de ámbito coincidente.  Se ha asumido un terminador en la línea 82.  Los resultados de la ejecución pueden no ser correctos.
</MSGTEXT>
</MESSAGE>
<MESSAGE>
<MSGNUMBER>IGYPS2072-S</MSGNUMBER>
<MSGLINE>56</MSGLINE>
<MSGFILE>1</MSGFILE>
<MSGTEXT>
"DSPLAY" no es válido.  Se ha saltado al siguiente verbo, punto o definición de nombre de procedimiento.
</MSGTEXT>
</MESSAGE>
<MESSAGE>
<MSGNUMBER>IGYPS0002-E</MSGNUMBER>
<MSGLINE>57</MSGLINE>
<MSGFILE>1</MSGFILE>
<MSGTEXT>
Se ha encontrado un carácter distinto a "*", "D", "/" o "-" en la columna 7.  Se ha asumido un blanco.
</MSGTEXT>
</MESSAGE>
<MESSAGE>
<MSGNUMBER>IGYPS2008-E</MSGNUMBER>
<MSGLINE>57</MSGLINE>
<MSGFILE>1</MSGFILE>
<MSGTEXT>
Era necesario un punto antes del nombre de procedimiento "T".  Se ha asumido un punto antes de "T".
</MSGTEXT>
</MESSAGE>
<MESSAGE>
<MSGNUMBER>IGYPS2145-E</MSGNUMBER>
<MSGLINE>57</MSGLINE>
<MSGFILE>1</MSGFILE>
<MSGTEXT>
Era necesario un punto.  Se ha asumido un punto antes de "NOTTHERE".
</MSGTEXT>
</MESSAGE>
<MESSAGE>
<MSGNUMBER>IGYPS2015-I</MSGNUMBER>
<MSGLINE>57</MSGLINE>
<MSGFILE>1</MSGFILE>
<MSGTEXT>
El párrafo o sección anterior al párrafo o sección "NOTTHERE" no contenía sentencias.
</MSGTEXT>
</MESSAGE>
<MESSAGE>
<MSGNUMBER>IGYPS2145-E</MSGNUMBER>
<MSGLINE>58</MSGLINE>
<MSGFILE>1</MSGFILE>
<MSGTEXT>
Era necesario un punto.  Se ha asumido un punto antes de "DISPLAY".
</MSGTEXT>
</MESSAGE>
<MESSAGE>
<MSGNUMBER>IGYPS2113-E</MSGNUMBER>
<MSGLINE>75</MSGLINE>
<MSGFILE>1</MSGFILE>
<MSGTEXT>
Se ha encontrado el terminador de ámbito explícito "END-PERFORM" sin un verbo correspondiente.  Se ha descartado el terminador de ámbito.
</MSGTEXT>
</MESSAGE>
</PACKAGE>
</BUILD>

Términos de uso | Comentarios

Este Information Center está basado en tecnología Eclipse. (http://www.eclipse.org)