Trailing-Edge
-
PDP-10 Archives
-
BB-JF18A-BM
-
sources/diu/diupatlangsp.req
There are 4 other files named diupatlangsp.req in the archive. Click here to see a list.
! COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1986.
! ALL RIGHTS RESERVED.
!
! THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND
! COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH
! THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR
! ANY OTHER COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE
! AVAILABLE TO ANY OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE
! SOFTWARE IS HEREBY TRANSFERRED.
!
! THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT
! NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL
! EQUIPMENT CORPORATION.
!
! DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF
! ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.
!
! PATLANGSP.REQ
!++
! FACILITY: PAT Parser
!
! ABSTRACT:
!
! PATLANGSP.REQ defines the interface between the user of the
! PAT Parser and the language independent portion of the parser.
! This file is provided with the PAT parser package and provides
! an example of a particular implementation of the interface
! specification.
!
! This file defines all of the language specific
! interfaces needed by the language independent portion
! of the parser.
!
! Note everything in PATLANGSP.BLI is referenced via macros
! in PATLANGSP.REQ. As a result it is possible to redefine
! the macros in this file to refer to routines in a number of
! language specific modules.
!
!
! THIS FILE MUST BE ALTERED TO USE WITH OTHER COMPILERS !
!
! ENVIRONMENT: VAX/VMS user mode
!
! AUTHOR: Harvey Alcabes, CREATION DATE: 18-Nov-80
!
! MODIFIED BY:
!
! Charlie Mitchell, 12-Nov-1981 : VERSION X2-001
! 001 - Use new PAT/BLISS interface. Add misc. new interface macros.
! Reorganize and document. Move local recovery tuning to
! PATLRTUNE.REQ.
!
! 002 - C. Richardson 25-May-84 Remove VMS dependencies.
!
! 253 Rename to DIUPATLANGSP.
! Gregory A. Scott 1-Jul-86
!--
!
! INCLUDE FILES
!
require 'DIUPATREQPRO';
library 'BLI:XPORT'; ! 002
library 'DIUPATDATA';
! IMPORTANT NOTE
!
! This file is language specific. It defines an interface that must
! be implemented to use the language independent portion of the parser.
! Naming conventions have been adopted to help identify those declarations
! that define the interface:
!
! o Macros and literals that define the interface begin with
! the prefix "LS_". You must define these appropriately.
!
! o Macros and literals that do not define the interface begin
! with "LSLOCAL_" or "TKN_". There is no direct reference to them
! in the language independent portion of the parser. Thus, you
! are free to delete them if you wish.
!
! o Global routines in PATLANGSP.REQ are prefixed with "PAT$LSLOCAL_".
! They are not part of the interface, and they are not referenced
! directly in the language independent portion of the parser.
! This file is divided into six sections, all of which are
! ***LANGUAGE SPECIFIC***
!
! 1. Interface to lexical analyzer and lexical tokens.
!
! 2. Terminal and non-terminal symbol interpretation.
!
! 3. Action routine interface.
!
! 4. Error message interface (local and scope recovery).
!
! 5. Error message interface (global recovery).
!
! 6. Other definitions.
! Section 1
!
! Interface to lexical analyer and lexical tokens:
!
! - Call to lexical analyzer.
!
! - Obtain the text for a lexical token.
!
! - Dump a lexical token (debugging).
!
! - Lexical token interpretation.
!
! - Translation of source locator to line number and column
! position.
%IF %BLISS (BLISS36) ! 002
%THEN ! 002
macro ! 002
PAR_GET_TOKEN = GETTOK %; ! 002
%FI ! 002
macro
LS_GET_LEX_TOKEN =
!++
! FUNCTIONAL DESCRIPTION:
!
! LS_GET_LEX_TOKEN gets the next lexical token.
! The lexical analyzer which it calls is expected to
! store tokens in separate locations so that the parser
! can manipulate several tokens at once.
! Because only a few tokens are considered at once,
! it is acceptable for the lexical analyzer to keep
! a ring buffer of LS_LEX_RING_BUFFER_SIZE tokens
! (see below) and to reuse storage for old tokens.
!
! FORMAL PARAMETERS:
!
! NONE
!
! VALUE:
!
! Returns a pointer to the new token.
!
!--
begin
external routine
PAR_GET_TOKEN;
PAR_GET_TOKEN ()
end
%;
! The size of the lexical token ring buffer mentioned in
! LS_GET_LEX_TOKEN is specified by the literal
! LS_LEX_RING_BUFFER_SIZE. Currently a value of 10 or
! more is required. (At the current time there is no
! advantage to having the value be greater than 10.)
literal
LS_LEX_RING_BUFFER_SIZE = 10;
%IF %BLISS (BLISS36) ! 002
%THEN ! 002
macro ! 002
PAT$LSLOCAL_SAVE_TOKEN = SAVTOK %; ! 002
%FI ! 002
macro
LS_SAVE_TOKEN (TOKEN_PTR) =
!++
! FUNCTIONAL DESCRIPTION:
!
! LS_SAVE_TOKEN is used whenever an error is detected at the
! very start of error recovery with a pointer to a
! lexical token. (The current token when the error was
! detected.) LS_SAVE_TOKEN must
! save the token (including auxiliary information that is
! associated with the token). This is necessary because
! the global recovery algorithm can skip an arbitrarily
! large number of tokens (more than fit in the ring buffer
! required by LS_GET_LEX_TOKEN).
!
! After global error recovery has been completed but
! before an error message is issued,
! LS_RETURN_SAVED_TOKEN is called to return a pointer
! to the saved token. The saved token is then used
! in constructing the error message:
!
! Found <description-of-saved-token> when expecting ...
!
! Two consecutive calls are never made to LS_SAVE_TOKEN
! without an intervening call to LS_RETURN_SAVED_TOKEN.
!
! FORMAL PARAMETERS:
!
! TOKEN_PTR pointer to token to save
!
! VALUE:
!
! NONE
!--
begin
external routine
PAT$LSLOCAL_SAVE_TOKEN : novalue;
PAT$LSLOCAL_SAVE_TOKEN (TOKEN_PTR);
end
%;
%IF %BLISS (BLISS36) ! 002
%THEN ! 002
macro ! 002
PAT$LSLOCAL_RETURN_SAVED_TOKEN = RETTOK %; ! 002
%FI ! 002
macro
LS_RETURN_SAVED_TOKEN =
!++
! FUNCTIONAL DESCRIPTION:
!
! See LS_SAVE_TOKEN.
! LS_RETURN_SAVED_TOKEN returns the token saved by LS_SAVE_TOKEN.
!
! FORMAL PARAMETERS:
!
! NONE
!
! VALUE:
!
! TOKEN_PTR
!--
begin
external routine
PAT$LSLOCAL_RETURN_SAVED_TOKEN;
PAT$LSLOCAL_RETURN_SAVED_TOKEN ()
end
%;
%if PATBLSEXT_DEBUGGING
%then
%IF %BLISS (BLISS36) ! 002
%THEN ! 002
macro ! 002
PAT$LSLOCAL_DUMP_TOK = DMPTOK %; ! 002
%FI ! 002
macro
LS_DUMP_TOK (TOKEN_PTR) =
!++
! FUNCTIONAL DESCRIPTION:
!
! LS_DUMP_TOK outputs the lexical token pointed to by TOKEN_PTR.
! (Only called by debugging routines)
!
! FORMAL PARAMETERS:
!
! TOKEN_PTR - Pointer to the lexical token which is to be dumped.
!
! VALUE:
!
! NONE
!
!--
begin
external routine
PAT$LSLOCAL_DUMP_TOK : novalue;
PAT$LSLOCAL_DUMP_TOK (TOKEN_PTR);
end
%;
%fi
! Interpretation of lexical tokens
!
! Given the address of a lexical token macros that follow must be
! able to return:
!
! 1. The terminal symbol number that corresponds to the
! terminal defined in the PAT grammar.
!
! 2. A source locator. This is intended to represent the
! line number and column position of the token in the source.
! The parser assumes that a BLISS value (32 bits on VAX,
! 16 on the -11) is allocated for a locator. However, all
! interpretation of the locator is done by language specific
! macros in PATLANGSP. Thus, the locator can be an encoded
! value or a pointer.
!
! 3. A string descriptor for the text (spelling) of identifiers
! and literals.
!
! 4. A boolean indicating a synthetic token (one created during
! error recovery). Note that semantics action routines should
! be prepared to check this boolean.
!
! 5. (optional) A boolean indicating that a token is the first
! one on a line.
!
! A structure definition follows for a lexical token. Note that
! the TKN_* fields are not refered to directly in the language
! independent portion of the parser. Rather, macros that follow
! return the values of particular fields.
!
! The structure of a lexical token is **LANGUAGE SPECIFIC**.
! Information which must be accessable for any language is indicated
! with "**" in the following comment
$FIELD TKN_FIELDS =
set
TKN_BASE = [$SUB_BLOCK ()], ! Placeholder to indicate base of token--uses no storage
TKN_TERM = [$INTEGER], ! **Terminal symbol number
TKN_LOCATOR = [$INTEGER], ! **Encoded column and line in source
TKN_TEXT = [$REF_DESCRIPTOR], ! 002 **Text in source - for literals
! See macro LS_LEX_TEXT
TKN_CLEAN_TEXT = [$REF_DESCRIPTOR], ! 002 Cleaned up source text - for operands
TKN_COMMENTS = [$ADDRESS], ! List of comments that appeared between
! the last token (if any) and this token
TKN_INTVALUE = [$INTEGER], ! Value (if integer)
TKN_REALVALUE = [$ADDRESS], ! Pointer to vector containing
! value if (real number)
TKN_START_LINE = [$BYTE], ! TRUE iff token is the first one on a line
TKN_SYNTHETIC = [$BYTE] ! **TRUE if token was created by error recovery
tes;
! routines instead of lexical analyzer
literal
TKN_SIZE = $FIELD_SET_SIZE*%upval; ! Size of lexical token (in BYTES)
macro
TKN_STR =
block [TKN_SIZE/%upval]
field
(TKN_FIELDS) %;
undeclare %quote
$DESCRIPTOR; ! due to current xport problem
macro
LS_TKN_SIZE =
!++
! FUNCTIONAL DESCRIPTION:
!
! Expands to the number of BYTES in a lexical token stucture
!
! FORMAL PARAMETERS:
!
! NONE
!
!--
TKN_SIZE %;
macro
LS_LEX_TERM (TOKEN_PTR) =
!++
! FUNCTIONAL DESCRIPTION:
!
! Returns the value of the terminal symbol number.
!
! FORMAL PARAMETERS:
!
! TOKEN_PTR - Address of a pointer variable which contains
! the address of a lexical token.
!
!--
begin
map
TOKEN_PTR : ref TKN_STR;
.TOKEN_PTR [TKN_TERM]
end
%;
macro
LS_LEX_INTVALUE (TOKEN_PTR) =
!++
! FUNCTIONAL DESCRIPTION:
!
! Returns the integer value of the terminal symbol.
!
! FORMAL PARAMETERS:
!
! TOKEN_PTR - Address of a pointer variable which contains
! the address of a lexical token.
!
!--
begin
map
TOKEN_PTR : ref TKN_STR;
.TOKEN_PTR [TKN_INTVALUE]
end
%;
macro
LS_LEX_LOCATOR (TOKEN_PTR) =
!++
! FUNCTIONAL DESCRIPTION:
!
! Returns the value of a source locator associated with a
! lexical token.
!
! FORMAL PARAMETERS:
!
! TOKEN_PTR - Address of a pointer variable which contains
! the address of a lexical token.
!
!--
begin
map
TOKEN_PTR : ref TKN_STR;
.TOKEN_PTR [TKN_LOCATOR]
end
%;
macro
LS_LEX_TEXT (TOKEN_PTR) =
!++
! FUNCTIONAL DESCRIPTION:
!
! Returns the text (spelling) associated with a lexical token
! (for identifiers and literals).
!
! The parser expects to get the address of a VMS static string
! descriptor.
!
! FORMAL PARAMETERS:
!
! TOKEN_PTR - Address of a pointer variable which contains
! the address of a lexical token.
!
!--
begin
map
TOKEN_PTR : ref TKN_STR;
.TOKEN_PTR [TKN_TEXT]
end
%;
%if PATBLSEXT_EXTRA_STACK_FIELD
%then
macro
LS_LEX_EXTRA_INFO (TOKEN_PTR) =
!++
! FUNCTIONAL DESCRIPTION:
!
! Returns extra info associated with lexical token that is
! to be stacked on the parse stack. (See PATBLSEXT.REQ.)
!
! FORMAL PARAMETERS:
!
! TOKEN_PTR - Address of a pointer variable which contains
! the address of a lexical token.
!
!--
begin
map
TOKEN_PTR : ref TKN_STR;
.TOKEN_PTR [TKN_COMMENTS]
end
%;
%fi
macro
LS_LEX_START_LINE (TOKEN_PTR) =
!++
! FUNCTIONAL DESCRIPTION:
!
! Returns a boolean indicating if a lexical token is the first
! one on a line. This macro is only used when trying to insert
! an end-of-line token at the end of a line.
!
! This macro should expand to FALSE for languages that don't
! often have end-of-line tokens at the end of lines.
!
! FORMAL PARAMETERS:
!
! TOKEN_PTR - Address of a pointer variable which contains
! the address of a lexical token.
!
!--
begin
map
TOKEN_PTR : ref TKN_STR;
.TOKEN_PTR [TKN_START_LINE]
end
%;
macro
LS_LEX_SYNTHETIC (TOKEN_PTR) =
!++
! FUNCTIONAL DESCRIPTION:
!
! Returns a boolean indicating if a lexical token is synthetic
! (was created by the error recovery routines).
!
! FORMAL PARAMETERS:
!
! TOKEN_PTR - Address of a pointer variable which contains
! the address of a lexical token.
!
!--
begin
map
TOKEN_PTR : ref TKN_STR;
.TOKEN_PTR [TKN_SYNTHETIC]
end
%;
macro
LS_LEX_SET_TERM (TOKEN_PTR, TERMINAL) =
!++
! FUNCTIONAL DESCRIPTION:
!
! Sets the field of TOKEN_PTR which contains its terminal symbol
! to TERMINAL. This is used when the parser is creating a
! synthetic lexical token.
!
! FORMAL PARAMETERS:
!
! TOKEN_PTR - Address of a pointer variable which contains
! the address of a lexical token.
!
! TERMINAL - Terminal symbol number
!
!--
begin
map
TOKEN_PTR : ref TKN_STR;
TOKEN_PTR [TKN_TERM] = TERMINAL
end
%;
macro
LS_LEX_SET_SYNTHETIC (TOKEN_PTR) =
!++
! FUNCTIONAL DESCRIPTION:
!
! Sets the field of TOKEN_PTR which indicates that a lexical
! token is synthetic to TRUE, meaning that it was created by
! the error recovery routines.
!
! In addition, if the locator is set to a value that indicates
! a synthetic token, a better scope recovery error message
! can be produced. (See LSLOCAL_LOCATOR_IS_SYNTHETIC and
! LS_ERROR_SCOPE_MATCH.)
!
! FORMAL PARAMETERS:
!
! TOKEN_PTR - Address of a pointer variable which contains
! the address of a lexical token.
!
!--
begin
map
TOKEN_PTR : ref TKN_STR;
TOKEN_PTR [TKN_SYNTHETIC] = TRUE;
TOKEN_PTR [TKN_LOCATOR] = LSLOCAL_SYNTHETIC_LOCATOR
end
%;
macro
LSLOCAL_LOCATOR_IS_SYNTHETIC (SLOC) =
!++
! FUNCTIONAL DESCRIPTION:
!
! LSLOCAL_LOCATOR_IS_SYNTHETIC has value TRUE if it can be
! determined that a locator is associated with a synthetic
! token. (See LS_LEX_SET_SYNTHETIC and LS_ERROR_SCOPE_MATCH.)
!
! FORMAL PARAMETERS:
!
! SLOC - Source locator
!
! VALUE:
!
! TRUE if synthetic; FALSE if not or if cannot determine.
!
!--
begin
(SLOC) eql LSLOCAL_SYNTHETIC_LOCATOR
end
%;
! Locator value that indicates a synthetic locator
literal
LSLOCAL_SYNTHETIC_LOCATOR = 0;
%IF %BLISS (BLISS36) ! 002
%THEN ! 002
macro ! 002
PAR_LINE_NUMBER = PARLNM %; ! 002
%FI ! 002
macro
LS_LEX_LINE_NUMBER (SLOC) =
!++
! FUNCTIONAL DESCRIPTION:
!
! LS_LEX_LINE_NUMBER converts a source locator to a line number.
!
! FORMAL PARAMETERS:
!
! SLOC - Source locator
!
! VALUE:
!
! Line number extracted from source locator.
!
!--
begin
external routine
PAR_LINE_NUMBER;
PAR_LINE_NUMBER (SLOC)
end
%;
%IF %BLISS (BLISS36) ! 002
%THEN ! 002
macro ! 002
PAR_COLUMN_NUMBER = PARCNM %; ! 002
%FI ! 002
macro
LS_LEX_COLUMN_NUMBER (SLOC) =
!++
! FUNCTIONAL DESCRIPTION:
!
! LS_LEX_COLUMN_NUMBER converts a source locator to a column number.
!
! FORMAL PARAMETERS:
!
! SLOC - Source locator
!
! VALUE:
!
! Column number extracted from source locator.
!
!--
begin
external routine
PAR_COLUMN_NUMBER;
PAR_COLUMN_NUMBER (SLOC)
end
%;
! Section 2
!
! Macros to interpret terminal and non-terminal symbols.
!
!
! LS_STOP_PARSING_NT--**LANGUAGE SPECIFIC**
!
! The parser stops when it does a reduction to the production with the
! left hand side of LS_STOP_PARSING_NT.
!
! PAT_SENTENCE_CD is automatically defined to be the first production
! in the grammar (the one containing GOALSY).
literal !***LANGUAGE SPECIFIC***
LS_STOP_PARSING_NT = NT_ONE_OR_THE_OTHER; ! Stop when have seen this
macro
LS_IS_EOF (SYMBOL_NUM) =
!++
! FUNCTIONAL DESCRIPTION:
!
! Return TRUE if SYMBOL_NUM represents the end of a file,
! FALSE otherwise
!
! FORMAL PARAMETERS:
!
! SYMBOL_NUM
!
!--
((SYMBOL_NUM) eql T_EOF) %;
macro
LS_IS_IDENTIFIER (SYMBOL_NUM) =
!++
! FUNCTIONAL DESCRIPTION:
!
! Return TRUE if SYMBOL_NUM represents an identifier,
! FALSE otherwise
!
! FORMAL PARAMETERS:
!
! SYMBOL_NUM
!
!--
((SYMBOL_NUM) eql T_CDD_NAME) %;
%IF %BLISS (BLISS36) ! 002
%THEN ! 002
macro ! 002
PAT$LSLOCAL_IS_RESERVED_WORD = RESWRD %; ! 002
%FI ! 002
macro
LS_IS_RESERVED_WORD (SYMBOL_NUM) =
!++
! FUNCTIONAL DESCRIPTION:
!
! Return TRUE if SYMBOL_NUM represents a terminal symbol
! which is a reserved word, FALSE otherwise.
!
! FORMAL PARAMETERS:
!
! SYMBOL_NUM
!
!--
begin
external routine
PAT$LSLOCAL_IS_RESERVED_WORD;
PAT$LSLOCAL_IS_RESERVED_WORD (SYMBOL_NUM)
end
%;
%IF %BLISS (BLISS36) ! 002
%THEN ! 002
macro ! 002
PAT$LSLOCAL_IS_NON_TERM = NONTRM %; ! 002
%FI ! 002
macro
LS_IS_NON_TERM (SYMBOL_NUM) =
!++
! FUNCTIONAL DESCRIPTION:
!
! Return TRUE if SYMBOL_NUM represents a non-terminal symbol,
! FALSE otherwise
!
! FORMAL PARAMETERS:
!
! SYMBOL_NUM
!
!--
begin
external routine
PAT$LSLOCAL_IS_NON_TERM;
PAT$LSLOCAL_IS_NON_TERM (SYMBOL_NUM)
end
%;
macro
LS_T_IDENTIFIER =
!++
! FUNCTIONAL DESCRIPTION:
!
! Language independent name for identifier token.
!
! FORMAL PARAMETERS:
!
! NONE
!
!--
T_CDD_NAME %;
macro
LS_T_SEMICOLON =
!++
! FUNCTIONAL DESCRIPTION:
!
! Language independent name for end-of-line token.
! If macro LS_LEX_START_LINE always returns false, then the value of
! this macro is irrelevant.
!
! FORMAL PARAMETERS:
!
! NONE
!
!--
T_DOT %;
macro
LS_T_ERRORMARK =
!++
! FUNCTIONAL DESCRIPTION:
!
! Language independent name for errormark token.
!
! FORMAL PARAMETERS:
!
! NONE
!
!--
T_ERRORMARK %;
! Section 3
!
! Interface to action routines
%IF %BLISS (BLISS36) ! 002
%THEN ! 002
macro ! 002
PAR_ABST = PARABS %; ! 002
%FI ! 002
macro
LS_REDUCE_ACTION (code, LEFT, RIGHT, SLOC, RIGHT_TOKEN_PTR) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This macro is called by the parser when a reduction is
! done for which a semantics action is specified.
!
! The best way to understand these parameters is to run
! the sample parser provided with the PAT package. In the
! sample parser, calls to this macro result in a display
! of the parse stack and of the actual parameters of this
! macro.
!
! FORMAL PARAMETERS:
!
! CODE - A code indicating which action is to be performed
! (the action specified in the input to PAT).
!
! LEFT - The index into the parse stack corresponding
! to the left hand end of the "handle", i.e. the string
! of terminals and non-terminals corresponding to the
! right hand side of a production.
!
! Note that this stack index can be used to
! index a parallel semantics stack maintained
! by the semantics action routine.
!
! RIGHT - Similar to LEFT, but corresponding to the right hand
! end of the handle.
!
! SLOC - Source locator
!
! RIGHT_TOKEN_PTR - If the last symbol in the reduction is a terminal,
! this is a pointer to the token containing that
! symbol. If it is a non-terminal then this value
! is undefined.
!
! VALUE:
!
! MAY_BACKUP - Boolean value; if TRUE, error recovery will
! be allowed to backup over this reduction
!
!--
begin
external routine
ACTION_RTN; ! Comment out when not using
! PAR_ABST; ! Comment out when not using
local
status %BLISS32( : long);
! Comment out next line when not using sample semantics routine PAR_ABST.
! status = PAR_ABST (code, LEFT, RIGHT, SLOC, RIGHT_TOKEN_PTR);
! Comment out next section when not using semantics action routines.
IF .syntax_only
THEN status = TRUE
ELSE status = action_rtn (code, left, right, sloc,
right_token_ptr, .result);
.status
end
%;
macro
LS_REDUCE_NO_ACTION (LEFT, RIGHT) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This macro is called by the parser when a production has
! been recognized which does not have a semantics action
! associated with it.
!
! FORMAL PARAMETERS:
!
! LEFT - Left stack position of handle
!
! RIGHT - Right stack position of handle
!
!
! VALUE:
!
! MAY_BACKUP - Boolean value; if TRUE, error recovery will
! be allowed to backup over this reduction
!
!--
begin
TRUE
end
%;
macro
LS_LOCAL_RECOVERY_INFORM (BACKED_OVER_TOKEN, MAY_HAVE_BACKED_OVER_REDUCTIONS, POPPED_STACK,
STACK_INDEX_AFTER, STACK_INDEX_BEFORE) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This macro is called by the parser when local error
! recovery (which includes scope recovery) has been successfully
! completed. It provides information that the action routines can
! use to compensate for the behavior of the error recovery.
!
! FORMAL PARAMETERS:
!
! BACKED_OVER_TOKEN - Boolean indicating whether or not the
! error recovery backed up over a
! lexical token
!
! MAY_HAVE_BACKED_OVER_REDUCTION - Boolean indicating whether the error
! recovery could have backed up over
! a reduction
!
! POPPED_STACK - Boolean indicating whether or not the
! parse stack was popped by error
! recovery
!
! STACK_INDEX_AFTER - Size of parse stack after error
! recovery.
! INVALID IF POPPED_STACK IS FALSE
!
! STACK_INDEX_BEFORE - Size of parse stack before error
! recovery.
! INVALID IF POPPED_STACK IS FALSE
!
! VALUE:
!
! NONE
!
!--
begin
0
end
%;
macro
LS_GLOBAL_RECOVERY_INFORM (STACK_INDEX_AFTER, STACK_INDEX_BEFORE) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This macro is called by the parser when global error
! recovery has been performed. It provides information that
! the action routines can use to compensate for the behavior
! of the error recovery.
!
! FORMAL PARAMETERS:
!
! STACK_INDEX_AFTER - Size of parse stack after error recovery
!
!
! STACK_INDEX_BEFORE - Size of parse stack before error recovery
!
!
! VALUE:
!
! NONE
!
!--
begin
0
end
%;
! Section 4
!
! Error message interface (internal errors, local and scope recovery
! errors)
macro
LS_ERROR_PARSE_STACK_OVERFLOW (ERROR_LOC) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This macro is called if a parse stack overflow occurs.
! (See later definition of LS_PARSE_STACK_SIZE.)
!
! FORMAL PARAMETERS:
!
! ERROR_LOC - Source locator when overflow occured.
!
!++
begin
DEB_ASSERT (FALSE, 'Parse stack overflow')
end
%;
! The next group of macros are used to specify the format of the
! error messages for local and scope recovery.
! They may be left intact or changed.
macro
LS_ERROR_EOL (ERROR_LOC) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This macro writes an error message describing an end-of-line
! correction.
!
! FORMAL PARAMETERS:
!
! ERROR_LOC - Source locator of error.
!
!--
begin
LSLOCAL_SYNTAX_ERRORM (ERROR_LOC, 'Inserted "." at the end of the previous line');
end
%;
%IF %BLISS (BLISS36) ! 002
%THEN ! 002
macro ! 002
PAT$LSLOCAL_OUTPUT_TERM = OUTTRM %, ! 002
PAT$LSLOCAL_OUTPUT_TOKEN = OUTTOK %; ! 002
%FI ! 002
macro
LS_ERROR_MERGE (ERROR_LOC, FIRST_TOKEN_PTR, SECOND_TOKEN_PTR, NEW_TERMINAL) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This macro writes an error message describing a token merge correction.
!
! FORMAL PARAMETERS:
!
! ERROR_LOC - Source locator of error.
!
! FIRST_TOKEN_PTR - Pointer to first of the two merged tokens.
!
! SECOND_TOKEN_PTR - Pointer to second of the two merged tokens.
!
! NEW_TERMINAL - Terminal formed by merging the two tokens.
!
!--
begin
external routine
PAT$LSLOCAL_OUTPUT_TERM,
PAT$LSLOCAL_OUTPUT_TOKEN;
LSLOCAL_SYNTAX_ERROR_START (ERROR_LOC);
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC, 'Merged ', PAT$LSLOCAL_OUTPUT_TOKEN (FIRST_TOKEN_PTR, 0));
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC, ' and ', PAT$LSLOCAL_OUTPUT_TOKEN (SECOND_TOKEN_PTR, 1));
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC, ' to form ', PAT$LSLOCAL_OUTPUT_TERM (NEW_TERMINAL, TRUE, 2));
LSLOCAL_SYNTAX_ERROR_END (ERROR_LOC);
end
%;
macro
LS_ERROR_ABBREV (ERROR_LOC, ID_TOKEN_PTR, RW_TOKEN_PTR) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This macro writes an error message describing an abbreviation
! correction (a form of spelling correction).
!
! FORMAL PARAMETERS:
!
! ERROR_LOC - Source locator of error.
!
! ID_TOKEN_PTR - Pointer to token containing identifier
! (which is the abbreviated reserved word).
!
! RW_TOKEN_PTR - Pointer to token containing reserved word
! (which had been abbreviated).
!
!--
begin
external routine
PAT$LSLOCAL_OUTPUT_TOKEN;
local
ID_TOKEN;
ID_TOKEN = ID_TOKEN_PTR;
LSLOCAL_SYNTAX_ERROR_START (ERROR_LOC);
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC, 'Spelling corrector replaced abbreviation ');
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC, LS_LEX_TEXT (ID_TOKEN));
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC, ' with ', PAT$LSLOCAL_OUTPUT_TOKEN (RW_TOKEN_PTR, 0));
LSLOCAL_SYNTAX_ERROR_END (ERROR_LOC);
end
%;
macro
LS_ERROR_SPELL (ERROR_LOC, ID_TOKEN_PTR, RW_TOKEN_PTR) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This macro writes an error message describing a spelling correction.
!
! FORMAL PARAMETERS:
!
! ERROR_LOC - Source locator of error.
!
! ID_TOKEN_PTR - Pointer to token containing identifier
! (which is the misspelled reserved word).
!
! RW_TOKEN_PTR - Pointer to token containing the reserved word
! (which had been misspelled).
!
!--
begin
external routine
PAT$LSLOCAL_OUTPUT_TOKEN;
LSLOCAL_SYNTAX_ERROR_START (ERROR_LOC);
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC, 'Spelling corrector replaced ');
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC, PAT$LSLOCAL_OUTPUT_TOKEN (ID_TOKEN_PTR, 0));
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC, ' with ', PAT$LSLOCAL_OUTPUT_TOKEN (RW_TOKEN_PTR, 1));
LSLOCAL_SYNTAX_ERROR_END (ERROR_LOC);
end
%;
macro
LS_ERROR_SUBST (ERROR_LOC, INIT_TOKEN_PTR, NEW_TOKEN_PTR) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This macro writes an error message describing a token
! substitution correction.
!
! FORMAL PARAMETERS:
!
! ERROR_LOC - Source locator of error.
!
! INIT_TOKEN_PTR - Pointer to token containing initial token
! (which is being replaced).
!
! NEW_TOKEN_PTR - Pointer to token containing new token
! (which is being inserted in place of
! INIT_TOKEN_PTR).
!
!--
begin
external routine
PAT$LSLOCAL_OUTPUT_TERM,
PAT$LSLOCAL_OUTPUT_TOKEN;
local
NEW; ! Need pointer variable to call LS_LEX_TERM
NEW = NEW_TOKEN_PTR;
LSLOCAL_SYNTAX_ERROR_START (ERROR_LOC);
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC, 'Replaced ', PAT$LSLOCAL_OUTPUT_TOKEN (INIT_TOKEN_PTR, 0));
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC, ' with ', PAT$LSLOCAL_OUTPUT_TERM (LS_LEX_TERM (NEW), TRUE, 1))
;
LSLOCAL_SYNTAX_ERROR_END (ERROR_LOC);
end
%;
macro
LS_ERROR_INSERT (ERROR_LOC, INSERTED_TOKEN_PTR, FOLLOWING_TOKEN_PTR) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This macro writes an error message describing an insertion correction.
!
! FORMAL PARAMETERS:
!
! ERROR_LOC - Source locator of error.
!
! INSERTED_TOKEN_PTR - Pointer to token containing inserted token.
!
! FOLLOWING_TOKEN_PTR - Pointer to token containing token following
! inserted token.
!
!--
begin
external routine
PAT$LSLOCAL_OUTPUT_TERM,
PAT$LSLOCAL_OUTPUT_TOKEN;
local
INSERTED; ! Need pointer variable to call LS_LEX_TERM
INSERTED = INSERTED_TOKEN_PTR;
LSLOCAL_SYNTAX_ERROR_START (ERROR_LOC);
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC, 'Inserted ',
PAT$LSLOCAL_OUTPUT_TERM (LS_LEX_TERM (INSERTED),
TRUE, 0));
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC, ' before ', PAT$LSLOCAL_OUTPUT_TOKEN (FOLLOWING_TOKEN_PTR, 1));
LSLOCAL_SYNTAX_ERROR_END (ERROR_LOC);
end
%;
macro
LS_ERROR_DELETED (ERROR_LOC, DELETED_TOKEN_PTR) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This macro writes an error message describing an deletion correction.
!
! FORMAL PARAMETERS:
!
! ERROR_LOC - Source locator of error.
!
! DELETED_TOKEN_PTR - Pointer to token containing deleted token.
!
!--
begin
external routine
PAT$LSLOCAL_OUTPUT_TOKEN;
local
DELETED; ! Need pointer variable to call LS_LEX_LOCATOR
DELETED = DELETED_TOKEN_PTR;
LSLOCAL_SYNTAX_ERRORM (LS_LEX_LOCATOR (DELETED), 'Unexpected ',
PAT$LSLOCAL_OUTPUT_TOKEN (DELETED_TOKEN_PTR, 0), ' deleted');
end
%;
macro
LS_ERROR_SCOPE_NO_MATCH (ERROR_LOC, CLOSER_TEXT, FOLLOWING_TOKEN_PTR) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This macro writes an error message describing a scope recovery
! correction for which no matching symbol was provided for the closer.
!
! FORMAL PARAMETERS:
!
! ERROR_LOC - Source locator of error.
!
! CLOSER_TEXT - String descriptor to text describing the
! inserted scope closer.
!
! FOLLOWING_TOKEN_PTR - Pointer to token containing token following
! inserted closer.
!
!--
begin
external routine
PAT$LSLOCAL_OUTPUT_TOKEN;
LSLOCAL_SYNTAX_ERROR_START (ERROR_LOC);
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC, 'Inserted ', CLOSER_TEXT);
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC, ' before ', PAT$LSLOCAL_OUTPUT_TOKEN (FOLLOWING_TOKEN_PTR, 0));
LSLOCAL_SYNTAX_ERROR_END (ERROR_LOC);
end
%;
%IF %BLISS (BLISS36) ! 002
%THEN ! 002
macro ! 002
PAT$LSLOCAL_LOC_TEXT = LOCTXT %; ! 002
%FI ! 002
macro
LS_ERROR_SCOPE_MATCH (ERROR_LOC, CLOSER_TEXT, MATCHING_SYMBOL, MATCH_LOC) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This macro writes an error message describing a scope recovery
! correction for which a matching symbol was provided for the closer.
!
! FORMAL PARAMETERS:
!
! ERROR_LOC - Source locator of error.
!
! CLOSER_TEXT - String descriptor to text describing the
! inserted scope closer.
!
! MATCHING_SYMBOL - Symbol number of the terminal symbol which
! opens the scope being closed.
!
! MATCH_LOC - Source locator of the token containing the
! matching symbol which opened the scope being
! closed.
!
!--
begin
external routine
PAT$LSLOCAL_OUTPUT_TERM,
PAT$LSLOCAL_LOC_TEXT;
LSLOCAL_SYNTAX_ERROR_START (ERROR_LOC);
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC, 'Inserted ');
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC, CLOSER_TEXT);
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC, ' to match ');
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC, PAT$LSLOCAL_OUTPUT_TERM (MATCHING_SYMBOL, FALSE, 0));
if LSLOCAL_LOCATOR_IS_SYNTHETIC (MATCH_LOC)
then
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC,
' inserted earlier')
else
LSLOCAL_SYNTAX_ERROR_TEXTM (ERROR_LOC, ' ', PAT$LSLOCAL_LOC_TEXT (MATCH_LOC));
LSLOCAL_SYNTAX_ERROR_END (ERROR_LOC);
end
%;
! The next group of macros are local to PATLANGSP and are not part of
! the interface.
macro
LSLOCAL_SYNTAX_ERROR_START (SLOC) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This macro indicates the start of a syntax or lexical error message.
! A call to this macro must be followed by one or more calls to
! LSLOCAL_SYNTAX_ERROR_TEXT and finally by a call to
! LSLOCAL_SYNTAX_ERROR_END.
!
! FORMAL PARAMETERS:
!
! SLOC - Source locator.
!
!--
begin
EXTERNAL pinfile: $STR_DESCRIPTOR ();
PUT_MSG ('Error on line ');
PUT_NUMBER (LS_LEX_LINE_NUMBER (SLOC));
PUT_MSG (' column ');
PUT_NUMBER (LS_LEX_COLUMN_NUMBER (SLOC));
PUT_MSG (' of ');
PUT_STRING (pinfile);
PUT_MSG (': ');
end
%;
macro
LSLOCAL_SYNTAX_ERROR_TEXT (SLOC, STRING) =
!++
! FUNCTIONAL DESCRIPTION:
!
! Append text to a syntax error message.
!
! FORMAL PARAMETERS:
!
! SLOC - Source locator.
!
! STRING - Address of a string descriptor.
!
!--
begin
bind
S = (STRING) : $STR_DESCRIPTOR (); ! 002
if PUT_LINE_FULL (.S [STR$H_LENGTH]) ! 002 if would overflow the line
then
begin
PUT_EOL ();
PUT_MSG (' '); ! tab
end;
PUT_STRING (S);
end
%;
macro
LSLOCAL_SYNTAX_ERROR_END (SLOC) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This macro ends a syntax error message started
! by a call to LSLOCAL_SYNTAX_ERROR_START. It automatically ends
! the current line.
!
! FORMAL PARAMETERS:
!
! SLOC - Source locator.
!
!--
begin
PUT_EOL ();
end
%;
macro
LSLOCAL_SYNTAX_ERRORM (SLOC) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This is a macro interface that permits an syntax error
! to be reported in a single call.
!
! FORMAL PARAMETERS:
!
! SLOC - Source locator.
!
! %remaining - list of quoted strings or expressions. The
! value of each expression should be the address
! of a string descriptor. The strings are
! appended to form the error message text.
!
!--
begin
LSLOCAL_SYNTAX_ERROR_START (SLOC);
LSLOCAL_SYNTAX_ERROR_TEXTM (SLOC, %remaining);
LSLOCAL_SYNTAX_ERROR_END (SLOC);
end
%;
macro
LSLOCAL_SYNTAX_ERROR_TEXTM (SLOC, TEXT) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This is a macro interface to LSLOCAL_SYNTAX_ERROR_TEXT and has the same
! effect as a sequence of calls to LSLOCAL_SYNTAX_ERROR_TEXT.
!
! FORMAL PARAMETERS:
!
! SLOC - Source locator.
!
! %remaining - list of quoted strings or expressions. The
! value of each expression should be the address
! of a string descriptor.
!
!--
begin
LSLOCAL_SYNTAX_ERROR_TEXTM2 (SLOC,
TEXT
%if not %null (%remaining)
%then
,
%remaining
%fi
)
end
%;
! This macro is only called by LSLOCAL_SYNTAX_ERROR_TEXTM
macro
LSLOCAL_SYNTAX_ERROR_TEXTM2 (SLOC, TEXT) [] =
begin
%if %isstring (TEXT)
%then
LOCAL lstemp_desc : $STR_DESCRIPTOR(STRING=text);
%else
BIND lstemp_desc = text;
%fi
LSLOCAL_SYNTAX_ERROR_TEXT (SLOC,lstemp_desc);
LSLOCAL_SYNTAX_ERROR_TEXTM2(SLOC, %remaining)
end%;
! Section 5
!
! Error message interface (global recovery)
!
! In preparation for issuing a global recovery message,
! LS_EXPECTED_SYMBOL is called for each terminal and non-
! terminal symbol that could have led to a correct parse
! instead of an error. A bit vector is set to indicate
! those terminals that were expected, and another bit
! vector can be used to remember special non-terminal
! symbols that were expected.
!
! LS_GLOBAL_ERROR_MSG is called to issue the error message.
! Addresses of the bit vectors set in LS_EXPECTED_SYMBOL are
! passed as parameters. Information in the two bit vectors
! can be used to improve the error message. For example,
! information in the terminals expected vector can be used to
! produce an error message of the form
!
! Found ... when expecting {arithmetic operator}
!
! instead of
!
! Found ... when expecting {"rem", "mod", "+", "-", ...}
!
!
! Information in the non-terminals expected vector can be
! used to "edit" the terminals expected vector and produce
! errors such as
!
! Found ... when expecting {statement}
!
! instead of
!
! Found ... when expecting {"if", "loop", "begin", ...}
! The parser allocates the bit vector used to remember special
! non-terminal symbols. LS_NUM_GROUP_NONTERMS specifies the number
! of bits in this vector. This bit vector is cleared by the parser,
! but otherwise it is up to language specific routines to set and
! interpret the bits. LS_NUM_GROUP_NONTERMS must have a value of 1
! or greater even if the user does not wish to use this bit vector.
literal
LS_NUM_GROUP_NONTERMS = 9;
%IF %BLISS (BLISS36) ! 002
%THEN ! 002
macro ! 002
PAT$LSLOCAL_EXPECTED_SYMBOL = EXPSYM %; ! 002
%FI ! 002
macro
LS_EXPECTED_SYMBOL (SYM, REF_GROUP_NONTERMS_SEEN, REF_TERMS_TO_PRINT) =
!++
! FUNCTIONAL DESCRIPTION:
!
! LS_EXPECTED_SYMBOL adds the symbol SYM to the set of
! symbols to be listed as expected in a global recovery
! error message by setting fields in GR_GROUP_NONTERMS_SEEN
! and GR_TERMS_TO_PRINT appropriately.
!
! FORMAL PARAMETERS:
!
! SYM - Terminal or non-terminal symbol
!
! REF_GROUP_NONTERMS_SEEN - Pointer to table of important grouping
! non-terminals, indicating which have
! been seen
!
! REF_TERMS_TO_PRINT - Pointer to table of terminals, indicating
! which were expected.
!
! VALUE:
!
! NONE
!
!--
begin
external routine
PAT$LSLOCAL_EXPECTED_SYMBOL : novalue;
PAT$LSLOCAL_EXPECTED_SYMBOL (SYM, REF_GROUP_NONTERMS_SEEN, REF_TERMS_TO_PRINT);
end
%;
%IF %BLISS (BLISS36) ! 002
%THEN ! 002
macro ! 002
PAT$LSLOCAL_GLOBAL_ERROR_MSG = GLBERM %; ! 002
%FI ! 002
macro
LS_GLOBAL_ERROR_MSG (BAD_NON_TERM, ERROR_TOKEN_PTR, REF_GROUP_NONTERMS_SEEN, REF_TERMS_TO_PRINT,
BYTES_FOR_TERMS) =
!++
! FUNCTIONAL DESCRIPTION:
!
! LS_GLOBAL_ERROR_MESSAGE outputs an error message for global
! error recovery.
!
! The global error recovery that has been done will eventually
! result in the recognition of some production containing an
! errormark:
!
! LHS_NON_TERMINAL_NAME = ... errormark ... ;
!
! where ... indicates a sequence of terminal/non-terminal
! symbols. The symbol number of the non-terminal on the
! left hand side (LHS_NON_TERMINAL_NAME above) will be passed
! as parameter BAD_NON_TERM if it can be determined easily.
! (It can be determined easily if the "..." on the right
! of the errormark consists of a single terminal
! symbol.) Otherwise LS_UNAVAILABLE_NT will be passed.
!
! This information permits error of the form
!
! Invalid statement--Found ... when expecting ...
!
! instead of
!
! Found ... when expecting ...
!
!
! FORMAL PARAMETERS:
!
! BAD_NON_TERM - Number of non-terminal symbol (see above)
!
! ERROR_TOKEN_PTR - Pointer to token at which error was
! encountered
!
! REF_GROUP_NONTERMS_SEEN - Pointer to bit vector indicating which
! important group non-terminal symbol
! were expected. (See LS_EXPECTED_SYMBOL.)
! Note that this vector can be modified.
!
! REF_TERMS_TO_PRINT - Pointer to bit vector which indicating which
! terminal symbols were expected. (See
! LS_EXPECTED_SYMBOL.) Note that this vector
! can be modified.
!
! BYTES_FOR_TERMS - Number of bytes used by TERMS_TO_PRINT
!
! VALUE:
!
! NONE
!
!--
begin
external routine
PAT$LSLOCAL_GLOBAL_ERROR_MSG;
PAT$LSLOCAL_GLOBAL_ERROR_MSG (BAD_NON_TERM, ERROR_TOKEN_PTR, REF_GROUP_NONTERMS_SEEN,
REF_TERMS_TO_PRINT, BYTES_FOR_TERMS);
end
%;
! LS_UNAVAILABLE_NT is sometimes passed as the value of parameter
! BAD_NON_TERM. (See description of LS_GLOBAL_ERROR_MSG.)
literal
LS_UNAVAILABLE_NT = -2;
! Section 6
!
! Other definitions
! LS_PARSE_STACK_SIZE--**LANGUAGE SPECIFIC**
!
! This constant specifies the size (number of elements) in the parse
! stack.
literal
LS_PARSE_STACK_SIZE = 256;
macro
LS_PARSE_STACK_DECL =
!++
! FUNCTIONAL DESCRIPTION
!
!
! NOTE: Probably you do not need any more about this macro.
! Just leave it the way it is and everything will be fine.
!
! This is a special macro for a PDP-11 user of the
! PAT parser. This macro usually expands to LOCAL meaning
! that the parse stack is declared as a local variable. This macro
! generally does not need to be changed for other implementations.
!--
local %;
! End of PATLANGSP.REQ