サンプル・コードのウォークスルー
サンプル・コード・スニペットは、 Developer for z/OS® エラー・フィードバック・メカニズムと複数プリプロセッサー・サポートを使用して、プリプロセッサーからの出力をリンクする方法を示しています。
コード・スニペット
この例では、以下のコード・スニペットへの参照を作成します。- COBOL セグメント
- 以下の COBOL プログラム・セグメントは、DEMODATA ソース・コードからのものです。 このプログラムは、プリプロセスされ、コンパイルされました。 FRAGMENT で始まる行は、48 行目、55 行目、および 74 行目にあります。 誤ったつづりで表示されているステートメント「DSPLAY」は、54 行目にあります。 メンバー NOTTHERE は、意図的に FRAGMNT 連結から除かれているため、プリプロセッサーはその行にエラーのフラグを立てます。
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 ***************************************************
プリプロセッサーの出力
このセクションの最後に表示されているコード・サンプルは、プリプロセッサーの出力 XML ファイルを示しています。 プリプロセッサー XML ファイルには、<FILEREFERENCETABLE> で読み取られるソースに対する値のセットが含まれています。この XML ファイルには、プリプロセッサーが <MESSAGE> タグの間に生成したメッセージも含まれています。 <OUTFILEREFERENCETABLE> の値は、コンパイラーによる使用のためにプリプロセッサーが作成した出力ファイルを説明します。 <STATEMENTTABLE> の値は、プリプロセッサーが作成した各出力行を説明します。 順序が付けられた各クワッドは、以下のようにして、単一の出力行を説明します。(oln,ofn,iln,ifn)- oln
- 出力行番号。拡張ソース・ファイル内の行番号です。
- ofn
- 出力ファイル番号。 通常、プリプロセッサーは、単一の出力ファイルしか出力しませんが、コンパイラーに送られるコピー・メンバーを書き出すこともできます。
- iln
- 入力行番号。出力行が書き込まれるように処理された入力ファイルからの行番号です。
- ifn
- 入力ファイル番号。読み取られる入力ファイルのファイル番号です。 このファイルには、iln に記述された入力行が入っています。
- プリプロセスされたプログラムは、MEL.A001.DATA.COBOL(DEMODATA) であった。
- プリプロセス中に使用されたファイルは、MEL.A001.DATA.COBOL(DEMODATA)、MEL.A001.DATA.FRAGMENT(HELLO)、および MEL.A001.DATA.FRAGMENT(BYE) であった。
- プリプロセッサーによって、単一の出力ファイル SYS09225.T113157.RA000.MEL1.TEMPFILE.H01 が生成された。
- プリプロセッサー・エラーDD:FRAGMNT(NOTTHERE) not found入力ソース・ファイル 1、 MEL.A001.DATA.COBOL(DEMODATA)の 55 行目で発生しました。
- ステートメント表項目 (48,1,1,2) は、出力ファイル 1 SYS09225.T113157.RA000.MEL1.TEMPFILE.H01 の 48 行目が、入力ファイル 2 MEL.A001.DATA.FRAGMENT(HELLO) の行番号 1 を読み取った結果として書き込まれたことを示している。
<?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>
コンパイラー出力
このセクションの最後に表示されているコード・サンプルは、コンパイラーの出力 XML ファイルを示しています。 このコンパイラー XML ファイルは、該当するコンパイラー・オプションが使用されると、コンパイラーによって生成されます。 これらのコンパイラー・オプションは、構文検査、ビルド、または依存関係の表示操作が実行されるときに、自動的に挿入されます。 コンパイラー XML ファイルのフォーマットは、プリプロセッサー XML ファイルのフォーマットとはやや異なります。 ユーザー作成のプリプロセッサーおよびビルダーは、プリプロセッサー XML ファイル・フォーマットに従う必要があります。
コンパイラー XML ファイルに、コンパイル・エラーがあることが示されています。"DSPLAY" was invalid. Skipped to the next verb, period or procedure-name definitionこのエラーは、入力ファイル 1、 SYS09225.T113157.RA000.MEL1.TEMPFILE.H01の 56 行目に関連しています。 コンパイラーは、コンパイラーに送られたファイルに対するエラーしか報告しません。 コンパイラーは、MEL.A001.DATA.COBOL(DEMODATA) を認識しません。 コンパイラーは、入力ファイル番号 1 SYS09225.T113157.RA000.MEL1.TEMPFILE.H01 を認識します。 命名規則から、およびプリプロセッサーおよびコンパイラーを呼び出すために使用された JCL プロシージャーから、SYS09225.T113157.RA000.MEL1.TEMPFILE.H01 は、ジョブが完了したら削除される一時ファイルであるということを判別できます。
- コンパイル・エラーは、ファイル番号 1 に対して報告されました。
- コンパイラー FILEREFERENCETABLE は、ファイル 1 が SYS09225.T113157.RA000.MEL1.TEMPFILE.H01 であることを示しています。
- プリプロセッサー XML ファイルから、OUTFILEREFERENCETABLE にあるファイル SYS09225.T113157.RA000.MEL1.TEMPFILE.H01 を見つけることができます。 この OUTFILENUMBER は 1 です。 そのため、出力ファイル番号は 1 で、出力行番号は 56 です。
oln = 56
ofn = 1STATEMENTTABLE から、iln、および ifn を探す必要があります。ここで、順序付きクワッドは (56,1,iln,ifn) です。 この情報から、以下の値を判別することができます。iln = 54
ifn = 1つまり、コンパイラーがエラーを、ファイル SYS09225.T113157.RA000.MEL1.TEMPFILE.H01 の 56 行目で報告したということです。 この行は、MEL.A001.DATA.COBOL(DEMODATA) の 54 行目に対応します。 コンパイル・エラーは、ファイル MEL.A001.DATA.COBOL(DEMODATA) の 54 行目に対して報告されます。
<?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>