home *** CD-ROM | disk | FTP | other *** search
- .\" Copyright (c) 1980 The Regents of the University of California.
- .\" All rights reserved.
- .\"
- .\" Redistribution and use in source and binary forms, with or without
- .\" modification, are permitted provided that the following conditions
- .\" are met:
- .\" 1. Redistributions of source code must retain the above copyright
- .\" notice, this list of conditions and the following disclaimer.
- .\" 2. Redistributions in binary form must reproduce the above copyright
- .\" notice, this list of conditions and the following disclaimer in the
- .\" documentation and/or other materials provided with the distribution.
- .\" 3. All advertising materials mentioning features or use of this software
- .\" must display the following acknowledgement:
- .\" This product includes software developed by the University of
- .\" California, Berkeley and its contributors.
- .\" 4. Neither the name of the University nor the names of its contributors
- .\" may be used to endorse or promote products derived from this software
- .\" without specific prior written permission.
- .\"
- .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- .\" SUCH DAMAGE.
- .\"
- .\" @(#)puman3.n 6.3 (Berkeley) 4/17/91
- .\"
- .if !\n(xx \{\
- .so tmac.p \}
- .if n 'ND
- .nr H1 2
- .NH
- Error diagnostics
- .PP
- This section of the
- .UM
- discusses the error diagnostics of the programs
- .PI ,
- .PC
- and
- .X .
- .I Pix
- is a simple but useful program which invokes
- .PI
- and
- .X
- to do all the real processing.
- See its manual section
- .IX
- (1)
- and section 5.2 below for more details.
- All the diagnostics given by
- .PI
- will also be given by
- .PC .
- .NH 2
- Translator syntax errors
- .PP
- A few comments on the general nature of the syntax errors usually
- made by Pascal programmers
- and the recovery mechanisms of the current translator may help in using
- the system.
- .SH
- Illegal characters
- .PP
- Characters such as `$', `!', and `@' are not part of the language Pascal.
- If they are found in the source program,
- and are not part of a constant string, a constant character, or a comment,
- they are considered to be
- `illegal characters'.
- This can happen if you leave off an opening string quote `\(aa'.
- Note that the character `"', although used in English to quote strings,
- is not used to quote strings in Pascal.
- Most non-printing characters in your input are also illegal except
- in character constants and character strings.
- Except for the tab and form feed characters,
- which are used to ease formatting of the program,
- non-printing characters in the input file print as the character `?'
- so that they will show in your listing.
- .SH
- String errors
- .PP
- There is no character string of length 0 in Pascal.
- Consequently the input `\(aa\(aa' is not acceptable.
- Similarly, encountering an end-of-line after an opening string quote `\(aa'
- without encountering the matching closing quote yields the diagnostic
- ``Unmatched \(aa for string''.
- It is permissible to use the character `#'
- instead of `\''
- to delimit character and constant strings for portability reasons.
- For this reason, a spuriously placed `#' sometimes causes the diagnostic
- about unbalanced quotes.
- Similarly, a `#' in column one is used when preparing programs which are to
- be kept in multiple files.
- See section 5.11 for details.
- .SH
- Comments in a comment, non-terminated comments
- .PP
- As we saw above, these errors are usually caused by leaving off a comment
- delimiter.
- You can convert parts of your program to comments
- without generating this diagnostic
- since there are two different kinds of comments \- those delimited by
- `{' and `}', and those delimited by `(*' and `*)'.
- Thus consider:
- .LS
- { This is a comment enclosing a piece of program
- a := functioncall; (* comment within comment *)
- procedurecall;
- lhs := rhs; (* another comment *)
- }
- .LE
- .PP
- By using one kind of comment exclusively in your program you can use
- the other delimiters when you need to
- ``comment out''
- parts of your program\*(dg.
- .FS
- \*(dgIf you wish to transport your program,
- especially to the 6000-3.4 implementation,
- you should use the character sequence `(*' to delimit comments.
- For transportation over the
- .I rcslink
- to Pascal 6000-3.4, the character `#' should be used to delimit characters
- and constant strings.
- .FE
- In this way you will also allow the translator to help by detecting
- statements accidentally placed within comments.
- .PP
- If a comment does not terminate before the end of the input file,
- the translator will point to the beginning of the comment,
- indicating that the comment is not terminated.
- In this case processing will terminate immediately.
- See the discussion of ``QUIT'' below.
- .SH
- Digits in numbers
- .PP
- This part of the language is a minor nuisance.
- Pascal requires digits in real numbers both before and after the decimal
- point.
- Thus the following statements, which look quite reasonable to
- .SM
- FORTRAN
- .NL
- users, generate diagnostics in Pascal:
- .LS
- .so digitsout
- .LE
- These same constructs are also illegal as input to the Pascal interpreter
- .I px .
- .SH
- Replacements, insertions, and deletions
- .PP
- When a syntax error is encountered in the input text,
- the parser invokes an error recovery procedure.
- This procedure examines the input text immediately after the point
- of error and considers a set of simple corrections to see whether they
- will allow the analysis to continue.
- These corrections involve replacing an input token with a different
- token,
- inserting a token,
- or replacing an input token with a different token.
- Most of these changes will not cause fatal syntax errors.
- The exception is the insertion of or replacement with a symbol
- such as an identifier or a number;
- in this case the recovery makes no attempt to determine
- .I which
- identifier or
- .I what
- number should be inserted,
- hence these are considered fatal syntax errors.
- .PP
- Consider the following example.
- .LS
- % \*bpix -l synerr.p\fR
- .tr --
- .so synerrout
- %
- .LE
- The only surprise here may be that Pascal does not have an exponentiation
- operator, hence the complaint about `**'.
- This error illustrates that, if you assume that the language has a feature
- which it does not, the translator diagnostic may not indicate this,
- as the translator is unlikely to recognize the construct you supply.
- .SH
- Undefined or improper identifiers
- .PP
- If an identifier is encountered in the input but is undefined,
- the error recovery will replace it with an identifier of the
- appropriate class.
- Further references to this identifier will be summarized at the
- end of the containing
- .B procedure
- or
- .B function
- or at the end of the
- .B program
- if the reference occurred in the main program.
- Similarly,
- if an identifier is used in an inappropriate way,
- e.g. if a
- .B type
- identifier is used in an assignment statement,
- or if a simple variable
- is used where a
- .B record
- variable is required,
- a diagnostic will be produced and an identifier of the appropriate
- type inserted.
- Further incorrect references to this identifier will be flagged only
- if they involve incorrect use in a different way,
- with all incorrect uses being summarized in the same way as undefined
- variable uses are.
- .SH
- Expected symbols, malformed constructs
- .PP
- If none of the above mentioned corrections appear reasonable, the
- error recovery will examine the input
- to the left of the point of error to see if there is only one symbol
- which can follow this input.
- If this is the case, the recovery will print a diagnostic which
- indicates that the given symbol was `Expected'.
- .PP
- In cases where none of these corrections resolve the problems
- in the input,
- the recovery may issue a diagnostic that indicates that the
- input is ``malformed''.
- If necessary, the translator may then skip forward in the input to
- a place where analysis can continue.
- This process may cause some errors in the text to be missed.
- .PP
- Consider the following example:
- .LS
- % \*bpix -l synerr2.p\fR
- .so synerr2out
- %
- .LE
- Here we misspelled
- .I output
- and gave a
- .SM FORTRAN
- style variable declaration
- which the translator diagnosed as a `Malformed declaration'.
- When, on line 6, we used `(' and `)' for subscripting
- (as in
- .SM FORTRAN )
- rather than the `[' and `]' which are used in Pascal,
- the translator noted that
- .I a
- was not defined as a
- .B procedure .
- This occurred because
- .B procedure
- and
- .B function
- argument lists are delimited by parentheses in Pascal.
- As it is not permissible to assign to procedure calls the translator
- diagnosed a malformed statement at the point of assignment.
- .SH
- Expected and unexpected end-of-file, ``QUIT''
- .PP
- If the translator finds a complete program, but there is more non-comment text
- in the input file, then it will indicate that an end-of-file was expected.
- This situation may occur after a bracketing error, or if too many
- .B end s
- are present in the input.
- The message may appear
- after the recovery says that it
- ``Expected \`.\'\|''
- since `.' is the symbol that terminates a program.
- .PP
- If severe errors in the input prohibit further processing
- the translator may produce a diagnostic followed by ``QUIT''.
- One example of this was given above \-
- a non-terminated comment;
- another example is a line which is longer than 160
- characters.
- Consider also the following example.
- .LS
- % \*bpix -l mism.p\fR
- .so mismout
- %
- .LE
- .NH 2
- Translator semantic errors
- .PP
- The extremely large number of semantic diagnostic messages which the translator
- produces make it unreasonable to discuss each message or group of messages
- in detail.
- The messages are, however, very informative.
- We will here explain the typical formats and the terminology used in the error
- messages so that you will be able to make sense out of them.
- In any case in which a diagnostic is not completely comprehensible you can
- refer to the
- .I "User Manual"
- by Jensen and Wirth for examples.
- .SH
- Format of the error diagnostics
- .PP
- As we saw in the example program above, the error diagnostics from
- the Pascal translator include the number of a line in the text of the program
- as well as the text of the error message.
- While this number is most often the line where the error occurred, it
- is occasionally the number of a line containing a bracketing keyword
- like
- .B end
- or
- .B until .
- In this case, the diagnostic may refer to the previous statement.
- This occurs because of the method the translator uses for sampling line
- numbers.
- The absence of a trailing `;' in the previous statement causes the line
- number corresponding to the
- .B end
- or
- .B until .
- to become associated with the statement.
- As Pascal is a free-format language, the line number associations
- can only be approximate and may seem arbitrary to some users.
- This is the only notable exception, however, to reasonable associations.
- .SH
- Incompatible types
- .PP
- Since Pascal is a strongly typed language, many semantic errors manifest
- themselves as type errors.
- These are called `type clashes' by the translator.
- The types allowed for various operators in the language are summarized on page
- 108 of the
- Jensen-Wirth
- .I "User Manual" .
- It is important to know that the Pascal translator, in its diagnostics,
- distinguishes between the following type `classes':
- .br
- .ne 8
- .TS
- center;
- lew(10) le le le le.
- array Boolean char file integer
- pointer real record scalar string
- .TE
- These words are plugged into a great number of error messages.
- Thus, if you tried to assign an
- .I integer
- value to a
- .I char
- variable you would receive a diagnostic like the following:
- .LS
- .so clashout
- .LE
- In this case, one error produced a two line error message.
- If the same error occurs more than once, the same explanatory
- diagnostic will be given each time.
- .SH
- Scalar
- .PP
- The only class whose meaning is not self-explanatory is
- `scalar'.
- Scalar has a precise meaning in the
- Jensen-Wirth
- .I "User Manual"
- where, in fact, it refers to
- .I char ,
- .I integer ,
- .I real ,
- and
- .I Boolean
- types as well as the enumerated types.
- For the purposes of the Pascal translator,
- scalar
- in an error message refers to a user-defined, enumerated
- type, such as
- .I ops
- in the example above or
- .I color
- in
- .LS
- \*btype\fP color = (red, green, blue)
- .LE
- For integers, the more explicit denotation
- .I integer
- is used.
- Although it would be correct, in the context of the
- .I "User Manual"
- to refer to an integer variable as a
- .I scalar
- variable
- .PI
- prefers the more specific identification.
- .SH
- Function and procedure type errors
- .PP
- For built-in procedures and functions, two kinds of errors occur.
- If the routines are called with the wrong number of arguments a message similar to:
- .LS
- .so sinout1
- .LE
- is given.
- If the type of the argument is wrong, a message like
- .LS
- .so sinout2
- .LE
- is produced.
- A few functions and procedures implemented in Pascal 6000-3.4 are
- diagnosed as unimplemented in
- Berkeley
- Pascal, notably those related to
- .B segmented
- files.
- .SH
- Can't read and write scalars, etc.
- .PP
- The messages which state that scalar (user-defined) types
- cannot be written to and from files are often mysterious.
- It is in fact the case that if you define
- .LS
- \*btype\fP color = (red, green, blue)
- .LE
- ``standard'' Pascal does not associate these constants with the strings
- `red', `green', and `blue' in any way.
- An extension has been added which allows enumerated types
- to be read and written,
- however if the program is to be portable,
- you will have to write your own routines to perform these functions.
- Standard Pascal only allows the reading of characters, integers and real
- numbers from text files.
- You cannot read strings or Booleans.
- It is possible to make a
- .LS
- \*bfile of\fP color
- .LE
- but the representation is binary rather than string.
- .SH
- Expression diagnostics
- .PP
- The diagnostics for semantically ill-formed expressions are very explicit.
- Consider this sample translation:
- .LS
- % \*bpi -l expr.p\fP
- .so exprout
- %
- .LE
- This example is admittedly far-fetched, but illustrates that the error
- messages are sufficiently clear to allow easy determination of the
- problem in the expressions.
- .SH
- Type equivalence
- .PP
- Several diagnostics produced by the Pascal translator complain about
- `non-equivalent types'.
- In general,
- Berkeley
- Pascal considers variables to have the same type only if they were
- declared with the same constructed type or with the same type identifier.
- Thus, the variables
- .I x
- and
- .I y
- declared as
- .LS
- \*bvar\fP
- x: ^ integer;
- y: ^ integer;
- .LE
- do not have the same type.
- The assignment
- .LS
- x := y
- .LE
- thus produces the diagnostics:
- .LS
- .so typequout
- .LE
- Thus it is always necessary to declare a type such as
- .LS
- \*btype\fP intptr = ^ integer;
- .LE
- and use it to declare
- .LS
- \*bvar\fP x: intptr; y: intptr;
- .LE
- Note that if we had initially declared
- .LS
- \*bvar\fP x, y: ^ integer;
- .LE
- then the assignment statement would have worked.
- The statement
- .LS
- x^ := y^
- .LE
- is allowed in either case.
- Since the parameter to a
- .B procedure
- or
- .B function
- must be declared with a
- type identifier rather than a constructed type,
- it is always necessary, in practice,
- to declare any type which will be used in this way.
- .SH
- Unreachable statements
- .PP
- Berkeley
- Pascal flags unreachable statements.
- Such statements usually correspond to errors in the program logic.
- Note that a statement is considered to be reachable
- if there is a potential path of control,
- even if it can never be taken.
- Thus, no diagnostic is produced for the statement:
- .LS
- \*bif\fP false \*bthen\fP
- writeln('impossible!')
- .LE
- .SH
- Goto's into structured statements
- .PP
- The translator detects and complains about
- .B goto
- statements which transfer control into structured statements (\c
- .B for ,
- .B while ,
- etc.)
- It does not allow such jumps, nor does it allow branching from the
- .B then
- part of an
- .B if
- statement into the
- .B else
- part.
- Such checks are made only within the body of a single procedure or
- function.
- .SH
- Unused variables, never set variables
- .PP
- Although
- .PI
- always clears variables to 0 at
- .B procedure
- and
- .B function
- entry,
- .PC
- does not unless runtime checking is enabled using the
- .B C
- option.
- It is
- .B not
- good programming practice to rely on this initialization.
- To discourage this practice, and to help detect errors in program logic,
- .PI
- flags as a `w' warning error:
- .IP
- .RS
- .HP 1)
- Use of a variable which is never assigned a value.
- .IP 2)
- A variable which is declared but never used, distinguishing
- between those variables for which values are computed but which are never
- used, and those completely unused.
- .RE
- .LP
- In fact, these diagnostics are applied to all declared items.
- Thus a
- .B const
- or a
- .B procedure
- which is declared but never used is flagged.
- The
- .B w
- option of
- .PI
- may be used to suppress these warnings;
- see sections 5.1 and 5.2.
- .NH 2
- Translator panics, i/o errors
- .SH
- Panics
- .PP
- One class of error which rarely occurs, but which causes termination
- of all processing when it does is a panic.
- A panic indicates a translator-detected internal inconsistency.
- A typical panic message is:
- .LS
- snark (rvalue) line=110 yyline=109
- Snark in pi
- .LE
- If you receive such a message, the translation will be quickly and perhaps
- ungracefully terminated.
- You should contact a teaching assistant or a member of the system staff,
- after saving a copy of your program for later inspection.
- If you were making changes to an existing program when the problem
- occurred, you may
- be able to work around the problem by ascertaining which change caused the
- .I snark
- and making a different change or correcting an error in the program.
- A small number of panics are possible in
- .X .
- All panics should be reported to a teaching assistant or systems
- staff so that they can be fixed.
- .SH
- Out of memory
- .PP
- The only other error which will abort translation when no errors are
- detected is running out of memory.
- All tables in the translator, with the exception of the parse stack,
- are dynamically allocated, and can grow to take up the full available
- process space of 64000 bytes on the \s-2PDP\s0-11. On the \s-2VAX\s0-11,
- table sizes are extremely generous and very large (25000) line programs
- have been easily accommodated. For the \s-2PDP\s0\-11, it is
- generally true that
- the size of the largest translatable program is directly related to
- .B procedure
- and
- .B function
- size.
- A number of non-trivial Pascal programs, including
- some with more than 2000 lines and 2500 statements
- have been translated and interpreted using
- Berkeley
- Pascal on \s-2PDP\s0-11's.
- Notable among these are the Pascal-S
- interpreter,
- a large set of programs for automated generation of
- code generators,
- and a general context-free parsing program which has been used to
- parse sentences with a grammar for a superset of English.
- In general,
- very large programs should be translated using
- .PC
- and the separate compilation facility.
- .PP
- If you receive an out of space message from the translator
- during translation of a large
- .B procedure
- or
- .B function
- or one containing a large number of string constants
- you may yet be able
- to translate your program if you break this one
- .B procedure
- or
- .B function
- into several routines.
- .SH
- I/O errors
- .PP
- Other errors which you may encounter when running
- .PI
- relate to input-output.
- If
- .PI
- cannot open the file you specify,
- or if the file is empty,
- you will be so informed.
- .NH 2
- Run-time errors
- .PP
- We saw, in our second example, a run-time error.
- We here give the general description of run-time errors.
- The more unusual interpreter error messages are explained
- briefly in the manual section for
- .I px
- (1).
- .SH
- Start-up errors
- .PP
- These errors occur when the object file to be executed is not available
- or appropriate.
- Typical errors here are caused by the specified object file not existing,
- not being a Pascal object, or being inaccessible to the user.
- .SH
- Program execution errors
- .PP
- These errors occur when the program interacts with the Pascal runtime
- environment in an inappropriate way.
- Typical errors are values or subscripts out of range,
- bad arguments to built-in functions,
- exceeding the statement limit because of an infinite loop,
- or running out of memory\*(dd.
- .FS
- \*(ddThe checks for running out of memory are not foolproof and there
- is a chance that the interpreter will fault, producing a core image
- when it runs out of memory.
- This situation occurs very rarely.
- .FE
- The interpreter will produce a backtrace after the error occurs,
- showing all the active routine calls,
- unless the
- .B p
- option was disabled when the program was translated.
- Unfortunately, no variable values are given and no way of extracting them
- is available.*
- .FS
- * On the \s-2VAX\s0-11, each variable
- is restricted to allocate at most 65000 bytes of storage (this is a
- \s-2PDP\s0-11ism that has survived to the \s-2VAX\s0.)
- .FE
- .PP
- As an example of such an error, assume that we have accidentally
- declared the constant
- .I n1
- to be 6, instead of 7
- on line 2 of the program primes as given in section 2.6 above.
- If we run this program we get the following response.
- .LS
- % \*bpix primes.p\fP
- .so primeout3
- %
- .LE
- .PP
- Here the interpreter indicates that the program terminated
- abnormally due to a subscript out of range near line 14,
- which is eight lines into the body of the program primes.
- .SH
- Interrupts
- .PP
- If the program is interrupted while executing
- and the
- .B p
- option was not specified,
- then a backtrace will be printed.\*(dg
- .FS
- \*(dgOccasionally, the Pascal system will be in an inconsistent
- state when this occurs,
- e.g. when an interrupt terminates a
- .B procedure
- or
- .B function
- entry or exit.
- In this case, the backtrace will only contain the current line.
- A reverse call order list of procedures will not be given.
- .FE
- The file
- .I pmon.out
- of profile information will be written if the program was translated
- with the
- .B z
- option enabled to
- .PI
- or
- .IX .
- .SH
- I/O interaction errors
- .PP
- The final class of interpreter errors results from inappropriate
- interactions with files, including the user's terminal.
- Included here are bad formats for integer and real numbers (such as
- no digits after the decimal point) when reading.
-