Trailing-Edge
-
PDP-10 Archives
-
CFS_TSU04_19910205_1of1
-
update/t20src/diulrt.bli
There are 4 other files named diulrt.bli in the archive. Click here to see a list.
MODULE DIULRT (ident = '253'
%require ('DIUPATSWITCH')
) =
BEGIN
!++
! 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.
!
! FACILITY: PAT Parser
!
! ABSTRACT:
!
! PATLRTUNE.REQ defines the interface between the user of the
! PAT Parser and the language independent portion of the parser.
! PATLRTUNE.REQ and PATLRT.BLI are provided with the PAT parser
! package and provide an example of a particular implementation of
! the interface specification.
!
! PATLRTUNE.REQ is the specification for local error recovery
! tuning. It defines the local error recovery tables and
! permits some control of the order in which various corrections
! are attempted.
!
! Good results can be obtained with no modifications to this
! file.
!
! 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. Remove from LANGSPEC since
! changes often aren't needed for particular applications
! and since this interface is more likely to change in the
! future than the LANGSPEC interface.
!
! 002 - Remove VMS dependencies. C. Richardson 29-May-84
!
! 253 Rename file to DIULRT.
! Gregory A. Scott 1-Jul-86--
!
! INCLUDE FILES:
require 'DIUPATPROLOG';
library 'DIUPATLRTUNE';
library 'DIUPATDATA';
library 'BLI:XPORT';
! TABLE OF CONTENTS OF INTERNAL ROUTINES:
! NONE
! MACROS:
macro
SET_TERM (ROW) [TERM] =
[ROW, TERM] = TRUE %;
macro
FROM_TO (START, FINISH) [] =
START
%if START lss FINISH
%then
, FROM_TO (START + 1, FINISH)
%fi
%;
! Weak Recovery Priorities
! These are explained in PATLRTUNE.REQ.
global
PAT$LR_PRIORITIES_ARE_ADVISORY : initial (TRUE),
PAT$LR_SUB_PRIORITY : initial (1), ! Substitutions
PAT$LR_INSERT_PRIORITY : initial (2), ! Insertions
PAT$LR_SCOPE_PRIORITY : initial (3), ! Scope recovery
PAT$LR_DELETE_PRIORITY : initial (4); ! Deletion
! Tables for local error recovery:
! Identifier Merge Table:
! This table is used in the language independent portion of the parser.
! It lists pairs of identifiers which might be entered instead of a reserved
! word and the terminal symbol number corresponding to that reserved word.
! The error recovery routines may try to correct an error by merging these
! tokens. For example, for Ada the identifiers "GO" and "TO" could be merged
! into the terminal symbol "GOTO".
! The contents of this table are **LANGUAGE SPECIFIC**
own
id_column : $str_descriptor (string = 'COLUMN'),
id_complex : $str_descriptor (string = 'COMPLEX'),
id_d : $str_descriptor (string = 'D'),
id_d_floating : $str_descriptor (string = 'D_FLOATING'),
id_default : $str_descriptor (string = 'DEFAULT'),
id_edit : $str_descriptor (string = 'EDIT'),
id_f : $str_descriptor (string = 'F'),
id_f_floating : $str_descriptor (string = 'F_FLOATING'),
id_floating : $str_descriptor (string = 'FLOATING'),
id_floating_complex : $str_descriptor (string = 'FLOATING_COMPLEX'),
id_g : $str_descriptor (string = 'G'),
id_g_floating : $str_descriptor (string = 'G_FLOATING'),
id_h : $str_descriptor (string = 'H'),
id_h_floating : $str_descriptor (string = 'H_FLOATING'),
id_header : $str_descriptor (string = 'HEADER'),
id_initial : $str_descriptor (string = 'INITIAL'),
id_major : $str_descriptor (string = 'MAJOR'),
id_missing : $str_descriptor (string = 'MISSING'),
id_name : $str_descriptor (string = 'NAME'),
id_query : $str_descriptor (string = 'QUERY'),
id_row : $str_descriptor (string = 'ROW'),
id_string : $str_descriptor (string = 'STRING'),
id_value : $str_descriptor (string = 'VALUE');
global
PAT$LR_IDENTIFIER_MERGE_TABLE : blockvector [LR_NUM_IM, LR_IM_SIZE]
field (LR_IM_FIRST_ID, LR_IM_SECOND_ID, LR_IM_MERGED_TERM)
preset (
[0, LR_IM_FIRST_ID] = id_column,
[0, LR_IM_SECOND_ID] = id_major,
[0, LR_IM_MERGED_TERM] = T_COLUMN_MAJOR,
[1, LR_IM_FIRST_ID] = id_default,
[1, LR_IM_SECOND_ID] = id_value,
[1, LR_IM_MERGED_TERM] = T_DEFAULT_VALUE,
[2, LR_IM_FIRST_ID] = id_d,
[2, LR_IM_SECOND_ID] = id_floating,
[2, LR_IM_MERGED_TERM] = T_D_FLOATING,
[3, LR_IM_FIRST_ID] = id_d,
[3, LR_IM_SECOND_ID] = id_floating_complex,
[3, LR_IM_MERGED_TERM] = T_D_FLOATING_COMPLEX,
[4, LR_IM_FIRST_ID] = id_d_floating,
[4, LR_IM_SECOND_ID] = id_complex,
[4, LR_IM_MERGED_TERM] = T_D_FLOATING_COMPLEX,
[5, LR_IM_FIRST_ID] = id_edit,
[5, LR_IM_SECOND_ID] = id_string,
[5, LR_IM_MERGED_TERM] = T_EDIT_STRING,
[6, LR_IM_FIRST_ID] = id_floating,
[6, LR_IM_SECOND_ID] = id_complex,
[6, LR_IM_MERGED_TERM] = T_FLOATING_COMPLEX,
[7, LR_IM_FIRST_ID] = id_f,
[7, LR_IM_SECOND_ID] = id_floating,
[7, LR_IM_MERGED_TERM] = T_F_FLOATING,
[8, LR_IM_FIRST_ID] = id_f,
[8, LR_IM_SECOND_ID] = id_floating_complex,
[8, LR_IM_MERGED_TERM] = T_F_FLOATING_COMPLEX,
[9, LR_IM_FIRST_ID] = id_f_floating,
[9, LR_IM_SECOND_ID] = id_complex,
[9, LR_IM_MERGED_TERM] = T_F_FLOATING_COMPLEX,
[10, LR_IM_FIRST_ID] = id_g,
[10, LR_IM_SECOND_ID] = id_floating,
[10, LR_IM_MERGED_TERM] = T_G_FLOATING,
[11, LR_IM_FIRST_ID] = id_g,
[11, LR_IM_SECOND_ID] = id_floating_complex,
[11, LR_IM_MERGED_TERM] = T_G_FLOATING_COMPLEX,
[12, LR_IM_FIRST_ID] = id_g_floating,
[12, LR_IM_SECOND_ID] = id_complex,
[12, LR_IM_MERGED_TERM] = T_G_FLOATING_COMPLEX,
[13, LR_IM_FIRST_ID] = id_h,
[13, LR_IM_SECOND_ID] = id_floating,
[13, LR_IM_MERGED_TERM] = T_H_FLOATING,
[14, LR_IM_FIRST_ID] = id_h,
[14, LR_IM_SECOND_ID] = id_floating_complex,
[14, LR_IM_MERGED_TERM] = T_H_FLOATING_COMPLEX,
[15, LR_IM_FIRST_ID] = id_h_floating,
[15, LR_IM_SECOND_ID] = id_complex,
[15, LR_IM_MERGED_TERM] = T_H_FLOATING_COMPLEX,
[16, LR_IM_FIRST_ID] = id_initial,
[16, LR_IM_SECOND_ID] = id_value,
[16, LR_IM_MERGED_TERM] = T_INITIAL_VALUE,
[17, LR_IM_FIRST_ID] = id_missing,
[17, LR_IM_SECOND_ID] = id_value,
[17, LR_IM_MERGED_TERM] = T_MISSING_VALUE,
[18, LR_IM_FIRST_ID] = id_query,
[18, LR_IM_SECOND_ID] = id_header,
[18, LR_IM_MERGED_TERM] = T_QUERY_HEADER,
[19, LR_IM_FIRST_ID] = id_query,
[19, LR_IM_SECOND_ID] = id_name,
[19, LR_IM_MERGED_TERM] = T_QUERY_NAME,
[20, LR_IM_FIRST_ID] = id_row,
[20, LR_IM_SECOND_ID] = id_major,
[20, LR_IM_MERGED_TERM] = T_ROW_MAJOR);
! Symbol Merge Table:
! This table is used in the language independent portion of the parser.
! It lists pairs of terminals whose symbols might be entered instead of a
! multi-symbol terminal and the number of the corresponding terminal.
! The error recovery routines may try to correct an error by merging these
! tokens. For example, for Ada the terminals ":" and "=" could be merged
! into ":=".
! The contents of this table are **LANGUAGE SPECIFIC**
global
PAT$LR_SYMBOL_MERGE_TABLE : blockvector [LR_NUM_SM, LR_SM_SIZE]
field (LR_SM_FIRST_TERM, LR_SM_SECOND_TERM, LR_SM_MERGED_TERM, LR_SM_UNUSED)
;
! This table has no entries for this particular grammar.
!preset (
! [0, LR_SM_FIRST_TERM] = T_COLON,
! [0, LR_SM_SECOND_TERM] = T_EQUAL,
! [0, LR_SM_MERGED_TERM] = T_COLON_EQUAL,
! [1, LR_SM_FIRST_TERM] = T_LESS,
! [1, LR_SM_SECOND_TERM] = T_EQUAL,
! [1, LR_SM_MERGED_TERM] = T_LESS_EQUAL,
! [2, LR_SM_FIRST_TERM] = T_GREATER,
! [2, LR_SM_SECOND_TERM] = T_EQUAL,
! [2, LR_SM_MERGED_TERM] = T_GREATER_EQUAL,
! [3, LR_SM_FIRST_TERM] = T_EQUAL,
! [3, LR_SM_SECOND_TERM] = T_LESS,
! [3, LR_SM_MERGED_TERM] = T_LESS_EQUAL,
! [4, LR_SM_FIRST_TERM] = T_EQUAL,
! [4, LR_SM_SECOND_TERM] = T_GREATER,
! [4, LR_SM_MERGED_TERM] = T_EQUAL_GREATER,
! [5, LR_SM_FIRST_TERM] = T_LESS,
! [5, LR_SM_SECOND_TERM] = T_GREATER,
! [5, LR_SM_MERGED_TERM] = T_LESS_GREATER,
! [6, LR_SM_FIRST_TERM] = T_GREATER,
! [6, LR_SM_SECOND_TERM] = T_GREATER,
! [6, LR_SM_MERGED_TERM] = T_GREATER_GREAT,
! [7, LR_SM_FIRST_TERM] = T_LESS,
! [7, LR_SM_SECOND_TERM] = T_LESS,
! [7, LR_SM_MERGED_TERM] = T_LESS_LESS,
! [8, LR_SM_FIRST_TERM] = T_SLASH,
! [8, LR_SM_SECOND_TERM] = T_EQUAL,
! [8, LR_SM_MERGED_TERM] = T_SLASH_EQUAL,
! [9, LR_SM_FIRST_TERM] = T_STAR,
! [9, LR_SM_SECOND_TERM] = T_STAR,
! [9, LR_SM_MERGED_TERM] = T_STAR_STAR,
! [10, LR_SM_FIRST_TERM] = T_DOT,
! [10, LR_SM_SECOND_TERM] = T_DOT,
! [10, LR_SM_MERGED_TERM] = T_DOT_DOT);
! Never-Substitute-For Table:
! This table is used in the language independent portion of the parser.
! It contains a bit which is set for each terminal that should not
! be substituted for during local error recovery.
! The contents of this table are **LANGUAGE SPECIFIC**
global
PAT$LR_NEVER_SUBSTITUTE_FOR : bitvector [PAT$DATA_NUM_TERM]
preset (
[T_DOT] = TRUE,
[T_END] = TRUE,
[T_PATH_NAME] = TRUE,
[T_CDD_NAME] = TRUE,
[T_DESCR_TEXT] = TRUE,
[T_UNSIGNED_INTEGER] = TRUE,
[T_SIGNED_INTEGER] = TRUE,
[T_FIXED_POINT] = TRUE,
[T_FLOATING_POINT] = TRUE,
[T_QUOTED_STRING] = TRUE,
[T_HEX_NUMBER] = TRUE,
[T_OCTAL_NUMBER] = TRUE,
[T_EOF] = TRUE);
! Preferred-Insertions Table:
! This table is used in the language independent portion of the parser.
! It contains a bit which is set for each terminal that the
! local error recovery routines should preference when there
! exist more than one possible insertion or replacement.
! The contents of this table are **LANGUAGE SPECIFIC**
global
PAT$LR_PREFERRED_INSERTIONS : bitvector [PAT$DATA_NUM_TERM]
preset (
[T_DOT] = TRUE,
[T_END] = TRUE);
! Never-Insert-Before Table:
! This table is used in the language independent portion
! of the parser for local error recovery.
! It indicates the terminal numbers of tokens which should not be inserted
! immediately prior to a specific pair of tokens. This can be used to
! prevent corrections which may parse but are generally not the desired
! correction. For example, for Ada DECLARE should not be inserted
! immediately prior to PRAGMA IDENTIFIER.
! The contents of this table are **LANGUAGE SPECIFIC**
global
PAT$LR_NEVER_INSERT_BEFORE : blockvector [LR_NUM_NIB, LR_NIB_SIZE]
field (LR_NIB_INSERTION, LR_NIB_CURTOK, LR_NIB_NEXTTOK, LR_NIB_UNUSED)
preset (
[0, LR_NIB_INSERTION] = T_END,
[0, LR_NIB_CURTOK] = T_DEFINE,
[0, LR_NIB_NEXTTOK] = T_RECORD);
! Tables for scope recovery:
! Closer-Tokens Table:
! This table is used in the language independent portion of the parser
! for scope recovery.
!
! It indicates contents of each scope closer by listing the
! number of tokens in the closer and the actual tokens.
! For example, for Ada the closer "END;" has 2 for the number of tokens
! and END and SEMICOLON for the tokens.
!
! If one closer fully contains another and they both have the same
! beginning (e.g. "end if" and "end if;") then the LONGER closer
! must appear in the table FIRST or the scope recovery routine may
! incorrectly insert the shorter one in its place.
!
! Table indices are literals declared in the enumeration LR_CLOSER
! in PATLRTUNE.REQ.
!
! The contents of this table are **LANGUAGE SPECIFIC**
global
PAT$LR_CLOSER_TOKENS : LR_MATRIX [LR_NUM_CLOSERS, (LR_MAX_TOKENS_IN_CLOSER + 1)]
preset (
[LR_ERD, LR_NUM_TOKS_INDEX] = 3, ! "END RECORD."
[LR_ERD, 1] = T_END,
[LR_ERD, 2] = T_RECORD,
[LR_ERD, 3] = T_DOT,
[LR_ESD, LR_NUM_TOKS_INDEX] = 3, ! "END STRUCTURE."
[LR_ESD, 1] = T_END,
[LR_ESD, 2] = T_STRUCTURE,
[LR_ESD, 3] = T_DOT,
[LR_ETD, LR_NUM_TOKS_INDEX] = 3, ! "END TRANSFORM."
[LR_ETD, 1] = T_END,
[LR_ETD, 2] = T_TRANSFORM,
[LR_ETD, 3] = T_DOT,
[LR_EVSD, LR_NUM_TOKS_INDEX] = 3, ! "END VARIANTS."
[LR_EVSD, 1] = T_END,
[LR_EVSD, 2] = T_VARIANTS,
[LR_EVSD, 3] = T_DOT,
[LR_EVD, LR_NUM_TOKS_INDEX] = 3, ! "END VARIANT."
[LR_EVD, 1] = T_END,
[LR_EVD, 2] = T_VARIANT,
[LR_EVD, 3] = T_DOT);
! Only-Close-Before Table:
! This table is used in the language independent portion of the parser
! for scope recovery.
! Its rows correspond to literals declared in the enumeration LR_CLOSER
! in PATLRTUNE.REQ.
! It indicates where each scope closer may be inserted with a bit
! set corresponding to the terminals that it may be inserted before.
! This is necessary because insertions performed by scope recovery are
! not checked with a parse beyond the inserted closers, allowing for
! several scopes to be closed. The table is derived from the grammar
! by listing the terminals which are in the "follow set" of the closer
! to be inserted or of closers in that set.
! All such terminals may be listed, but care should be taken when including
! those that are likely to occur within the scope being closed.
! The first terminal in the token itself need not be listed because
! if it was in the input an error would not have occurred.
!
! For example, for Ada the closer "END;" can be followed by the terminals
! FUNCTION, GENERIC, PACKAGE, PROCEDURE, SEPARATE, TASK, WITH or the
! end of file token.
! The contents of this table are **LANGUAGE SPECIFIC**
global
PAT$LR_ONLY_CLOSE_BEFORE : LR_BITMATRIX [LR_NUM_CLOSERS, PAT$DATA_NUM_TERM]
preset (
SET_TERM (LR_ERD, T_DEFINE, T_EOF), ! "END RECORD."
SET_TERM (LR_ESD, T_DEFINE, T_EOF), ! "END STRUCTURE."
SET_TERM (LR_ETD, T_DEFINE, T_EOF), ! "END TRANSFORM."
SET_TERM (LR_EVSD, T_DEFINE, T_EOF), ! "END VARIANTS."
SET_TERM (LR_EVD, T_DEFINE, T_EOF)); ! "END VARIANT."
! Closer-Match Table:
! This table is used in the language independent portion of the parser
! for scope recovery.
! Its indices are literals declared in the enumeration LR_CLOSER
! in PATLRTUNE.REQ.
! For each closer it contains either the terminal or nonterminal symbol
! on the stack which opens the corresponding scope or the literal
! LR_NOT_MATCHED if the error message will not indicate the matching
! scope opener.
! For example, for Ada the closer "END;" closes a scope opened by the
! terminal BEGIN (which appears on the stack until the scope is closed).
! The contents of this table are **LANGUAGE SPECIFIC**
global
PAT$LR_CLOSER_MATCH : blockvector [LR_NUM_CLOSERS, LR_CLOSERS_SIZE]
field (LR_CLOSERS_STACK, LR_CLOSERS_TERMINAL)
preset (
! "End record.":
[LR_ERD, LR_CLOSERS_STACK] = NT_DEFINE_STATEMENT,
[LR_ERD, LR_CLOSERS_TERMINAL] = T_DEFINE,
! "End structure.":
[LR_ESD, LR_CLOSERS_STACK] = NT_STRUCTURE_BEGIN,
[LR_ESD, LR_CLOSERS_TERMINAL] = T_STRUCTURE,
! "End transform.":
[LR_ETD, LR_CLOSERS_STACK] = T_DEFINE,
[LR_ETD, LR_CLOSERS_TERMINAL] = T_DEFINE,
! "End variants.":
[LR_EVSD, LR_CLOSERS_STACK] = NT_VARIANTS_HEAD,
[LR_EVSD, LR_CLOSERS_TERMINAL] = T_VARIANTS,
! "End variant.":
[LR_EVD, LR_CLOSERS_STACK] = NT_VARIANT_HEAD,
[LR_EVD, LR_CLOSERS_TERMINAL] = T_VARIANT);
! Closer-Message Table:
! This table is used in the language independent portion of the parser
! for scope recovery.
! Its indices are literals declared in the enumeration LR_CLOSER
! in PATLRTUNE.REQ.
! For each closer it contains a pointer to a string descriptor
! which contains text for the closer.
! For example, for Ada there is the text "end;" for the closer "END;".
! The contents of this table are **LANGUAGE SPECIFIC**
own
msg_end_dot : $str_descriptor (string = '"END."');
global
PAT$LR_CLOSER_MESSAGE : vector [LR_NUM_CLOSERS]
preset (
[LR_ERD] = msg_end_dot, ! "END RECORD."
[LR_ESD] = msg_end_dot, ! "END STRUCTURE."
[LR_ETD] = msg_end_dot, ! "END TRANSFORM."
[LR_EVSD] = msg_end_dot, ! "END VARIANTS."
[LR_EVD] = msg_end_dot ); ! "END VARIANT."
! Point-at-Previous-Token Table:
! This table is used in the language independent portion of the parser
! for scope recovery.
! Its indices are literals declared in the enumeration LR_CLOSER
! in PATLRTUNE.REQ.
! Each entry is TRUE iff the error message should indicate the
! token before the one where the error was encountered.
! For example, for Ada when "if; end;" is inserted after "end" the
! error message should indicate that "end if;" appeared before the "end".
! The contents of this table are **LANGUAGE SPECIFIC**
global
!! PAT$LR_POINT_AT_PREV_TOKEN : bitvector [LR_NUM_CLOSERS] preset ( ! SHOULD BE THIS
!! MOD DUE TO BLISS BUG
PAT$LR_POINT_AT_PREV_TOKEN : bitvector [32]
;
!preset (
! [LR_SE] = TRUE, ! "; END"
! [LR_CSE] = TRUE, ! "CASE; END"
! [LR_ISE] = TRUE, ! "IF; END"
! [LR_LSE] = TRUE, ! "LOOP END"
! [LR_RSE] = TRUE, ! "RECORD; END"
! [LR_SSE] = TRUE); ! "SELECT; END"
end ! End of module
eludom