|
 |
|
| |
| |
| Document #5628003 |
| |
| PLC Programmer's Guide Manual |
| |
| Version of 05/31/77 |
| |
| 53 Pages |
| |
|
User's Guide to PL/C
The Cornell Compiler for PL/I
Release 7.6
OS and DOS Versions
May, 1977
Department of Computer Science
Cornell University
Ithaca, N. Y. 14853
This material is not copyrighted. It may be
reproduced, in whole or in part, for any purpose.
PL/C Project: Previous Contributors:
T. Bishop J. Bayard S. Lisberger
Manager H. Cabassa T. London
M. Bodenstein P. Dormont W. Maxwell
R. Conway H. Elder C. Moore
M. Hartstein R. Fisher H. Morgan
L. Silver D. Gries T. Vari
P. Teetor P. Harter R. Wagner
S. Worona P. Hellberg N. Weiderman
Chalmers Univ. T. Wilcox
G. Hillenbrand Univ. Of Illinois
R. Holt J. Wong
T. Kahne W. Worley
P. Krug M. Zelkowitz
Siemens Akt.
The PL/C Project acknowledges the cooperation of the staff of
the Office of Computer Services, Cornell University, John W.
Rudan, Director.
PL/C: The Cornell Compiler for PL/I
PL/C was designed to permit efficient instruction in the PL/I
language. It provides high-speed compilation, reasonably
efficient execution, extraordinary diagnostic assistance and
upward compatibility with the IBM F-level compiler. The PL/C
compiler, but not this User's Guide, is copyright c1975 by
Cornell University.
PL/C does not support the full PL/I language. The major
omissions in Release 7.6 are:
- list processing
- multi-tasking
- compile-time facilities (except for INCLUDE and a
non-PL/I-type macro processor)
- REGIONAL auxiliary files
There are other minor omissions described in Sections D - H of
this Guide.
Some features have been added to PL/C that are not part of
PL/I. These are intended, for the most part, to provide
additional diagnostic facilities. They include special options
on the PUT statement, the FLOW condition, statements to control
FLOW and CHECK printing, and pseudo-comments that can optionally
be converted to source text. These pseudo-comments can be used
to shelter the incompatible PL/C diagostic features so that a
program can still be run under the PL/I(F) compiler.
This User's Guide is not intended to teach a beginner to
write programs in PL/C. It assumes that the reader already
knows PL/I, or is in the process of learning the language from
another source. (See Section M for a list of relevant
textbooks.) This Guide describes how PL/C differs from PL/I(F),
and gives information necessary to use PL/C and interpret output
provided by PL/C. Except as noted to the contrary, material
applies to both the OS and DOS versions of PL/C.
(* denotes major changes from Release 7.5)
contents
Page Section
* 3 A. Deck structure and control cards
* 4 B. Options
* 9 C. Error messages
* 29 D. Summary of differences between PL/C and PL/I
* 32 E. Statements
* 36 F. Attributes
38 G. Built-in functions and pseudo-variables
* 41 H. Conditions
43 I. The MACRO feature
45 J. The INCLUDE feature (not in DOS PL/C)
* 47 K. PL/C Post Mortem Dump Statistics Report
49 L. Efficient programming in PL/C
* 50 M. References and textbooks
Section A. Deck Structure and Control Cards
There are three principal control cards:
$JOB - to begin a program and specify options
$PROCESS - to separate external procedures and specify options
$DATA - to denote the beginning of input data
(not required if no data is present)
Other control cards give additional flexibility in option
specification (see Section B), control the INCLUDE feature (see
Section J), and control the MACRO feature (see Section I).
The control cards described here are only those cards
required by PL/C. The operating system may require other
control cards to precede those shown to invoke the PL/C
compiler, and after those shown to close the job. PL/C will use
whatever region is passed to it by the operating system. With
the usual (overlayed) version of PL/C a minimum region of
approximately 100K is required. 120K is more reasonable and
will accommodate a program of about 200 statements. For a
reentrant version of PL/C, a region of 40K will allow you to run
a 200 statement program. As the program length and number of
identifiers increase more space is required.
PL/C is designed to process a group of independent programs
that will all look like a single job to the operating system.
Each $JOB card reinitializes the compiler to begin a new
program.
PL/C control cards are recognized by a $ in column 1. This
must always be in column 1 -- it is not affected by the SORMGIN
option. This "recognition character" is an installation option
and may be any non-blank character, but this Guide will describe
all control cards as if the character is a $.
A program consisting of a single external procedure and
requiring no data would simply be the following:
$JOB <options>
<source program cards>
A program with two external procedures and data would be:
$JOB <options>
<source cards for external procedure>
$PROCESS <options>
<source cards for external procedure>
$DATA
<data cards>
Note that the control cards are distinct from both program and
data cards. Program statements must not begin on a control
card; data cannot begin on the $DATA card. It is not a good
idea to use data cards with a $ in column 1, since PL/C will
often interpret these as control cards.
Notes for OS installations:
Three parameters are accepted in the EXEC card PARM field: F,
R and SY. F (FREE) specifies that it is permissible to disable
SUBSCRIPTRANGE checking. R (RESTART) specifies that PL/C should
continue processing a job stream even if one or more programs
abnormally terminate. SY (SYSFREE) overrides the amount of core
which PL/C reserves for use by the operating system. If your
program uses ISAM facilities, it is possible that the default
amount of core given to the operating system might not be enough
for the I/O routines to be brought into your region. This might
result in an 804 or 80A ABEND. The correction would be to
increase the SYSFREE value, not the REGION. The syntax is:
SYSFREE=[n|nK]
thus, SYSFREE=10K would reserve 10K for use by the operating
system. The supplied default value is 4K, but this default can
be changed by each installation.
PL/C requires only SYSIN and SYSPRINT DD cards. To specify a
non-default SYSPRINT, the DCB used must include RECFM, LRECL,
and BLKSIZE. For auxiliary files, PL/C will apply the PL/I(F)
defaults for missing DCB options.
Section B. Options
User options may be specified on three different types of
control cards:
$JOB - one such card, defines beginning of new program
$PROCESS - required between external procedures
$OPTIONS - permitted between any two PL/C statements
The individual options on these cards are separated by blanks
and/or commas. The continuation of any of these cards has a $
in column 1 with columns 2 and 3 blank. An individual option
may not be split over a card boundary, and may not have blanks
interspersed (must be dense). Options may be abbreviated (or
misspelled); only a few key letters in each are actually
significant, as indicated after the option in the listing below.
The prefix letters N or NO designate negated options. Certain
of the options can only be given on the $JOB card, as noted.
Options specified on the $JOB card, and the default values
for the options not specified, are in effect throughout the
program, except as overridden by specifications on subsequent
$PROCESS and $OPTIONS cards. After each external procedure,
options are reset to the "global" $JOB and default values. If
the $PROCESS card changes any options, the changes affect only
the one external procedure following that card. Similarly,
specifying an option on a $OPTIONS card changes the option only
for that portion of the one external procedure following the
$OPTIONS card. (To facilitate complete suppression of source
listing, however, specifying NOSOURCE on the $JOB card overrides
any subsequent SOURCE options.)
In the listing below the supplied default value of the option
is underlined, but these choices are easily changed by each
installation, and may therefore differ from what is shown here.
In addition, installations have the capability of over-riding
options so that user specification of those options may be
ineffective.
ATR, NOATR, A
Produce attribute listing.
ALIST, NOALIST, AL
Produce assembler listing of generated object code.
AUXIO=n, AU (on $JOB only)
Limit on number of auxiliary input/output operations.
Supplied default n=10000.
CMNTS, CMNTS=(n1,n2,...), NOCMNTS, C
Comments beginning with : are considered source text.
If parameter(s) are given (1<=ni<=7) comments
beginning with ni are also considered source text.
CMPRS, NOCMPRS, CP
Source listing to be given in compressed form (certain
page ejects replaced by 3 line skips).
CTIME=(m,s.h), CT (on $JOB only)
Time limit for compilation.
m is minutes; assumed zero if omitted.
s is seconds; assumed zero if omitted.
h is hundredths of seconds; assumed zero if
omitted.
DUMP, NODUMP, D, [NO]DUMP=(d1,d2,...), [NO]DUMP=l1l2...
(on $JOB only)
Produce post-mortem dump. Dump options are given
below. For d1,d2,... use the single-letter or full-
name form. For l1l2... only the single-letter form
may be used.
BLOCKS, B
Traceback of blocks active at termination.
SCALARS, S
Final values of scalar variables in active
blocks. (Implies B.)
ARRAYS, A
Final values of arrays in active blocks.
(Implies S and B.)
FLOW, F
History of last 18 transfers of control, if
the FLOW condition is enabled.
LABELS, L
List of labels with frequency of encounter.
ENTRIES, E
List of entry-names with frequency of call.
REPORT, R
Statistics on run (time, core usage,
auxiliary I/O operations, etc, See Section
K.)
Depth
An integer giving limit on number of active
blocks for B, S and A dump options. If 0 is
given, depth is unlimited.
UNREAD, U
List of first 5 or fewer unread data cards.
DFLTS,D
Equivalent to specifying the installation
defaults.
Supplied default DUMP options are (S,F,L,E,R,U).
DUMPE, NODUMPE, DE, [NO]DUMPE=(d1,d2,...), [NO]DUMPE=l1l2...
(on $JOB only) Produce post-mortem dump only if error
was encountered during execution.
Supplied default DUMPE options are (S,F,L,E,R,U).
DUMPT, NODUMPT, DT, [NO]DUMPT=(d1,d2,...), [NO]DUMPT=l1l2...
(on $JOB only) Produce post-mortem dump only if
execution was terminated by an error.
Supplied default DUMPT options are (S,F,L,E,R,U).
DUMPS, NODUMPS, DS, [NO]DUMPS=(d1,d2,...), [NO]DUMPS=l1l2...
(on $JOB only) Specifies all three of DUMP, DUMPE and
DUMPT.
ERRORS=(c,r), E (on $JOB only)
Suppress execution if c or more compile errors.
If c=0 suppress execution unconditionally.
Terminate execution after r runtime errors.
If r=0 there is no limit on runtime errors.
Supplied default c=50, r=50. Maximum for each is 255.
ETIME=(m,s.h), ET (on $JOB only)
Time limit for execution.
m is minutes; assumed zero if omitted.
s is seconds; assumed zero if omitted.
h is hundredths of seconds; assumed zero if
omitted.
FLAGE, FLAGW, FE, FW
FLAGW prints both warnings and error messages.
FLAGE suppresses warnings.
HDRPG, NOHDRPG, H (on $JOB only)
Print header/separator page before program.
ID='name', I (on $JOB only)
Program identification name (20 characters maximum).
Supplied default name = '*** NO ID ***'
LINES=n, L (on $JOB only)
Maximum number of lines to be printed.
Supplied default n=32767.
LINECT=n, LC
Lines to be printed per page during compilation.
Supplied default n=60. (Use PAGESIZE option of OPEN
statement to control runtime page size.)
MCALL, NOMCALL, MC
Print macro calls.
MONITOR, NOMONITOR, M,[NO]MONITOR=(d1,d2,..), [NO]MONITOR=l1l2..
The MONITOR option specifies that an error message is
to be given whenever a program uses a MONITORed
feature. The error will count towards the compile- or
run-time error limit, and the standard PL/C correction
will be applied.
MONITOR options are given below. For d1,d2... use the
single-letter or full-name form. For l1l2... only the
single-letter form may be used.
BNDRY, B
Monitor strings and comments extending over
card boundaries.
UDEF, U (on $JOB only)
Monitor use of uninitialized variables.
SUBRG, S (on $JOB only)
Monitor subscripts (i.e. disallow the
NOSUBRG condition prefix).
AUTO, A (on $JOB only)
Monitor implied arithmetic/string conversion.
DFLTS, D (on $JOB only)
Equivalent to specifying the installation
defaults.
Only the listed options are altered (i.e. turned on or
off) except when MONITOR is used on the $JOB card. In
this case, the designated options are turned on, and
all others are turned off.
For compatibility with previous releases of PL/C, the
BNDRY, UDEF, and FREE options will be accepted outside
of a MONITOR specification.
MTEXT, NOMTEXT, MT
Print macro text expansion.
M91, NOM91, M9 (on $JOB only)
Generate code to run on 360 Model 91.
OPLIST, NOOPLIST, O
Print list of options in effect.
PAGES=n, P (on $JOB only)
Maximum number of pages to be printed.
Supplied default n=10.
SORMGIN=(s,e), SORMGIN=(s,e,c), SM
Establish source card margins:
s is first column scanned; supplied default s=2.
e is last column scanned; supplied default e=72.
c is carriage control column;
supplied default c=1.
SOURCE, NOSOURCE, S
Print source program listing.
TIME=(m,s.h), T (on $JOB only)
Time limit (compilation + execution).
m is minutes; assumed 0 if omitted.
s is seconds; assumed 0 if omitted.
h is hundredths of seconds; assumed zero if
omitted.
Supplied default is TIME=(0,2.00)
The CTIME, ETIME, and TIME options serve to limit
the compilation, execution, and job times,
respectively. The order in which the options are
specified is irrelevant. The time limit for the
compilation phase is equal to the CTIME limit if it is
specified, or to the TIME limit if it is not. The
CTIME limit must not be greater than the TIME limit.
If ETIME is specified, the time limit for the
execution phase is the smaller of the ETIME limit and
the TIME limit less the actual compilation time. If
ETIME has not been specified, the execution time limit
will be the TIME limit less the actual compilation
time. The ETIME limit may not be greater than the
TIME limit. If both CTIME and ETIME limits are
specified, but TIME isn't, then CTIME is simply the
compilation limit, and ETIME is the execution limit.
TABSIZE=n, TS (on $JOB only)
Determines amount of PL/C region allocated to symbol
table. n given in fullwords.
Supplied default is 1/2 of usable area, up to 32768
fullwords.
XREF, NOXREF, X
Produce cross-reference listing.
Section C. Error Messages
In the text of the following messages, the upper-case letters
are shown as they appear on the PL/C program listing, but the
lower-case words are replaced by variable information as
follows:
iden -a variable or label name will be printed
string -a character string will be printed
number -a fixed or floating point number will be printed
rtn -the name of a subroutine will be printed
line -a statement number will be printed
attribute -an attribute will be printed
The error message numbers in PL/C are prefixed with a two
letter code indicating the phase in which the error occurred.
The codes and their meanings are:
SY or MD syntactic analysis phase
(MD for errors during macro definitions)
SM semantic analysis phase
XR cross reference phase
CG code generation phase
EX execution phase
PM post-mortem dump phase
One group of messages, numbered E2-EA, can appear in any phase
of the compiler. The prefix given will be that for the phase in
which the error occurs. All of the other messages appear in
only one phase, as listed below.
A line referring to a PROGRAM CHECK or a COMPILER ERROR
indicates a problem in the PL/C compiler and not a user error
(although it most often occurs in response to some user error.)
Please bring such programs to the attention of your systems
programming staff so that the PL/C Project will be notified.
Variable Prefix Errors that can occur in any Phase
NUMBER MESSAGE
E2 ERROR LIMIT EXCEEDED
E3 LINE LIMIT EXCEEDED
E4 PAGE LIMIT EXCEEDED
E5 TIME LIMIT EXCEEDED
E6 TIME LIMIT EXCEEDED - PROBABLE COMPILER LOOP
(the specified time limit has expired and an
additional second has passed without the completion
of a source statement. This is probably a compiler
error, see beginning of Section C.)
E7 I/O ERROR: string
(the operating system reported a "SYNAD"-type
I/O error. The string given is the SYNADAF
message. See appropriate IBM system manuals.)
E8 UNABLE TO PROCESS INCLUDE COMMAND
(see Section J)
E9 SYMBOL-TABLE OVERFLOW. USE LARGER REGION OR INCREASE
TABSIZE.
(see TABSIZE option in Section B)
EA COMPILER ERROR IN ERROR-MESSAGE WRITER.
(a compiler error, see beginning of Section C)
SY or MD Prefix Errors during the Syntactic Analysis Phase
In some cases, particularly in declarations, errors are
discovered too late in the analysis of the statement for PL/C to
conveniently correct the text of the statement. The internal
form of the program has been altered to a correct construction
(often just a null statement) but the usual display of corrected
source text is omitted. Messages that frequently are issued in
such circumstances are marked with a * in the following list.
NUMBER MESSAGE
00 MISSPELLED KEYWORD
(apparent misspelling of one of the reserved
keywords. See list under DECLARE in Section E.)
01 EXTRA (
(deleted)
02 MISSING (
(supplied)
03 EXTRA )
(deleted)
04 MISSING )
(possibly missing operator, right paren is supplied)
05 EXTRA COMMA
(deleted)
06 MISSING COMMA
(supplied)
07 EXTRA SEMI-COLON
(deleted)
08 MISSING SEMI-COLON (OR MISUSE OF RESERVED WORD)
(A semi-colon is supplied. A frequent cause of
this error is the use of a reserved keyword as an
identifier. This forces the start of a new statement
so the statement prematurely ended apparently lacks
a semi-colon. The user may need to choose a non-
reserved identifier rather than supply a semi-colon)
09 MISSING :
(supplied)
0A MISSING =
(supplied)
0B * IMPROPER ATTRIBUTE ON PARAMETER
0C INEFFECTIVE IF
(warning; a pointless IF statement has been given.
The THEN unit is null and there is no ELSE unit.)
0D * IMPROPER ENTRY/RETURNS ATTRIBUTE
0E MISSING END
($PROCESS, $DATA, or end of program encountered
with a block still open; END supplied)
0F MISSING KEYWORD
(the required keyword is supplied)
10 INCOMPLETE EXPRESSION
11 MISSING EXPRESSION
12 MISSING VARIABLE
13 MISSING ARGUMENT, 1 SUPPLIED
14 EMPTY LIST
15 IMPROPER NOT
(¬ cannot be used as a binary operator,
¬= substituted)
16 IMPROPER ELEMENT
(an element that won't fit has been discarded)
17 IMPROPER SYNTAX, TRANSLATION SUSPENDED
(The statement has been abandoned and replaced by
a null statement. PL/C scans ahead for a semi-colon
or reserved word to start the next statement.)
18 INCONSISTENT OPTION, STATEMENT DELETED
(After the statement was completed, it was found
to contain inconsistent options. It is deleted and
replaced by a null statement.)
19 NOT ENOUGH CORE, TRY LARGER REGION.
(program will not be executed as is)
1A NESTING TOO DEEP
(nesting depth exceeds capacity of PL/C. See
restrictions in Section D.)
1B INACCESSIBLE STATEMENT
(warning; this statement cannot be reached in
execution)
1C MISSING MAIN PROC
(warning; no procedure has OPTIONS(MAIN)
phrase; the first procedure is assumed to be MAIN)
1D MISSING PROCEDURE STATEMENT
(A statement is not contained in an external proc,
or an identifier declared ENTRY appears as a
non-entry label. A PROC statement is supplied
by PL/C. This condition is sometimes a by-product
of another error; for example, an extra END in the
interior of a procedure ends it prematurely and
causes subsequent statements to be apparently
outside of any procedure.)
1E MISSING $PROCESS (OR EXTRA END)
(either the required $PROCESS between external
procedures has been omitted, or an extra END has
prematurely ended a procedure. PL/C supplies a
$PROCESS)
1F MISPLACED ENTRY STATEMENT
(ENTRY cannot be in a BEGIN block or in an
iterative DO loop)
20 IMPROPER OPTION(S)
(improper option on statement, or invalid option
on $JOB, $PROCESS or $OPTIONS card. See Section B.)
21 IMPROPER FORMAT ITEM
22 IMPROPER I/O PHRASE
23 IMPROPER TO PHRASE
24 IMPROPER BY PHRASE
25 IMPROPER WHILE PHRASE
26 IMPROPER SPECIFICATION
(error in iteration specification of DO statement)
27 MULTIPLE DECLARATION
(This identifier has already been used in a way that
precludes its appearance here. In most contexts the
identifier is replaced by a new identifier generated
by PL/C.)
28 * IMPROPER attribute ATTRIBUTE FOR iden
(the attribute indicated cannot be applied to this
identifier, usually because of previous attributes)
29 IMPROPER FACTORING
2A * IMPROPER DIMENSION
2B * IMPROPER PRECISION
2C * IMPROPER SCALE
2D * IMPROPER VARYING ATTRIBUTE
(string type not specified; VARYING deleted)
2E IMPROPER FILE-NAME
(the identifier in a FILE phrase is not a valid
file-name)
2F EXTERNAL NAME TOO LONG
(warning, PL/I allows a maximum of 7 characters
for an identifier in this context)
30 * IMPROPER INIT ATTRIBUTE
(INITIAL is incompatible with previous attributes)
31 * IMPROPER STRUCTURE LEVEL
(This may be improper construction of a structure
declaration. It also arises from any stray
integer in a faulty declaration.)
32 * IMPROPER ATTRIBUTE IN STRUCTURE
(major and minor structure names cannot have type
attributes, leaves cannot have storage class attr)
33 TOO MANY IDENTIFIERS
(there is a PL/C limit of 88 identifiers in a
single factor or structure; program is not executed)
34 IMPROPER THEN OR ELSE
(THEN or ELSE given on a statement not following
an IF)
35 IMPROPER THEN OR ELSE UNIT
(This statement is not allowed as a THEN|ELSE
unit. ELSE is deleted; null statement inserted
after THEN.)
36 MISSING THEN
(THEN supplied)
37 IMPROPER CHECK OR NOCHECK
(prefix applied to a statement other than
BEGIN or PROCEDURE; prefix deleted)
38 IMPROPER PREFIX ORDER
(warning- executes correctly under PL/C
but incompatible with PL/I(F))
39 EXTRA LABEL
3A IMPROPER LABEL
3B MISSING LABEL OR ENTRY NAME
(a new identifier is generated by PL/C)
3C IMPROPER ON-CONDITION
(often triggered by an extra left paren, as for
example around the left side of an assignment,
which is taken to be the beginning of a condition
prefix)
3D IMPROPER ON-UNIT
(This statement is not allowed as a simple ON-unit.
BEGIN and END are supplied.)
3E IMPROPER SPACE
('NO' is improperly separated from rest of keyword.
Space is removed. Example: NO CHECK becomes NOCHECK)
3F PL/I FEATURE NOT IN PL/C
(the feature used is not included in current PL/C)
40 FEATURES INCOMPATIBLE WITH PL/I(F) HAVE BEEN USED
(warning; an incompatible PL/C feature has been used
and is not enclosed in a pseudo-comment. The
program will not be accepted by PL/I(F).)
41 INCOMPATIBLE OPTION
42 MISSING OPTION
43 IMPROPER LOGICAL UNIT
(DOS only: improper logical unit in MEDIUM option
of ENVIRONMENT attribute)
44 MISSING DECIMAL INTEGER
45 NON-* BOUND/LENGTH FIELD
(* and not an expression must be given for subscript
bound or string length in this context)
46 DECLARATION FOR ENTRY iden DOES NOT AGREE WITH
CORRESPONDING PROC OR ENTRY POINT. DCL IGNORED.
47 PROCEDURE iden IS NOT PRESENT
(iden has been declared as an entry-name, but
no corresponding procedure definition appears)
48 *-LENGTH NOT ALLOWED. 256 USED
49 TOO MANY DIGITS IN EXPONENT
4A ILLEGAL EXPONENT
(illegal character appeared after E. A space is
inserted before the E.)
4B ILLEGAL BINARY NUMBER
(it is treated as decimal)
4C ILLEGAL USE OF COLUMN 1 ON CARD
(if SM=(2,X,1) the value in column 1 is con-
catenated with the string beginning in column 2)
4D */ NOT IN COMMENT
(it is ignored)
4E NAME > 31 CHARACTERS
(full name is used by PL/C, but PL/I would use the
first 16 and last 15 characters)
4F ILLEGAL CHARACTER
(it is ignored)
50 STRING CONSTANT RUNS ACROSS CARD BOUNDARY
(a ' is supplied)
51 IMBEDDED BLANK(S) IN OPERATOR
(the blanks are ignored. Example: * * becomes **)
52 COMMENT RUNS ACROSS CARD BOUNDARY
(the comment is terminated at the end of the card)
53 2 DECIMAL POINTS IN NUMBER
(number is ended before the 2nd decimal point)
54 EXPONENT RUNS ACROSS CARD BOUNDARY
(it is ignored)
55 SPACE MISSING BETWEEN NUMBER AND LETTER
(required space is supplied)
56 MISSING */ BEFORE END OF FILE OR CONTROL CARD
57 INVALID BIT STRING
58 MISSING QUOTE BEFORE END OF FILE OR CONTROL CARD
59 STRING LENGTH > 255
5A MISPLACED $MEND CARD
5B ERROR STACK OVERFLOW - MESSAGE(S) LOST
5C TABSIZE TOO LARGE. number IS USED
5D OPTION(S) NOT ALLOWED AT THIS INSTALLATION
(option specified on $JOB, $PROCESS or $OPTIONS
card is prohibited by this installation)
5E TOO MANY SIGNIFICANT DIGITS, 16 USED
5F TOO MANY SIGNIFICANT DIGITS, 53 USED
60 MACROS NOT ALLOWED. COMPILATION TERMINATED.
(macros prohibited by this installation)
61 TOO MANY OPERANDS IN CHECK OR FLOW STATEMENT.
62 NUMBER TOO LARGE/SMALL, number USED
(0 or 10**75 is supplied, as appropriate)
63 MISSING $MEND BEFORE END OF FILE OR CONTROL CARD
64 MISSING MACRO NAME
65 MISSING %; BEFORE END OF FILE OR CONTROL CARD
66 MACRO NAME ILLEGAL OR ALREADY IN USE
67 MISSING PARAMETER NAME IN MACRO DEFINITION
68 MACRO PARAMETER NAME > 31 CHARACTERS. FIRST 31 USED.
69 TOO MANY MACRO PARAMETERS. LIST TRUNCATED.
6A MACRO PARAMETER NAME APPEARS TWICE IN LIST.
6B SYMBOL TABLE AREA OVERFLOW. INCREASE CORE AVAILABLE.
6C ILLEGAL CHARACTER(S) ON CARD. BLANK(S) USED.
6D MACRO EXPANSION CAUSES REPRINTING OF ABOVE LINE
6E DYNAMIC CORE OVERFLOW DURING MACRO EXPANSION.
INCREASE REGION.
70 COMPILER ERROR--ILLEGAL INTERNAL MACRO PARM ID.
(compiler error, see beginning of Section C)
71 MISSING ( IN MACRO CALL
72 MACRO ARGUMENT > 256 CHARACTERS. FIRST 256 USED.
73 TOO FEW ARGUMENTS IN MACRO CALL.
NULL STRING(S) SUPPLIED.
74 MISSING COMMA IN MACRO CALL
75 MISSING ) IN MACRO CALL
76 END OF FILE OR CONTROL CARD WITHIN MACRO CALL
77 PICTURE SPECIFICATION FOR iden TOO LONG;
COMPLEX ATTRIBUTE DELETED
78 NUMERIC SPECIFICATION FOLLOWING SIGN
IN PICTURE SPECIFICATION
79 IMPROPER NUMERIC SPECIFICATION FOLLOWING V
IN PICTURE SPECIFICATION
7A IMPROPER CHARACTER IN CHARACTER PICTURE SPECIFICATION
7B MORE THAN ONE SIGN OR CR/CB IN PICTURE SPECIFICATION
7C MORE THAN ONE V IN PICTURE SPECIFICATION
7D V IN EXPONENT IN PICTURE SPECIFICATION
7E MORE THAN ONE E OR K IN PICTURE SPECIFICATION
7F MISSING EXPONENT FIELD IN PICTURE SPECIFICATION
80 INCOMPLETE CR/DB IN PICTURE SPECIFICATION
81 CR/DB USED IN FLOATING PICTURE SPECIFICATION
82 MIXED Z AND * IN PICTURE SPECIFICATION
83 Z OR * FOLLOWS 9,I,R OR T IN PICTURE SPECIFICATION
84 Z OR * FOLLOWS DRIFTING FIELD IN PICTURE SPECIFICATION
85 INVALID Z OR * FOLLOWING V IN PICTURE SPECIFICATION
86 A OR X USED IN NUMERIC PICTURE SPECIFICATION
87 F USED IN FLOATING PICTURE SPECIFICATION
88 CHARACTER(S) FOLLOWING SCALE FACTOR
IN PICTURE SPECIFICATION
89 VALUE OF REPETITION FACTOR TOO LARGE
IN PICTURE SPECIFICATION
8A CR/DB OR MISPLACED SIGN IN FLOATING PICTURE
SPECIFICATION. EXPONENT DELETED
8B MORE THAN ONE DRIFTING FIELD IN PICTURE SPECIFICATION
8C PL/I RESTRICTS THE USE OF S + - $
IN FLOATING PICTURE SPECIFICATION
8D TOO MANY $'S IN PICTURE SPECIFICATION
8E ILLEGAL PICTURE SPECIFICATION. SEE STMT line
8F SCALE FACTOR IS < -128 OR > 127
IN PICTURE SPECIFICATION
90 NO DIGITS SPECIFIED IN NUMERIC PICTURE SPECIFICATION
91 MORE THAN 15 DIGITS SPECIFIED IN FIXED NUMERIC
PICTURE SPECIFICATION
92 MORE THAN 16 DIGITS SPECIFIED IN FLOAT NUMERIC
PICTURE SPECIFICATION
93 EXPONENT MORE THAN 2 DIGITS LONG
IN PICTURE SPECIFICATION
94 TOO MANY DIGITS IN SCALE OR REPETITION FACTOR
IN PICTURE SPECIFICATION
95 NON-NUMERIC CHARACTER IN SCALE OR REPETITION FACTOR
IN PICTURE SPECIFICATION
96 INVALID CHARACTER IN PICTURE SPECIFICATION
97 PICTURE SPECIFICATION IS TOO LONG
SM Prefix Errors during the Semantic Analysis Phase
When statements in error are reconstructed during the semantic
analysis phase, an additional line is printed, labeled DECLARED
IN BLOCK. This line specifies the block in which each variable
has been declared.
NUMBER MESSAGE
40 VARIABLE NOT PERMITTED
(must have constant in this context)
41 WRONG TYPE FOR EXPRESSION
(expression types are arithmetic, string, label,
or file, and the wrong one has been used here.)
42 WRONG STRUCTURE OR DIMENSIONALITY FOR EXPRESSION
(scalar needed where an array or matching structure
has been used)
43 ILLEGAL SUBSCRIPTING
(subscripts are not allowed in certain contexts,
e.g., GET DATA)
44 ILLEGAL USE OF PSEUDO-VARIABLES
(e.g., CHECK prefixes, GET/PUT DATA)
45 NAME NEEDED
(in this context, e.g., initializing label constants
46 ENTRY-NAME NEEDED
(CALL must have entry name)
47 NO STRUCTURE APPEARED
(in BY NAME assignment)
48 STRUCTURES DO NOT MATCH
(in BY NAME assignment)
49 FUNCTION ARGUMENTS MISSING
4A OPERAND OF BINARY OPERATOR string HAS IMPROPER TYPE
4B OPERANDS OF BINARY OPERATOR string DISAGREE IN TYPE,
STRUCTURE OR DIMENSIONALITY
4C OPERAND OF UNARY OPERATOR string HAS IMPROPER TYPE
4D SUBSCRIPT number OF iden NOT NUMERIC
4E iden HAS TOO MANY SUBSCRIPTS. SUBSCRIPT LIST DELETED
4F iden HAS TOO FEW SUBSCRIPTS. SUBSCRIPT LIST DELETED
50 NAME NEVER DECLARED, OR AMBIGUOUSLY QUALIFIED
(expression replaced or CALL deleted)
51 SUBSCRIPT number OF iden NOT SCALAR
52 iden HAS TOO MANY ARGUMENTS. FUNCTION
REFERENCE DELETED
53 ARGUMENT number OF FUNCTION iden DISAGREES
WITH CORRESPONDING PARAMETER
54 iden HAS TOO FEW ARGUMENTS. FUNCTION
REFERENCE DELETED
55 ARGUMENT number OF FUNCTION iden WAS *.
ILLEGAL ARGUMENT.
56 TABLE OVERFLOW. EXPRESSION DELETED
(processing expression. Try larger region.)
57 TABLE OVERFLOW. EXPRESSION DELETED
(processing expression skeleton, try larger region.)
58 TABLE OVERFLOW. EXPRESSION DELETED
(processing expression tree. Try larger region.)
59 TABLE OVERFLOW. EXPRESSION DELETED
(processing entry parameter. Try larger region.)
5A iden HAS WRONG # OF SUBSCRIPTS
(BY NAME assignment. Structures don't match)
5B MISMATCHED DIMENSIONALITY
(BY NAME assignment. Structures don't match)
5C ILLEGAL LABEL VARIABLE iden
(subscripted label not declared in block)
5D ILLEGAL ASSIGNMENT TARGET
5E ASSIGNMENT SOURCE INCOMPATIBLE WITH TARGET
5F MAJOR STRUCTURE NAME NEEDED
60 DEFAULT ATTRIBUTES FOR ENTRY NAME iden CONFLICT
WITH RETURNS OPTION IN STMT line
61 iden IS ASSUMED A USER-DEFINED NAME,
NOT A BUILT-IN FUNCTION
(warning)
XR Prefix Errors during the Cross-Reference Phase
NUMBER MESSAGE
62 NOT ENOUGH CORE FOR CROSS-REFERENCE.
(use larger region)
63 CROSS REFERENCE ABBREVIATED DUE TO LACK OF SPACE.
(use larger region)
64 COMPILER ERROR IN XREF PHASE--INVALID STATEMENT CODE.
(a compiler error, see beginning of Section C)
CG Prefix Errors during the Code Generation Phase
NUMBER MESSAGE
00 FORMAT WILL BE EXECUTED ONLY ONCE
(the format specification of the EDIT statement
does not contain any format items which would cause
data to be transferred between the I/O list and the
I/O buffer --i.e. No A,B,C,E,F or R format
item. If run under PL/I(F) the program would loop)
01 CONSTANT BOUND, LENGTH, SUBSCRIPT OR ITERATION FACTOR
EXCEEDS 32767 IN MAGNITUDE. 10 IS USED.
(PL/I language restriction)
02 WORKSPACE OVERFLOW IN STATEMENT PROCESSING
(the combined nesting of BEGIN and PROCEDURE
blocks, iterative DO groups, and IF statements is
too deep for the code generation phase. The rest of
the program is not scanned for code generation
errors. Increasing the region size will not help.
The nesting depth must be reduced)
03 iden REQUIRES TOO MUCH SPACE. UPPER BOUND OF
SUBSCRIPT number IS SET TO LOWER BOUND
(more than 2**31 bytes would be required for the
array as declared)
04 PRIMARY DATA STORAGE AREA FOR BLOCK # number
EXCEEDS SIZE LIMIT BY number BYTES.
(primary data storage does not include space for
arrays or strings. Try adding some more BEGIN
blocks)
05 LENGTH OF iden ( number ) IS NOT IN PROPER
RANGE. 80 IS USED.
(length is <0 or > 256)
06 iden REQUIRES TOO MUCH SPACE. LOWER BOUND OF
SUBSCRIPT number IS SET TO ZERO.
(the array element with all subscripts zero must
be within 2**31 bytes of the array element with all
subscripts at their lower bound. Move the lower
bounds closer to zero and resubmit)
07 ARITHMETIC FIRST ARGUMENT TO SUBSTR PSEUDO-VARIABLE.
A STRING TEMPORARY IS USED.
(arithmetic argument remains unchanged)
08 SEVERE ERRORS. EXECUTION SUPPRESSED.
(a previous code generation error has made it
impossible to continue into execution. All code
generation errors have been reported)
09 CONVERSION REQUIRED TO MATCH ARGUMENT iden OF iden
(warning. PL/C has generated code to convert the
argument of a procedure call so that the attributes
of the value passed will match the attributes of the
corresponding parameter. PL/I(F) would not do this
conversion because the attributes of the parameter
have not been specified in an ENTRY declaration)
0A SCALAR ARGUMENT SUPPLIED TO AGGREGATE PARAMETER iden
OF iden . ((1:10) USED FOR ALL BOUNDS.)
(this is a PL/C restriction, see Section E.
Assign the constant to an array with the proper
bounds and pass that array to the procedure.)
0B WORKSPACE OVERFLOW IN EXPRESSION PROCESSING
(either the situation which would generate error
CG02 exists or the nesting of array expressions,
array subscripting, function references, or paren-
thesized expressions is too deep. Simplify the
expression. Increasing region size will not help)
0C NO FILE SPECIFIED. SYSIN/SYSPRINT ASSUMED.
(warning)
0D iden IS A PARAMETER IN I/O LIST OR CHECK PREFIX
(warning. PL/I(F) does not allow parameters in
DATA- directed I/O lists nor in CHECK prefixes.
PL/C will accept the parameter)
0E BOTH FORMS OF INITIALIZATION USED FOR LABEL VARIABLE
iden
(PL/I(F) does not permit a LABEL variable to be
initialized via both the INITIAL attribute and
subscripted statement label constants. Both forms
are accepted by PL/C. Where there is conflict the
INITIAL attribute takes precedence)
0F STORAGE CAPACITY IS EXCEEDED
(object code exceeds available space,
specify larger region)
10 ILLEGAL COMPLEX COMPARE. REAL PARTS WILL BE COMPARED
11 iden IS ILLEGAL OPERAND IN INITIAL, LENGTH
OR DIMENSION ATTRIBUTE OF STATIC VARIABLE.
constant IS USED.
(the bounds, lengths, and iteration factors used
with a STATIC or EXTERNAL variable must
be optionally signed decimal constants. A non-
constant has appeared in this context and has been
replaced by a constant of appropriate type)
12 NON-CONSTANT OPERAND( iden ) IN INITIAL, LENGTH
OR DIMENSION ATTRIBUTE OF STATIC VARIABLE.
(warning: a STATIC or EXTERNAL variable, BUILT-IN
function, EXTERNAL user-defined function has
been used in the bounds, length, or iteration
factor for a STATIC/EXTERNAL variable. This is
not allowed in PL/I. PL/C uses the value of the
operand in error)
13 PL/C BUILT-IN FUNCTION USED.
(warning. A builtin function that is not included
in PL/I(F) has been used)
14 ARGUMENT TO MAX OR MIN IS COMPLEX. REAL PART IS USED.
15 NO SCALE FACTOR ARGUMENT APPEARED. RESULT IS SET FLOAT.
(see explanation of error CG16)
16 UNNECESSARY SCALE FACTOR ARGUMENT APPEARED. RESULT IS
SET FIXED.
(for ADD, DIVIDE or MULTIPLY, both a precision
argument (P) and a scale factor argument
(Q) must be present if the result is to have FIXED
scale. Only argument P may appear if the result
is to have FLOAT scale. If either requirement
is violated, PL/C converts the argument to the
scale implied by the number of arguments given)
17 ARGUMENT SHOULD BE AN ARITHMETIC CONSTANT. 10 IS USED.
(certain arguments to the builtin functions ADD,
BINARY, DECIMAL, DIVIDE, FIXED, FLOAT, MULTIPLY,
PRECISION and ROUND must be decimal constants
in PL/I(F))
18 ABS(ARGUMENT) > 32767. 10 IS USED.
(constant arguments to builtin functions mentioned
in explanation of error CG17 must be less than
32768 in magnitude)
19 ARGUMENT SHOULD BE REAL. IMAGINARY PART IS USED.
(constant of the form "nI" appeared where real
constant was required. The "I" is ignored)
1A ILLEGAL COMPLEX ARGUMENT. REAL PART IS USED.
1B ILLEGAL ARGUMENT TO BUILT-IN FUNCTION. SHOULD BE REAL,
FIXED DECIMAL CONSTANT.
(warning: PL/I(F) requires that certain arguments
of the built-in functions BIT, CHAR, HIGH, LOW, and
REPEAT be unsigned decimal constants. PL/C will
take the argument as written)
1C RESULT SCALE FACTOR = number >127 IN MAGNITUDE. RESULT
SCALED INCORRECTLY TO 127*SIGN( number )
(following the rules for PL/I expression evaluation,
the scale factor ,q, of the result would be outside
the permitted range -127 to 127. So that execution
may be attempted, the result is scaled to the
closest bound of the legal range. The value of the
result will be incorrect)
1D PROGRAM MAY LOOP IF THIS FORMAT IS EXECUTED
(the FORMAT statement does not specify a data trans-
mission format item. See explanation of error CG00)
1E VARIABLE iden HAS A * BOUND OR LENGTH FIELD.
10 IS USED.
(only parameters in PL/C may have * bound or
length)
1F PARAMETER iden HAS A NON-* BOUND OR LENGTH FIELD
(parameters must have a * in this field in PL/C)
20 LOWER BOUND OF SUBSCRIPT number
OF iden EXCEEDS UPPER BOUND. (0:10) IS USED.
21 SPECIFIED P( number ) TOO LARGE. MAX
PRECISION IS USED.
(installation maximum precision, e.g. 31 for FIXED
BINARY, 15 for FLOAT DECIMAL)
22 STRING ARGUMENT TO COMPLEX PSEUDO-VARIABLE.
(THE ASSIGNMENT IS PERFORMED ANYWAY.)
23 TOO MANY ERRORS DURING COMPILATION. EXECUTION
SUPPRESSED.
24 COMPILER ERROR DURING CODE GENERATION. PROGRAM ABORTED.
(a compiler error, see beginning of Section C)
25 ILLEGAL ARGUMENT TO REAL OR IMAG PSEUDO-VARIABLE.
(THE ASSIGNMENT IS PERFORMED ANYWAY.)
(argument must be COMPLEX arithmetic)
26 IMPLIED ARITHMETIC/STRING CONVERSION INVOKED.
(MONITOR message. Conversion is performed)
27 STRING CONSTANT IN INITIAL, LENGTH OR DIMENSION
ATTRIBUTE OF STATIC VARIABLE.
(conversion is performed)
28 BIT STRING IN GET OR PUT STRING. STATEMENT DELETED.
EX Prefix Errors during the Execution Phase
NO ON MESSAGE
CODE
00 0004 PROGRAM RETURNS FROM MAIN PROCEDURE.
01 0004 PROGRAM IS STOPPED.
(normal termination-- a STOP or EXIT has
been executed)
02 0070 END OF FILE REACHED.
(the ENDFILE condition is raised. System action
terminates the program.)
03 0300 EXPONENT OVERFLOW. RESULT IS SET TO 1.
04 0300 EXPONENT OVERFLOW. RESULT IS LEFT UNCHANGED.
05 0310 FIXED-POINT OVERFLOW.
(low order digit set to 1)
06 0310 FIXED-DECIMAL OVERFLOW.
07 0310 NUMBER TOO LARGE TO CONVERT TO FIXED BINARY. 1 IS USED.
08 0320 FIXED-POINT QUOTIENT TOO LARGE. PROBABLE DIVISION BY 0.
RESULT IS SET TO 0.
09 0320 FIXED-POINT QUOTIENT TOO LARGE. PROBABLE DIVISION BY 0.
RESULT IS LEFT UNCHANGED.
0A 0320 FLOATING-POINT DIVISION BY 0. RESULT IS SET TO 1.
0B 0320 FLOATING-POINT DIVISION BY 0. RESULT IS LEFT UNCHANGED.
0C 0330 EXPONENT UNDERFLOW. RESULT IS SET TO 0.
0D 0330 EXPONENT UNDERFLOW. RESULT IS LEFT UNCHANGED.
0E 0340 SIZE RAISED. RESULT IS LEFT UNCHANGED.
(occurs when the value of an expression is assigned
to a variable whose precision is too small to hold
the value. In PL/C, no left-truncation occurs.
Instead the computed value is assigned to the
variable, regardless of its declared precision.)
0F 0340 SIZE RAISED DURING CONVERSION. RESULT IS SET TO 0.
10 0340 SIZE RAISED DURING STRING-TO-ARITHMETIC CONVERSION.
VALUE USED IS number
11 0340 NUMBER TOO LARGE TO CONVERT TO SPECIFIED BIT STRING.
(SIZE CONDITION) NUMBER IS number
STRING USED IS string
12 0340 RESULT OF BIT-TO-ARITHMETIC CONVERSION GREATER THAN
2**56-1. (SIZE CONDITION) STRING IS string
VALUE USED IS number
13 0341 NUMBER TOO LARGE FOR FIELD. TRUNCATED ON LEFT.
FULL FIELD WOULD BE string
(in a PUT statement, the value is too large to fit
in the specified field (for EDIT) or the field
implied by the attributes of the item (for LIST).
Signs and digits are lost on the left as in PL/I.
The message indicates the full field before
truncation.)
14 0350 INDEX OF SUBSTRING < 1 (number)
(second argument of SUBSTR is less than one)
15 0350 INDEX OF SUBSTRING (number) > STRING LENGTH (number)
(second argument of SUBSTR is greater than
the length of the first argument)
16 0350 LENGTH OF SUBSTRING < 0 (number)
(value of third argument of SUBSTR is negative.
It is replaced by 0.)
17 0350 SUBSTRING REQUESTED RUNS OVER END OF STRING
19 0520 SUBSCRIPT number OF iden IS OUT OF BOUNDS (number).
number IS USED.
1A 0602 TOO MANY CHARACTERS FOLLOWING CLOSING QUOTE. ALL ARE
IGNORED. FIELD IS string
1B 0603 TOO MANY DIGITS IN NUMBER, PRECISION LOST.
STRING IS string
1C 0604 TOO MANY EXPONENT DIGITS, EXTRA DIGITS IGNORED.
STRING IS string
1D 0605 INVALID CHARACTER(S) IN FIELD. 0 USED FOR EACH.
ORIGINAL STRING IS string
FIRST BAD CHARACTER IS string
(the CONVERSION condition has been raised)
1E 0615 ILLEGAL CHARACTER(S) IN CHARACTER-TO-BIT CONVERSION.
0'S USED.
1F 0900 ATTEMPT TO USE MATH BUILTIN FUNCTION IN "CALL"
STATEMENT. STATEMENT IGNORED.
20 0901 iden REFERENCED RECURSIVELY. "RECURSIVE" ATTRIBUTE
HAS NOW BEEN APPLIED.
(indicated PROCEDURE is being used recursively
but did not have RECURSIVE option)
21 0902 iden HAS IMPROPER LENGTH (number). 80 IS USED.
(length is less than zero or greater than 256 and
violates a PL/C restriction)
22 0903 LOWER BOUND ON SUBSCRIPT number OF iden
EXCEEDS UPPER BOUND. (1:10) IS USED.
(expressions for array bounds are evaluated before
any statements in the block in which the array is
declared are executed. Variables used in these
expressions must be initialized in an outer block)
23 0904 RETURN FROM iden VIA STMT line DOESN'T RETURN
A VALUE AS EXPECTED IN STMT line .
BLANKS OR 0 USED.
24 0905 RETURN FROM iden VIA STMT line REQUIRES
ILLEGAL CONVERSION. 0 IS USED.
(PL/C restriction, PL/I(F) would convert)
25 0906 RETURN FROM iden VIA STMT line RETURNS A VALUE
TO "CALL" IN STMT line. VALUE IGNORED.
(results would be unpredictable in PL/I(F))
26 0907 CALL TO iden FROM STMT line RETURNS VIA
STMT line WITH STRING LONGER THAN DECLARED
LENGTH. RETURNED LENGTH IS USED.
27 0908 CALL TO iden FROM STMT line RETURNS VIA
STMT line WITH STRING SHORTER THAN DECLARED
LENGTH. IT IS PADDED.
28 0909 BOUNDS OF iden DO NOT MATCH BOUNDS IN THE REST
OF THE EXPRESSION.
(execution is terminated)
29 0910 iden HAS NOT BEEN ALLOCATED.
(in a procedure invoked to initialize a variable a
reference has been made to an array or structure or
string which has not been allocated space. Variables
are allocated and initialized in the order in which
they are declared. See Section D.)
2A 0911 FORMAT LABEL IN GOTO
(execution is terminated)
2B 0912 VALUE OF LABEL VARIABLE (iden IN STMT line) IS
IN A CURRENTLY-INACTIVE BLOCK.
(execution is terminated)
2C 0913 iden INVOKED FOR INITIALIZATION IN STMT line
TERMINATES VIA GOTO.
(execution is terminated)
2D 0914 iden IN STMT line IS IN A CURRENTLY-
INACTIVE ITERATIVE DO GROUP
(execution is terminated)
2E 0915 SECOND ARGUMENT OF BIT/CHAR IS NOT POSITIVE. IMPLIED
LENGTH IS USED.
2F 0916 STRING > 256 CHARACTERS LONG.
(PL/C limitation. Only the 256 left-most characters
are retained)
30 0917 ATTEMPT TO ASSIGN INVALID BIT STRING TO FIXED-DECIMAL
DATA ITEM. 0 IS USED.
(may occur in UNSPEC pseudo-variable, or during
a READ statement. See Section G, pseudo-variables.)
31 0918 UNDEFINED ENTRY. STATEMENT IGNORED.
(the procedure $UENTRY, supplied by PL/C
to repair some semantic error, has been referenced)
32 0919 DELETED STATEMENT ENCOUNTERED
(this message is produced during execution of a
program when a statement deleted by an earlier
phase of the compiler is encountered)
33 0920 UNDEFINED LABEL IN GOTO
(execution is terminated)
34 0921 UPPER BOUND ON SUBSCRIPT FOR iden > 32767
IN MAGNITUDE. 10 IS USED.
35 0922 LOWER BOUND ON SUBSCRIPT FOR iden > 32767
IN MAGNITUDE. 1 IS USED.
36 0923 LABEL COUNTER OVERFLOW. IT IS RESET TO 0.
(warning: a labeled statement has been executed
more than 10 million times causing an internal PL/C
counter to overflow. This may indicate a loop in
the program.)
37 0924 MULTIPLE INTERRUPTS, 2ND AND SUBSEQUENT ONES IGNORED.
(occurs on 360/91 and 370 only)
38 0925 RECORD I/O STRUCTURE VARIABLE iden CONTAINS VARYING
STRINGS. MAXIMUM LENGTHS ARE USED.
(only fixed length strings may be members of
structures used by RECORD I/O)
39 0926 INVALID PARAMETER REFERENCE (OR COMPILER ERROR)
(a parameter has been referenced which was not in
a parameter list of the entry point used to call
a procedure)
3A 0927 ATTEMPT TO USE AUTOMATIC ARITHMETIC-STRING CONVERSION
(an arithmetic variable or expression in an I/O
list has been associated with a string format item
or string data -- or vice-versa. MONITOR message.
Conversion is performed.)
3B 0928 OUTPUT STRING TOO LONG. FIRST 32767 CHARACTERS USED.
3C 0929 INVALID BLANK FIELD IN GET EDIT. 0 IS USED.
3D 0930 DIMENSION SPECIFIED IN HBOUND, LBOUND OR DIM < 1.
1 IS USED.
3E 0931 DIMENSION SPECIFIED IN HBOUND, LBOUND OR DIM > MAXIMUM.
MAXIMUM IS USED.
3F 1002 ATTEMPT TO WRITE OVER END OF STRING. STATEMENT
TERMINATED.
40 1002 ATTEMPT TO READ OVER END OF STRING. STATEMENT
TERMINATED.
41 1018 CLOSING QUOTE MISSING IN INPUT FIELD: string
QUOTE SUPPLIED.
42 3798 ONSOURCE/ONCHAR PSEUDO-VARIABLE USED OUT OF CONTEXT
(ONCHAR or ONSOURCE may be changed by the
program only when they have been set to point to a
string in error, when the CONVERSION condition
arises. At other times an attempt to change (assign
to) either is an error)
43 3799 IMPROPER RETURN FROM CONVERSION ON-UNIT. SOURCE IS
string
(the CONVERSION ON- unit did not change the
character which was in error)
44 0936 FEATURE NOT AVAILABLE IN THIS RELEASE
(PL/I(F) feature used that is not implemented in
the current release of PL/C)
45 0937 iden IS AN ILLEGAL FORMAT LABEL
(the label referenced by the R( label ) format
item is illegal. This may be:
a) because it is not the label of a FORMAT
statement, or
b) because it labels a statement internal to some
block other than the block containing the
R( label )
The remote format item is ignored)
46 0010 string IS AN ILLEGAL NAME
(something other than an identifier was read during
a GET DATA statement, where an identifier should
have appeared. The NAME condition is raised.)
47 0938 INVALID FORMAT OPTION
(an option in the format used with a GET or
PUT EDIT statement appeared in an illegal context:
A or B format: appeared without a field-width
parameter on input
COLUMN format: appeared without a target column
parameter, or was used in GET/PUT
STRING statement
F format: appeared without a field-width
parameter
LINE format: appeared without a target line
parameter
LINE or PAGE: was used in a GET
statement, in a PUT STRING, or a PUT
FILE(X) where X was not a PRINT file
P format: appeared without a valid PICTURE
SPECIFICATION.
SKIP format: was used in a GET/PUT STRING
statement
X format: appeared without a field-width
parameter
The format item and corresponding list item
are dropped)
48 0939 INVALID FORMAT ITEM OPERAND
(in formats E(W,Q), F(W,Q) or F(W,Q,P) either:
a) a negative Q appeared on input; or
b) on output, either 0>W, W>255, 0>Q, or Q>W
The format item and corresponding list item
are skipped)
49 0010 string IS NOT KNOWN TO PROGRAM
(in a GET DATA statement, the name on the data
card has not been used in the program. The NAME
condition is raised. The data-card assignment is
skipped)
4A 0010 INCOMPATIBLE STRUCTURE FOR iden
(in a GET DATA statement a name in the input
was qualified, although it was declared without sub-
structures. Or, an unqualified name appeared in the
data, although it was declared as a structure in the
program. The NAME condition is raised. The
data-card assignment is skipped)
4B 0010 iden IS NOT IN GET LIST
(in a GET DATA statement, a name appeared in
the input which was not in the data list. This error
can arise for a qualified name if its first
identifier (major structure identifier) is not in
the data list. The NAME condition is raised.
The data-card assignment is skipped)
4C 0010 ARRAY ERROR FOR iden
(in a GET DATA statement, subscripts appeared
on a name in the input, but the name was not
declared as an array and may not be subscripted. The
data-card assignment is ignored)
4D 0520 string BOUND ERROR. Number IS USED.
(in a GET DATA statement, a subscript on a name
in the input is out-of-bounds. The upper or lower
bound is used, as indicated)
4E 0010 NO BOUNDS SPECIFIED FOR iden
(in a GET DATA statement, no subscript appeared
in the input following an array name. The
data-card assignment is ignored)
4F 0081 CONFLICTING FILE ATTRIBUTES SPECIFIED OR IMPLIED.
CODE= number
The codes are
0: PUT to RECORD file (SYSPRINT will be used
if possible)
1: GET from OUTPUT or RECORD file
2: more than one of INPUT, OUTPUT, UPDATE
specified
3: STREAM file specifying non-CONSECUTIVE
organization
4: both RECORD and STREAM specified
5: both DIRECT and SEQUENTIAL specified
6: both DIRECT and CONSECUTIVE specified
7: SEQUENTIAL CONSECUTIVE and KEYED specified
8: DIRECT OUTPUT and INDEXED specified
50 0084 FILE CANNOT BE OPENED. CODE= number
The operating system refuses to open a file.
The codes are
1: BLKSIZE not multiple of LRECL (RECFM=F or FB)
3: missing DD card (or unknown reason) (OS only)
6: RECFM,LRECL,BLKSIZE not specified for
non-PRINT file
7: spanned records not supported (OS only)
8: BLKSIZE not large enough (RECFM=V or VB)
10: input file assigned to punch (DOS only)
11: invalid logical device name (DOS only)
12: invalid physical device type (DOS only)
13: auxiliary I/O not permitted by installation
15: file not RECFM F or V (ISAM only)
16: keylength not specified (ISAM only)
17: only one buffer is allowed for a DIRECT file
(ISAM only)
18: RKP out of range (too high or less than 4 for
V format file) (ISAM only)
19: DELETE option cannot be specified with the key
occupying first byte of the
record (ISAM only)
51 0932 SYSTEM DATA SET CANNOT BE RE-ALLOCATED WHILE OPEN
UNDER ANOTHER FILE
(an attempt has been made to open SYSIN or
SYSPRINT while it is open under another filename)
52 0933 FILE NOT OPENED IN UNDEFINEDFILE ON-UNIT
53 0934 INVALID ARGUMENT TO LINENO. Iden NOT A PRINT FILE.
54 0935 INVALID ARGUMENT TO COUNT. Iden NOT A STREAM FILE.
55 1004 string OPTION INVALID. FILE DOES NOT HAVE "PRINT"
ATTRIBUTE.
(the LINE and PAGE options are invalid in
a PUT FILE(X), unless X has the PRINT
attribute. The option is ignored)
56 1009 FILE CANNOT BE USED FOR STREAM INPUT.
(file is open as a RECORD or OUTPUT file)
57 1009 FILE CANNOT BE USED FOR STREAM OUTPUT.
(file is open as a RECORD or INPUT file.
SYSPRINT will be used if possible.)
58 1009 FILE CANNOT BE USED FOR RECORD I/O.
(file is open for STREAM I/O)
59 1009 FILE CANNOT BE USED FOR INPUT.
(file is open for OUTPUT)
5A 1009 FILE CANNOT BE USED FOR OUTPUT.
(file is open for INPUT)
5B 1009 I/O STATEMENT AND/OR OPTIONS INCOMPATIBLE WITH FILE.
CODE= number
(given for special RECORD I/O options. Codes are
0: KEY/KEYTO/KEYFROM specified for non-KEYED file
1: "KEY" not valid for this type of file
2: "KEY" or "KEYFROM" required
3: other incompatibility)
5C 0940 COMPILER ERROR - NO NAME FOR UNINITIALIZED VARIABLE AT
OFFSET number
(may occur if SUBSCRIPTRANGE is disabled and an
uninitialized value is referenced. Otherwise,
this is a compiler error.)
5D 0941 iden HAS NOT BEEN INITIALIZED. IT IS SET TO string
5E 0942 FORMAT iden HAS INVALID CONDITION PREFIXES.
(the conditions in effect for a FORMAT statement
must be the same as those in effect for the EDIT
statement which references the FORMAT statement.
the conditions on the FORMAT statement are ignored
and execution continues)
Note: For errors EX5F through EX6D
see IBM Document C28-6590 for exact formulae used.
5F 1509 rtn ABS(X) >= (2**50)*K; FOR TAN(X), K=PI.
FOR TAND(X), K=180. RESULT IS SET TO 1.
(issued by TAN or TAND. TAN(X) is called
directly by TANH(A+BI) and TAN(A+BI).
the argument is too large in absolute value.)
60 1513 rtn ABSOLUTE VALUE OF REAL ARGUMENT ( number ) IS
> 175.366. RESULT IS SET TO 1.
(issued by SINH or COSH)
61 1507 rtn ARGUMENT( number ) IS GREATER THAN PI*2**50 =
.3537E+16. RESULT IS SET TO 1.
(issued by COS or SIN. COS(X) and/or SIN(X)
are called by COSD, SIND, SIN(A+BI), COS(A+BI),
SINH(A+BI), COSH(A+BI), and EXP(A+BI))
62 1501 rtn ARGUMENT (number) IS NEGATIVE. RESULT IS
SET TO SQRT(ABS(ARG)).
(issued by SQRT(X). SQRT(A**2+B**2) is used to
calculate ABS(A+BI), and various real SQRT calls
are made in calculating SQRT(A+BI). In these
indirect cases, message EX8D should not occur,
but calculational errors might produce it)
63 1511 rtn BOTH ARGUMENTS ARE 0. RESULT IS SET TO 1.
(issued by ATAN(Y,X) or ATAND(Y,X). ATAN(Y,X) is
used in LOG(A+BI), ATAN(A+BI), and (A+BI)**(C+DI))
64 1505 rtn ARGUMENT( number ) <= 0. RESULT IS SET TO 1.
(issued by LOG(X). LOG(X) is called to compute
LOG2(X), LOG10(X), (A+BI)**(C+DI), LOG(A+BI), and
ATANH(Y). ATANH(Y) is in turn used in ATAN(A+BI)
and ATANH(A+BI))
65 1559 rtn Z=+I OR -I IN ATAN(Z) OR Z=+I OR -I IN ATANH(Z).
RESULT IS SET TO 1+0I.
(issued by ATAN(A+BI) or ATANH(A+BI))
66 1515 rtn ABSOLUTE VALUE OF ARGUMENT IS >=1. RESULT IS SET
TO 1.
(issued by ATANH(X). ATANH(X) is used in
calculating ATANH(A+BI) and ATAN(A+BI))
67 1557 rtn Z1=0 AND IMAG(Z2) ¬= 0 OR REAL(Z2) <= 0. RESULT IS
SET TO 1.
(issued by (A+BI)**(C+DI))
68 1556 rtn IN COMPLEX EXPONENTIAL FUNCTION REAL ARGUMENT IS
> 174.673. RESULT IS SET TO 1+0I.
(issued by EXP(A+BI). EXP(A+BI) is used in
calculating Z**W, when W or Z is complex)
69 1556 rtn IN COMPLEX EXPONENTIAL FUNCTION IMAGINARY ARGUMENT
IS > PI*2**50 =.3537E+16. RESULT IS SET TO 1+0I.
(issued by EXP(A+BI). See message EX61)
6A 1555 rtn Z=0 AND N <= 0 IN Z**N. RESULT IS SET TO 1+0I.
(issued by X**Y)
6B 1505 rtn BOTH REAL AND IMAG ARGUMENTS ARE 0. RESULT IS SET
TO 1+0I.
(issued by LOG(A+BI). LOG(A+BI) is used in
calculating Z**W, when W or Z is complex)
6C 1553 rtn ARGUMENT (number) IS > 174.673. RESULT IS SET TO 1.
(issued by EXP(X). EXP(X) is called in
calculating ERF, ERFC, TANH, SIN(A+BI), COS(A+BI),
SINH(A+BI), COSH(A+BI), and EXP(A+BI). EXP(A+BI)
is in turn used in calculating Z**W, when W
or Z is complex)
6D 1551 rtn X=0 AND Y <= 0 IN X**Y. RESULT IS SET TO 1.
71 1009 FILE CANNOT BE USED FOR UPDATE.
(file is opened for INPUT or OUTPUT)
75 0943 FILE BEING CLOSED IS IN USE IN INTERRUPTED I/O
STATEMENT. IT IS NOT CLOSED.
76 0944 INVALID ATTRIBUTES FOR SYSTEM FILE.
77 0023 FILE name - ATTEMPT TO READ/WRITE RECORD OF
0024 ZERO LENGTH.
78 0021 FILE name - LENGTH OF VARIABLE( number ) ¬= LENGTH
0022 OF RECORD( number ).
(the number of bytes of storage occupied by the
variable must equal the number of bytes in the
record)
79 CONDITION (iden) SIGNALLED. NO ON-UNIT PENDING.
7A iden SIGNALLED. "ERROR" RAISED AS STANDARD SYSTEM
ACTION.
7B KEY CONDITION RAISED. ONCODE= number.
7C NORMAL RETURN FROM "ERROR" ON-UNIT. PROGRAM IS STOPPED.
7D NORMAL RETURN FROM "FINISH" ON-UNIT. PROGRAM IS
STOPPED.
7E ABOVE ERROR IS FATAL. PROGRAM IS STOPPED.
7F NOT ENOUGH CORE. TRY LARGER REGION.
80 AUXILIARY I/O LIMIT EXCEEDED.
(see AUXIO option in Section B)
81 ATTEMPT TO SWITCH FILE TO SYSPRINT HAS FAILED.
Section D. Summary of Differences between PL/C and PL/I
PL/C is a subset of PL/I. It is intended to be "upward
compatible" with PL/I. A program that runs without error under
the PL/C compiler should run under PL/I(F) and produce the same
results.
However, certain incompatible diagnostic features have been
added to PL/C. If the programmer wishes to use these features
for diagnostic runs under PL/C and still be able to run the same
program under PL/I he must enclose such features in "pseudo-
comments". If the programmer elects to use the incompatible
PL/C MACRO feature it is impossible to preserve compatibility
with PL/I.
PL/I(F) Features not Included in PL/C
1. REGIONAL auxiliary files.
2. Controlled and based storage, and list processing.
3. Multi-tasking.
4. Compile-time facilities, except for INCLUDE and an
incompatible MACRO facility (see Sections I and J).
5. 48 character set option.
6. Message DISPLAY to the operator.
7. DEFINED and LIKE attributes.
8. A few built-in functions and pseudo-variables (see
Section G).
Additional restrictions imposed by PL/C
1. 33 statement keywords and 6 auxiliary keywords are
reserved and cannot be used as identifiers.
2. The names of built-in functions and pseudo-variables
are not reserved and may be used as identifiers, but if
they are to be used in this way they should be
explicitly declared--contextual declaration of these
particular identifiers may succeed (depending upon
context) but will produce a warning message.
3. Parameters cannot be passed to the MAIN PROCEDURE of a
PL/C program from the OS EXEC card.
4. String constants and comments must be contained in a
single source card unless the PL/C NOMONITOR=(BNDRY)
option is specified.
5. String constants cannot have repetition factors.
6. There are restrictions on the END, ENTRY, FORMAT,
PROCEDURE, READ and WRITE statements.
7. There are restrictions on dimension, ENTRY,
ENVIRONMENT, INITIAL, LABEL and length attributes.
8. Not all of the PL/I(F) condition codes are used by PL/C
and the default condition states under PL/C are not
exactly the same as under PL/I(F).
Incompatible Features Added to PL/C
1. CHECK, NOCHECK, FLOW and NOFLOW statements; a FLOW
condition; ONORIG, ONDEST, STMTNO built-in functions.
2. Diagnostic options on the PUT statement.
3. A built-in function to generate pseudo-random numbers.
4. Comments that are convertible to source text depending
upon the first letter of their contents.
5. A text-replacement MACRO processor.
Differences In Internal Representation Of Data
Internally PL/C carries out all floating-point arithmetic
operations in double-precision form, adopting user-specified
precision only on output. This means that computation is often
somewhat more precise than would be the case under PL/I(F). The
result is usually a slight difference in the least-significant
figures of results, but of course it is possible for the
differences to become highly significant.
PL/C assigns a full word of storage to each FIXED BINARY
variable and a double word of storage to each FIXED DECIMAL
variable, regardless of the declared precision. This means that
PL/C variables may hold values larger than their PL/I(F)
counterpart. However, the default state for the SIZE condition
in PL/C is "enabled" so that situations in which PL/C would give
different results from PL/I(F) are detected.
Each bit in a PL/C bit-string is actually assigned an entire
byte in storage. (Each PL/C string variable also has an eight
byte control block called a dope vector so that an array of
short strings takes a surprising amount of core.)
Decimal-base variables in PL/C are maintained internally in
floating-binary form and converted on output.
This internal representation does not apply to record files,
which are written in standard PL/I(F) representation, and
assumed to be in that representation when read. This means that
PL/C and PL/I(F) are compatible with respect to record files--
files written by either compiler can be read by either.
Order Of Evaluation In DECLARE Statements
PL/I(F) will reorder the evaluation of bounds and lengths and
the initialization of variables so that, in the absence of
circular dependencies, variables will be allocated and
initialized before they are used to allocate or initialize other
variables. PL/C uses a simpler strategy which depends upon the
order in which DECLARE statements appear in the block, and the
order in which variables are listed in a DECLARE statement:
1. First, all scalar arithmetic and label variables are
given their initial value.
2. Then, proceeding in the order in which they are
declared, strings, arrays and structures are allocated
space and initialized. Any expressions in the bounds
or length fields are evaluated before space is
allocated. After space has been allocated, the
variable is initialized before processing the next
variable in the order of declaration.
This strategy does not eliminate any allocation scheme
available in PL/I(F) but does require the programmer to order
his declaration of variables to avoid the use of unallocated or
uninitialized variables declared in the same block.
Dimensional Limits in the Compiler
The internal structure of the PL/C compiler is very different
from that of the PL/I(F) compiler and it was not feasible to
limit certain critical dimensions of the source program in
exactly the same way. This means that there are probably some
unusually large and complex programs that would be accepted by
PL/C but would exceed some dimensional limit in PL/I(F). (The
opposite is certainly true.) The compilation limits in PL/C are
the following:
1. Maximum nesting of IF statements is 12.
2. Maximum static (syntactic) nesting of PROCEDURE,
BEGIN and DO statements is 11.
3. Maximum nesting of factors in DECLARE is 6.
4. Maximum number of label prefixes on a single
statement is 87.
5. Maximum depth of parenthesis nesting in expressions
is 14.
6. Maximum number of identifiers in a factor or
structure in DECLARE is 88.
7. No single expression can contain more than 256 symbols.
These limits are fixed by the structure of the compiler and
cannot be relieved by increasing the core made available to the
compiler. In most other respects the compiler's limits are
related to the amount of core available--for example, length of
program and size of arrays. In these cases when the compiler
indicates that a limit has been exceeded the user can resubmit
the program with a larger region. The error messages in Section
C indicate which errors involve fixed limits, and which can be
alleviated with additional core. For additional information on
core usage in PL/C, see section K.
Section E. Statements
The PL/I(F) statements that are not included in PL/C are:
ALLOCATE, DELAY, DISPLAY, FREE, LOCATE, UNLOCK, WAIT
The statements that are included in PL/C are listed below.
Except as noted, these statements are equivalent to PL/I(F).
Assignment
BEGIN
1. The ORDER and REORDER options are accepted by PL/C but
are not effective-- they do not alter the object code that
is generated.
CALL
1. The TASK, EVENT and PRIORITY options are not included.
2. Scalars may not be given as arguments for array or
structure parameters.
CHECK (not a PL/I statement)
1. When CHECK is encountered the printing that results
from the raising of the CHECK condition (which may have
been suppressed by a previous NOCHECK statement) is
resumed. Note that the normal action is to do the printing
that results from the raising of the CHECK condition, so
that the NOCHECK statement is provided to override this
normal action. This is the opposite of the situation for
the FLOW condition.
2. Alternate forms have one or two control parameters:
CHECK( exp1 ) or CHECK( exp1, exp2)
Exp1 specifies the maximum number of times that the
printing resulting from raising of the CHECK condition in
the current block will appear. After the specified number
of instances NOCHECK is automatically applied. xp2 gives
e
the maximum number of times the printing of the CHECK
condition will be permitted in each block dynamically
entered from the current block. That is,
CHECK(N,M) is equivalent to
CHECK(N) in the current block and
CHECK(M,M) as the first statement in every block
entered from the current block.
CHECK(N) is equivalent to
CHECK(N) in the current block and
CHECK as the first statement in every block
entered from the current block.
CHECK is equivalent to
CHECK in the current block and
CHECK as the first statement in every block
entered from the current block.
Each time that a CHECK statement is executed the
controlling counters are reset to the new limiting values.
CLOSE
DECLARE, DCL
1. The following words are reserved and cannot be used as
identifiers:
ALLOCATE BEGIN CALL CLOSE DECLARE DCL DELETE DO END
ENTRY EXIT FORMAT FREE GET GO GOTO IF ON OPEN
PROCEDURE PROC PUT READ RETURN REVERT REWRITE SIGNAL
STOP WRITE
TO BY WHILE THEN ELSE
NO CHECK NOCHECK FLOW NOFLOW
All of the other keywords are available for use as
identifiers, but note the requirement under 2 below.
2. The names of built-in functions and pseudo-variables
are not reserved and may be used as identifiers, but if
they are to be used in this way they should be explicitly
declared--contextual declaration of these particular
identifiers may succeed (depending upon context) but will
produce a warning message. For example, HIGH can be used
as a variable name, but it should be listed in a DECLARE
statement. Explicit declaration as a label or entry-name
is also accepted.
3. PL/C does not include all of the attributes of PL/I(F).
See Section F.
4. The maximum depth of factoring is 6.
5. The maximum number of identifiers in one factor or one
structure is 88.
DELETE
1. The FILE and KEY options are included. KEY must be
used for DIRECT files (ISAM only).
DO
END
1. If a label (entry-name) follows END this must have been
the first (left-most) label (entry-name) on a preceding
BEGIN, DO or PROCEDURE statement to be effective.
ENTRY
1. Scalars may not be used as arguments for array or
structure parameters.
2. An entry-name cannot be identical to an identifier that
has been declared earlier in the procedure that contains
the ENTRY statement. PL/C will reject such an entry-name
as a "multiple declaration" even though this is a valid
PL/I construction.
EXIT
1. Since PL/C does not include multi-tasking the EXIT
statement is exactly equivalent to the STOP statement.
FLOW (not a PL/I statement)
1. When FLOW is encountered the printing resulting from
the raising of the FLOW condition is resumed. Note that
the normal action is not to do the printing that results
from the raising of the FLOW condition, so that the FLOW
statement is provided to override this normal action. This
is the opposite of the situation for the CHECK condition.
2. Alternate forms have one or two control parameters:
FLOW( exp1 ) or FLOW( exp1, exp2 )
with exactly the same interpretation as for CHECK.
3. The FLOW condition is raised by any action that
potentially alters the normal sequential flow-of-control.
That is, by the CALL, DO, GOTO, RETURN and IF statements,
by any exceptional condition (except FLOW) which causes an
ON-unit to be entered, and by in-line procedure references.
FORMAT
GET
GO TO, GOTO
IF
1. The maximum nesting depth for IF statements is 12.
NOCHECK (not a PL/I statement)
1. When NOCHECK is encountered the printing that would
normally result from the raising of the CHECK condition is
suppressed.
NOFLOW (not a PL/I statement)
1. When NOFLOW is encountered the printing that results
from raising the FLOW condition is suppressed.
ON
1. See Section H for information on differences between
PL/I(F) and PL/C treatment of ON-conditions.
OPEN
1. The following options are not included:
BUFFERED UNBUFFERED BACKWARDS EXCLUSIVE TRANSIENT
2. All PL/C files are EXTERNAL.
PROCEDURE, PROC
1. The TASK option is not included.
2. The RECURSIVE option is included. All PROCEDURES under
PL/C are recursive, but unless the RECURSIVE option is
specified, recursive use of the procedure will result in a
run-time diagnostic message.
3. The ORDER and REORDER options are accepted, but are
ineffective--they have no effect on the object code
generated.
4. Scalars may not be used as arguments for array or
structure parameters.
PUT
1. In addition to the PL/I options the following have been
added to PL/C:
OFF -- suppresses printing of execution output on SYSPRINT.
ON -- resumes printing of execution output on SYSPRINT.
FLOW -- displays the recent FLOW history.
SNAP -- displays the recent calling history.
ALL -- displays the current values of all automatic, scalar
variables in the blocks active at the time of encounter,
and the current values of all static or external scalar
variables.
ARRAY -- same as ALL but includes values of arrays.
DEPTH( exp ) -- specifies the depth of block nesting for
which the display is to be produced. Used only with SNAP,
ALL or ARRAY options.
2. If ON or OFF is used, no other options may appear.
3. FLOW, SNAP, ALL and ARRAY can appear in any combination
with each other, and with the standard SKIP, PAGE or LINE
options of PL/I. They cannot be combined with FILE,
STRING, LIST, DATA or EDIT options.
READ
1. Only the FILE, INTO, KEY, KEYTO and IGNORE options are
included.
2. PL/C-written records are fully compatible with PL/I(F).
But note that LABEL variables written by PL/C-compiled
programs can be meaningful only when read back in by the
same PL/C program in the same job step.
RETURN
REVERT
1. See Section H for information on differences between
PL/I(F) and PL/C treatment of ON-conditions.
REWRITE
1. FILE, FROM, KEY supported. File must be opened for
UPDATE. If KEY is specified, file must be DIRECT (ISAM
only).
SIGNAL
1. See Section H for information on differences between
PL/I(F) and PL/C treatment of ON-conditions.
STOP
WRITE
1. Only the FILE, KEYFROM and FROM options are included.
2. FILE and FROM must be present, KEYFROM must be present
for an ISAM file. PL/C-written records are fully
compatible with PL/I(F). But note that LABEL variables
written by PL/C-compiled programs can be meaningful only
when read back in by the same PL/C program in the same job
step.
Section F. Attributes
The PL/I(F) attributes that are not included in PL/C are
listed below:
AREA EVENT PACKED
BACKWARDS EXCLUSIVE, EXCL POINTER, PTR
BASED GENERIC POSITION, POS
BUFFERED, BUF IRREDUCIBLE REDUCIBLE
CONTROLLED, CTL TASK DEFINED, DEF
LIKE OFFSET
The attributes included in PL/C are listed below. Except as
noted they are equivalent to the attributes of PL/I(F).
ALIGNED
AUTOMATIC, AUTO
BINARY, BIN
BIT
BUILTIN
CHARACTER, CHAR
COMPLEX, CPLX
DECIMAL, DEC
dimension
1. *'s must be used for the bounds in all dimension
attributes associated with a parameter. This includes the
bounds in the dimension attributes used in the ENTRY
attribute for an entry parameter. *'s may not be used for
the bounds under any other circumstances.
DIRECT
ENTRY
1. Structure parameters cannot be declared in the list
after ENTRY. This means an entry-name cannot be passed as
an argument if any of its parameters is a structure.
2. In the absence of explicit attributes, PL/C supplies a
scalar parameter with FLOAT, DECIMAL and REAL attributes,
where under the same circumstances PL/I(F) makes no
assumption as to attributes.
3. The bounds in all dimension attributes and the length
in all BIT or CHAR attributes in the parameter list that
follows ENTRY must be *'s.
ENVIRONMENT, ENV
1. OS options included: CONSECUTIVE, INDEXED, F, V, U,
CTLASA, CTL360, GENKEY, BUFFERS(1)
2. DOS options included: CONSECUTIVE, F, V, U, MEDIUM,
CTLASA, LEAVE, NOTAPEMK, NOLABEL, VERIFY
EXTERNAL, EXT
FILE
1. Only EXTERNAL files are permitted.
FIXED
FLOAT
INITIAL, INIT
1. Iteration factors, but not string repetition factors,
are allowed in the INITIAL list. This means that the
phrase (x) (1) '---' in PL/I(F) would have to be given as
(x) ('---') in PL/C. The phrase (x) '---' is not allowed.
INPUT
INTERNAL, INT
KEYED
LABEL
1. The optional list of statement-label-constants is not
allowed.
Length
1. A * must be used for the length in all CHAR and BIT
attributes associated with a parameter. This includes
lengths in the ENTRY attribute. *'s may not be used for
lengths under any other circumstances.
2. Length cannot be greater than 256.
OUTPUT
PICTURE, PIC
1. Sterling PICTURE data-types are not supported.
2. PL/C will not provide for drifting signs in exponents.
Precision
PRINT
REAL
RECORD
1. Only a limited form of RECORD I/O is included. See
READ and WRITE statements.
RETURNS
SEQUENTIAL, SEQL
STATIC
STREAM
UNALIGNED, UNAL
UPDATE
VARYING, VAR
Factoring
1. The maximum depth of factoring is 6.
2. The maximum number of identifiers in a factor is 88.
Structures
1. The maximum number of identifiers in a structure is 88.
Section G. Built-in Functions and Pseudo-variables
The following PL/I(F) built-in functions are not included in
PL/C. A + after the name indicates that a pseudo-variable of
the same name is also not included.
Based storage:
ADDR, EMPTY, NULL, NULLO
Multi-tasking:
COMPLETION+, PRIORITY+, STATUS+
Array Generic:
POLY
String Generic:
STRING pseudo-variable
Miscellaneous:
ALLOCATION
The following built-in functions and pseudo-variables are
included in PL/C. Except as noted otherwise, all built-in
functions perform exactly as do their PL/I(F) counterparts. In
other words, the values of, say SIN(X) in PL/C and in PL/I(F)
are identical floating-point numbers when the functions are
applied to the same floating-point value of X. The methods used
in PL/C are those described in "PL/I Computational Subroutines:
C28-6590".
The names of built-in functions and pseudo-variables are not
reserved and may be used as identifiers, but if they are to be
used in this way they should be explicitly declared--contextual
declaration of these particular identifiers may succeed
(depending upon context) but will produce a warning message.
For example, HIGH can be used as a variable name, but it should
be listed in a DECLARE statement.
Pseudo-variables:
SUBSTR, REAL, IMAG, COMPLEX, ONCHAR, ONSOURCE, UNSPEC
Incompatibility: The right-hand side of the assignment
UNSPEC(decimal-fixed-variable) = bit-string expression;
must be convertible to a bit string that represents valid
360 packed decimal data.
Arithmetic Generic:
ABS, ADD, DIVIDE, MAX, MIN, MOD, MULTIPLY, SIGN, FLOOR,
CEIL, TRUNC, COMPLEX, CONJG, IMAG, REAL, ROUND
Incompatability: FLOOR, CEIL (FLOAT scale) under PL/I(F)
treat all numbers of magnitude <16**(-16) as zero; under
PL/C only true zeros are treated as zero.
Mathematical Generic:
EXP, LOG, LOG10, LOG2, ATAND, ATAN, TAND, TAN, SIND, SIN,
COSD, COS, TANH, ERF, ERFC, SQRT, COSH, SINH, ATANH
String Generic:
BOOL, HIGH, INDEX, LENGTH, LOW, REPEAT, STRING, SUBSTR,
TRANSLATE, UNSPEC, VERIFY
Note on UNSPEC: Although the PL/I(F) and PL/C internal
representation of certain data-types differ (see Section
D), the PL/C and PL/I(F) UNSPEC functions produce identical
results (except for the packed decimal error case noted
under pseudo-variables.) The PL/C UNSPEC is somewhat more
complicated (and time-consuming to execute) than its
PL/I(F) counterpart, since the PL/C UNSPEC must convert to
and from the PL/I(F) representation.
Array Generic:
ALL, ANY, DIM, HBOUND, LBOUND, PROD, SUM
Incompatibility: In PL/C the built-in functions DIM, LBOUND
and HBOUND operate without actually evaluating an array
expression, if such an expression is given as the first
argument. Since PL/I(F) evaluates the expression before
invoking the function, there could be "side effects" under
PL/I(F) that will not occur in PL/C.
Type Conversion:
BINARY, BIT, CHAR, DECIMAL, FIXED, FLOAT, PRECISION
Condition:
DATAFIELD, ONCHAR, ONCODE, ONCOUNT, ONFILE, ONKEY, ONLOC,
ONSOURCE
PL/C has an additional condition: KEY condition with ONCODE
= 69. This will be raised if (ISAM only):
1. A REWRITE or DELETE is issued for a SEQUENTIAL
file, and the previous I/O operation wasn't a READ.
2. A DELETE is invalid because the file is not opened
for UPDATE.
3. A DELETE is invalid because L has not been
specified in the OPTCD.
4. A DELETE is invalid because the KEY occupies the
first byte of the record.
PL/C does not include all of the ON codes of PL/I(F). See
Section H.
Miscellaneous:
COUNT, DATE, LINENO, TIME
PL/C Built-in Functions Not Included in PL/I(F):
RAND, ONORIG, ONDEST, STMTNO
RAND is a built-in function which produces a sequence of
pseudo-random numbers. There is no comparable built-in
function in PL/I(F). When this function is used a PL/C
program will not run under PL/I(F). Therefore, a program
that includes the use of RAND will receive a warning
message from PL/C.
Definition RAND returns the next number in a pseudo-
random number sequence in which the argument was the
last element.
Reference RAND( x )
Argument The argument "x" may be an element or array
expression of coded arithmetic type. It must be REAL.
If it is not also FLOAT it will be converted to FLOAT
by the RAND function. The value must be in the range
0 < x < 1.
Result The value returned will be FLOAT with the same
base (BINARY, DECIMAL) as the argument.
Usage RAND is normally used in an assignment
statement:
X = RAND(X);
Repeated execution of such a statement will cause X to
take on the successive values in a sequence of pseudo-
random numbers uniformly distributed over the interval
(0.0, 1.0), so long as the initial, or "seed" value of
X was properly chosen. The "seed" value should be
between 0 and 1, and have nine significant figures,
the right-most of which is odd. This will maximize
the period of the sequence. The generation method
used in the PL/C RAND function is based on the method
of Coveyou and Macpherson in ACM Journal 14(1967),
pages 100-119.
The ONORIG and ONDEST built-in functions have no arguments
and are non-zero only within a FLOW ON-unit. ONORIG
returns the statement number of the statement that caused
the FLOW condition to be raised, and ONDEST returns the
statement number of the statement that is the target of
that transfer.
The STMTNO built-in function takes a statement label as its
single argument. It returns the statement number of the
labelled statement.
Section H. Conditions
The PL/I(F) conditions not included in PL/C are:
AREA, PENDING
All of the other conditions are included, and the FLOW
condition has been added. The PL/C conditions are equivalent to
their PL/I(F) counterparts, as described in Section H of the IBM
Reference Manual C28-8201, except as noted below. The
conditions and acceptable abbreviations are listed below, with
the default states underlined:
CHECK NOCHECK
The default PL/C output for the CHECK condition is not
identical to that of PL/I(F). When an element of a
'checked' array is changed, PL/C displays only that
particular element (rather than the entire array.)
Similarly, when a member of a 'checked' structure is
changed, only that member is displayed (rather than the
entire structure.) The timing of the PL/C display is also
not exactly the same as that of PL/I(F). The PL/C display
occurs immediately after the CHECK condition is raised,
rather than waiting until the end of the statement. See
also the description of the CHECK statement (Section E).
CONVERSION CONV NOCONVERSION NOCONV
ENDFILE
ENDPAGE
ERROR
The PL/C ERROR condition is not entirely compatible with
PL/I(F). The standard system action in PL/I(F) is to raise
the FINISH condition and stop. In PL/C, the standard
system action is to apply the automatic PL/C error
correction and then continue execution--the FINISH
condition is not raised (unless that particular PL/C
"correction" terminates execution.) Normal return (if
there is a pending ON unit) is compatible--both PL/C and
PL/I(F) signal FINISH and terminate execution.
FINISH
FIXEDOVERFLOW FOFL NOFIXEDOVERFLOW NOFOFL
FLOW NOFLOW
The FLOW condition has been added to PL/C to permit the
dynamic monitoring of the flow-of-control. When the FLOW
condition is enabled by a FLOW prefix, the condition is
raised by any statement that potentially will alter the
normal sequential flow of execution. These are the CALL,
DO, GOTO, IF and RETURN statements, any exceptional
condition (except FLOW) which causes an ON-unit to be
entered, and references to user-defined functions.
The standard system action depends on the FLOW and
NOFLOW statements. If the condition is raised within the
scope of a NOFLOW statement, the origin and destination of
the transfer are saved in a first-in-first-out queue which
will hold up to 18 entries. A PUT FLOW statement will
cause the contents of this queue to be printed in the form:
oooo -> dddd or nnn*(ooo -> ddd)
where oooo is the origin statement number, dddd is the
destination statement number, and nnn is a count of the
number of times the transfer was made in succession. If
the condition is raised within the scope of a FLOW
statement, the origin and destination of the transfer are
immediately printed on SYSPRINT in the same format as used
by the PUT FLOW statement. This may, of course, be
replaced with a user-supplied ON FLOW unit. The ONORIG and
ONDEST builtin functions are useful in such an ON- unit--
see Section G. The NOFLOW and FLOW statements will still
serve to dynamically suppress and resume the printing that
may result from the raising of the FLOW condition. The
user should disable the FLOW condition in any FLOW ON-unit
he supplies (by using a NOFLOW prefix) to avoid an infinite
loop.
If the FLOW or NOFLOW prefix is applied to a PROCEDURE
or BEGIN statement, its scope is the entire block. If
applied to a DO statement, its scope is the DO group.
Applied to other statements, its scope is the single
statement.
KEY See Section G for a description of KEY Condition 69.
NAME
OVERFLOW OFL NOOVERFLOW NOOFL
RECORD
SIZE NOSIZE (note default different from PL/I(F))
When the SIZE condition is raised, the arithmetic results
in PL/C will differ from those produced by PL/I(F). In
particular, PL/I(F) may truncate results on the left to the
user-specified precision, while PL/C always retains the
implementation-defined maximum precision.
STRINGRANGE STRG NOSTRINGRANGE NOSTRG
(note default different from PL/I(F))
SUBSCRIPTRANGE SUBRG NOSUBSCRIPTRANGE NOSUBRG
(note default different from PL/I(F))
The NOSUBSCRIPTRANGE prefix will not be effective unless
the NOMONITOR=(SUBRG) sub-option is specified. Since out-
of-range subscripts can damage the compiler (if PL/C is not
in the link pack area) and interfere with batch operation,
many installations elect to inhibit (override) this option.
TRANSMIT
UNDEFINEDFILE UNDF
UNDERFLOW UFL NOUNDERFLOW NOUFL
User-defined condition
ZERODIVIDE ZDIV NOZERODIVIDE NOZDIV
As noted in the ERROR condition, PL/C will attempt to correct
runtime errors and continue. In the case of arithmetic
condition, if the condition is disabled (i.e., a NO-prefix is in
effect), the correction will be suppressed. If a user-supplied
ON-unit is pending, the correction will be applied, but no error
message will be given.
The ONCODE values for each error condition are given in
Section C. These are the same as the PL/I(F) codes wherever
possible. In addition, error cases detected by PL/C which have
no PL/I(F) codes are given codes in the 900-999 range.
Section I. The MACRO Feature
Macro Definition
A macro definition must be given within a "macro packet". A
packet begins with a $MACRO card ($ in column 1) and ends with a
$MEND card ($ in column 1). One or more macro definitions
comprise a packet. There is no limit on the length of a packet,
or on the number of packets that may be used, although the core
available will restrict the total amount of macro text in a
program. Packets may be inserted anywhere in the source
program, but each macro must be defined before it is referenced.
A macro definition has the form
<macro name> = <macro body> %;
or
<macro name>(formal-param-1,formal-param-2,...,
formal-param-n) = <macro body> %;
The macro body may contain any text except the sequence "%;".
No requirement is made regarding balanced quotes or partial
comments. Care should be taken about card boundaries, since
macro text is interpreted as a series of lines, each with its
own indentation. Two separate lines will never be put on the
same line during expansion, although it may be necessary to
split a line to fit within source margins.
The macro name may consist of up to 255 characters, starting
with an alphabetic or national character. Like all symbols in
PL/C, macro names cannot be split over card boundaries. (This
is independent of the BNDRY option.) The name must be distinct
from all other identifiers used in the program. PL/C keywords
may be used as macro names, but such names will not be
recognized as macros in any text which is syntactically scanned
before the definitions are processed.
The formal parameters are recognized only within the macro
being defined. The maximum number of formal parameters allowed
in a macro is 10. They may contain up to 31 characters, again
starting with an alphabetic or national character. Formal
parameters are PL/C symbols, and therefore cannot be split over
card boundaries. Formal parameters are local to a macro
definition, and will over-ride within that definition any other
use of the symbol (identifier, keyword, or macro name). They
are only recognized when surrounded by any of the PL/C
delimiters (including blanks and source-text boundaries).
Parameters appearing within comments and strings are also
recognized, although, again, only when properly delimited.
Thus, if E is a formal parameter in the text
E = 12; /* SET E TO UPPER BOUND */
the E's in SET and UPPER will not be considered parameter
instances.
Macro Expansion
Within PL/C source text, macro calls are expanded when
encountered during syntactic analysis. This means that macro
calls within strings and comments will not be recognized. Macro
text may contain further macro references, either explicity or
through parameter substitution, which are expanded when
encountered during the scan of the original expansion. A macro
call is of the form
<macro name>
or
<macro name>(actual-param-1, actual-param-2,...,
actual-param-n)
The second form may be split over a card boundary, except that
the macro name itself must not be split. The number of actual
parameters must equal the number of formal parameters in the
macro definition. During expansion, each actual parameter is
substituted for the corresponding formal parameter in the macro
body before the syntactic analysis scan of the macro text.
Actual parameters are treated as pure text during
substitution. That is, embedded parameters are not recognized;
macro references are not detected until the macro text
containing the parameter is syntactically scanned. Blanks
surrounding actual parameters in the call are ignored. As a
convenience, there are two additional rules governing the text
of actual parameters:
(1) If a parameter begins with a single quote, all text up to
and including the next single quote will be considered part
of the parameter. (Two consecutive quotes within such text
do not terminate the parameter, and remain unchanged.)
(2) If an actual parameter begins with a left parenthesis, all
text up to the matching right parenthesis is considered
part of the parameter. The outer parentheses, however, are
discarded from the text of the parameter before
substitution.
For example, given the macro packet
$MACRO
ASGN(P,Q,R) = SUBSTR(P,Q) = R; %;
$MEND
and the macro call ASGN(X,(10,3),'ABC''XYZ') the expansion would
be SUBSTR(X,10,3) = 'ABC''XYZ';
Macro Display
Unless NOSOURCE is specified, macro definitions are always
printed. Macro calls are printed by default; NOMCALL may be
used to suppress this printing. Macro expansions are normally
not printed; the MTEXT option will cause them to appear. (If
NOMTEXT and NOMCALL are both used, the default options --
NOMTEXT and MCALL -- are applied.)
Section J. The INCLUDE Feature (not in DOS-PL/C)
The INCLUDE feature is used to incorporate card images from
an external file into the source text (during compilation) or
into the SYSIN data stream (during execution). The INCLUDE
control card is defined as follows:
$INCLUDE member-list [, member-list]*;
where a 'member-list' is either a single member-name, or an
optional DDNAME followed by a parenthesized list of member-
names. Member-names in the list are separated by commas. If a
DDNAME is not specified, an installation dependent DDNAME is
used. The supplied default DDNAME is SYSLIB.
Syntax Rules:
. $INCLUDE must be given in columns 1-8 of the input card
a
(or card image) regardless of the SORMGIN option. The
SORMGIN option does apply to the included cards (except for
any control cards that might be included.)
. Each 'ddname' and 'member-name' pair identifies the card
b
images to be incorporated into the PL/C job. These card
images must form a member of a partitioned data set (PDS).
. A 'ddname' specifies the characters appearing in the
c
name field of some DD card in the JCL for the PL/C job
step. This DD card should define a PDS. The 'member-name'
associated with the 'ddname' specifies a member of the PDS
to be incorporated into the PL/C job. Both 'ddname' and
'member-name' should have no more than 8 characters. Names
will be truncated to 8 characters if they exceed that
length, and no error message will be given.
. Blanks may appear anywhere except in a 'ddname' or a
d
'member-name'.
. A $INCLUDE may appear anyplace in a PL/C job deck.
e
General Rules:
. Members are incorporated into the PL/C job in the order
a
in which they appear on the $INCLUDE card.
. Included cards may contain any text normally acceptable
b
to PL/C from cards -- including $JOB, $PROCESS, $DATA and
$INCLUDE control cards.
. $INCLUDE cards may be nested. That is, included cards
c
may contain $INCLUDE cards.
. A PDS to be included must have fixed format records of
d
logical record length <= an installation defined maximum.
(Default is 100.) The PDS may be blocked.
Errors:
If the card images cannot be included from the
designated member an error message is printed. If more
ddname/member-name pairs remain unprocessed on the $INCLUDE
card in error, they are processed after the error message
is printed.
This error message could be generated by any of the
following conditions:
1) No space remains in the PL/C region for buffers or
DCBs. Try a larger region.
2) The logical record length is too large.
3) The file specified by ddname could not be opened by
the system.
4) The member-name could not be found in the PDS
defined by the ddname.
5) A permanent I/O error occurred while reading from
the specified member-name. (In this case a SYNADAF
message is printed.)
Examples of $INCLUDE cards:
INCLUDE MEMB1; includes MEMB1 from SYSLIB.
$
INCLUDE (MEMB1,MEMB2); includes MEMB1 and MEMB2
$
from SYSLIB.
INCLUDE MEMB1, MEMB2; same as previous example
$
INCLUDE MYLIB(MEMB1,MEMB2);
$
includes MEMB1 and MEMB2 from MYLIB.
INCLUDE MEMB1,MYLIB(MEMB2),YOURLIB(MEMB3,MEMB4);
$
includes MEMB1 from SYSLIB,
MEMB2 from MYLIB
and MEMB3 and MEMB4 from YOURLIB.
Section K. PL/C Post Mortem Dump Statistics Report
The PL/C post mortem dump statistics report is generated in
response to the R suboption on the DUMP, DUMPE, or DUMPT options
(See Section B). Much of the report is self-explanatory.
However, note the following:
- PAGES and LINES refer to output to the system output file,
SYSPRINT. CARDS refers to input from the system input file,
SYSIN. INCL'S refers to the total number of cards read from all
$INCLUDEd files. AUXIO refers to the total number of records
read from, written to, or updated in auxiliary files. This
includes auxiliary input file cards that are $INCLUDEd.
- BYTES USED figures are given exactly and then rounded up to
the nearest K (=1024 bytes). BYTES UNUSED figures are given
exactly and then rounded down to the nearest K.
For example: USED 1025 ( 2K)
UNUSED 1025 ( 1K)
Since some internal PL/C tables grow and shrink, BYTES USED
means the maximum amount used at any time, and BYTES UNUSED
means the minimum amount unused at any time.
- SYMBOL TABLE refers to the PL/C internal table that records
information about identifiers, variables, constants, entries,
files and blocks used in the program. It exists through
compilation and execution. Symbol table space is also used
during compilation for storing macro definitions. (See diagram
below.)
- INTERMEDIATE CODE refers to the PL/C internal
representation of the program during compilation. It exists
only during compilation. (See diagram below.)
- OBJECT CODE refers to the machine code generated by PL/C
for the program. It is created by compilation, and exists
through execution. (See diagram below.)
- STATIC CORE refers to core for storing STATIC (and
EXTERNAL) variables. It exists during execution time. Even if
no STATIC or EXTERNAL variables are declared, STATIC CORE USED
will be approximately 350 bytes for fixed overhead. (See
diagram below.)
- AUTOMATIC CORE refers to core for storing AUTOMATIC
variables. It exists during execution time. Even if no
AUTOMATIC variables exist in the program, AUTOMATIC CORE USED
will be approximately 200 bytes. (See diagram below.)
- DYNAMIC CORE refers to core for auxiliary and $INCLUDE file
DCBs, buffers, macro expansions, and several other miscellaneous
functions. It is used dynamically through compilation and
execution time. (See diagram below.)
- TOTAL STORAGE refers to the total through both compilation
and execution. As noted above, TOTAL STORAGE USED is the
maximum amount used at any time, and TOTAL STORAGE UNUSED is the
minimum amount unused at any time. (See diagram below.)
- In the line "THIS PROGRAM MAY BE RERUN WITHOUT CHANGE IN A
REGION rK BYTES SMALLER USING TABLESIZE=t", r is simply taken
from TOTAL STORAGE UNUSED and t is CEIL(SYMBOL TABLE USED/4).
This statement means that if you:
1. Decrease the region available to PL/C by rK
2. Specify TABSIZE=t on the $JOB card
3. Change nothing else
and then rerun the program, you will get the same results.
Specifically, you will not run out of core (assuming the
original program didn't).
PL/C CORE USAGE DIAGRAM
| COMPILATION TIME | | EXECUTION |
| | | | | TIME |
| SYNTACTIC | | | | |
| & SEMANTIC | | CODE | | |
| ANALYSIS | | GENERATION | | |
-------+------------+-+------------+---------+------------+
A | SYMBOL || | | A | |
| | TABLE || |