Rational Developer for System z, Version 7.6

Exemple de structure de code

Cette rubrique présente des exemples de fragment de code et explique comment la sortie des préprocesseurs peut être liée à l'aide du mécanisme de retour d'erreur de Rational Developer for System z et d'une prise en charge de plusieurs préprocesseurs.

Fragments de code

Cet exemple se rapporte aux fragments de code suivant :
Segment COBOL
Le segment de programme COBOL suivant provient du code source DEMODATA. Ce programme a fait l'objet d'un traitement préalable et d'une compilation. Les lignes 48, 55 et 74 commencent par FRAGMENT. L'instruction "DSPLAY" mal orthographiée se trouve à la ligne 54. Le membre NOTTHERE est volontairement absent de la concaténation FRAGMNT, le préprocesseur indiquant une erreur sur la ligne.
       Division de procédure.
FRAGMENT HELLO;
           Initialize Program-pass-fields
                      Program-other-fields
                      Program-flags.
           copy  MYINC6.
           Perform until Loop-done
               Dsplay " "
FRAGMENT NOTTHERE;
               Display "Saisir un nom ou Q pour fermer la fenêtre :"
               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
 ***************************************************

Sortie du préprocesseur

L'exemple de code à la fin de cette section illustre le fichier XML de sortie du préprocesseur. Ce fichier contient un ensemble de valeurs pour la lecture de la source <FILEREFERENCETABLE>. Il contient également les messages que le préprocesseur a généré entre la balise <MESSAGE>. Les valeurs <OUTFILEREFERENCETABLE> décrivent les fichiers de sortie que le préprocesseur a créé à l'intention du compilateur. Les valeurs <STATEMENTTABLE> décrivent chaque ligne de sortie que le préprocesseur a créé. Chacun des ensembles de 4 cartes mémoire ordonnés décrit une seule ligne de sortie de la manière suivante :
(oln,ofn,iln,ifn)
oln
Numéro de ligne de sortie. Il s'agit du numéro de ligne dans le fichier source développé.
ofn
Numéro du fichier de sortie. Il s'agit du numéro de fichier de sortie. La plupart du temps, un préprocesseur ne génère qu'un seul fichier de sortie, mais il lui est possible d'écrire des membres de copie pour alimenter le compilateur.
iln
Numéro de ligne de saisie. Il s'agit du numéro de ligne issu du fichier en entrée traité pour permettre l'écriture de la ligne de sortie.
ifn
Numéro du fichier en entrée. Il s'agit du numéro du fichier en entrée en cours de lecture. Il contient la ligne de l'entrée décrite par iln.
Dans le fichier XML du préprocesseur, les informations suivantes peuvent être déterminées :
<?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>

Sortie du compilateur

L'exemple de code à la fin de cette section illustre le fichier XML de sortie du compilateur. Le fichier XML du compilateur est généré par le compilateur lorsque les options de compilation appropriées sont utilisées. Ces options de compilation sont insérées automatiquement lors d'opérations de vérification de la syntaxe, de génération ou d'affichage des dépendances. Le format du fichier XML du compilateur est sensiblement différent de celui du fichier XML du préprocesseur. Les préprocesseurs et générateurs écrits par l'utilisateur doivent se conformer au format du fichier XML du préprocesseur.

Le fichier XML du compilateur indique une erreur de compilation : &quot;DSPLAY&quot; was invalid. Skipped to the next verb, period or procedure-name definition. Cette erreur concerne la ligne 56 du fichier en entrée 1, SYS09225.T113157.RA000.MEL1.TEMPFILE.H01. Le compilateur ne renvoie que les erreurs au niveau du fichier qui lui a été transmis. Le compilateur n'a pas connaissance de MEL.A001.DATA.COBOL(DEMODATA). Il connaît l'existence du numéro de fichier en entrée 1, SYS09225.T113157.RA000.MEL1.TEMPFILE.H01. Dans la convention de dénomination et la procédure JCL utilisée pour appeler le préprocesseur et le compilateur, vous pouvez déterminer que SYS09225.T113157.RA000.MEL1.TEMPFILE.H01 est un fichier temporaire qui a été supprimé à l'issue du travail.

En combinant les deux fichiers XML, vous pouvez rechercher la ligne correcte de la source pour mapper l'erreur de compilation vers
  • L'erreur de compilateur a été reportée au niveau du fichier numéro 1.
  • Le compilateur FILEREFERENCETABLE indique que le fichier 1 est SYS09225.T113157.RA000.MEL1.TEMPFILE.H01.
  • Dans le fichier XML du préprocesseur, vous pouvez rechercher le fichier SYS09225.T113157.RA000.MEL1.TEMPFILE.H01 dans OUTFILEREFERENCETABLE. La valeur 1 a été attribuée à OUTFILENUMBER. Ainsi, le numéro du fichier de sortie est 1 et le numéro de la ligne de sortie est 56.
En d'autres termes :
oln = 56
ofn = 1
Dans STATEMENTTABLE, vous devez rechercher iln et ifn dans lesquels l'ensemble de 4 cartes mémoire ordonné est (56,1,iln,ifn). Dès lors, vous pouvez déterminer ce qui suit :
iln = 54
ifn = 1
Pour résumer, lecompilateur a reporté une erreur à la ligne 56 du fichier SYS09225.T113157.RA000.MEL1.TEMPFILE.H01. Cette ligne correspond à la ligne 54 de MEL.A001.DATA.COBOL(DEMODATA). L'erreur de compilateur doit être reportée au niveau de la ligne 54 du fichier 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>
The "PERFORM" statement did not have a matching scope terminator.  A scope terminator was assumed on line 82.  The execution results may not be correct.
</MSGTEXT>
</MESSAGE>
<MESSAGE>
<MSGNUMBER>IGYPS2072-S</MSGNUMBER>
<MSGLINE>56</MSGLINE>
<MSGFILE>1</MSGFILE>
<MSGTEXT>
"DSPLAY" was invalid.  Skipped to the next verb, period or procedure-name definition.
</MSGTEXT>
</MESSAGE>
<MESSAGE>
<MSGNUMBER>IGYPS0002-E</MSGNUMBER>
<MSGLINE>57</MSGLINE>
<MSGFILE>1</MSGFILE>
<MSGTEXT>
A character other than "*", "D", "/" or "-" was found in column 7.  A blank was assumed.
</MSGTEXT>
</MESSAGE>
<MESSAGE>
<MSGNUMBER>IGYPS2008-E</MSGNUMBER>
<MSGLINE>57</MSGLINE>
<MSGFILE>1</MSGFILE>
<MSGTEXT>
A period was required before procedure-name "T".  A period was assumed before "T".
</MSGTEXT>
</MESSAGE>
<MESSAGE>
<MSGNUMBER>IGYPS2145-E</MSGNUMBER>
<MSGLINE>57</MSGLINE>
<MSGFILE>1</MSGFILE>
<MSGTEXT>
A period was required.  A period was assumed before "NOTTHERE".
</MSGTEXT>
</MESSAGE>
<MESSAGE>
<MSGNUMBER>IGYPS2015-I</MSGNUMBER>
<MSGLINE>57</MSGLINE>
<MSGFILE>1</MSGFILE>
<MSGTEXT>
The paragraph or section prior to paragraph or section "NOTTHERE" did not contain any statements.
</MSGTEXT>
</MESSAGE>
<MESSAGE>
<MSGNUMBER>IGYPS2145-E</MSGNUMBER>
<MSGLINE>58</MSGLINE>
<MSGFILE>1</MSGFILE>
<MSGTEXT>
A period was required.  A period was assumed before "DISPLAY".
</MSGTEXT>
</MESSAGE>
<MESSAGE>
<MSGNUMBER>IGYPS2113-E</MSGNUMBER>
<MSGLINE>75</MSGLINE>
<MSGFILE>1</MSGFILE>
<MSGTEXT>
The explicit scope terminator "END-PERFORM" was found without a matching verb.  The scope terminator was discarded.
</MSGTEXT>
</MESSAGE>
</PACKAGE>
</BUILD>

Conditions d'utilisation | Commentaires en retour

Ce centre de documentation utilise la technologie Eclipse. (http://www.eclipse.org)