src/HOL/TPTP/TPTP_Parser/ml_yacc_lib.ML
author wenzelm
Thu, 31 Dec 2015 20:57:00 +0100
changeset 62015 db9c2af6ce72
parent 56281 03c3d1a7c3b8
permissions -rw-r--r--
expand hard tabs;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     1
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     2
(******************************************************************)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     3
(* GENERATED FILE -- DO NOT EDIT -- GENERATED FILE -- DO NOT EDIT *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     4
(* GENERATED FILE -- DO NOT EDIT -- GENERATED FILE -- DO NOT EDIT *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     5
(* GENERATED FILE -- DO NOT EDIT -- GENERATED FILE -- DO NOT EDIT *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     6
(******************************************************************)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     7
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     8
(*
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     9
  This file is generated from the contents of ML-Yacc's lib directory.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    10
  ML-Yacc's COPYRIGHT-file contents follow:
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    11
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    12
  ML-YACC COPYRIGHT NOTICE, LICENSE AND DISCLAIMER.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    13
  
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    14
  Copyright 1989, 1990 by David R. Tarditi Jr. and Andrew W. Appel
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    15
  
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    16
  Permission to use, copy, modify, and distribute this software and its
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    17
  documentation for any purpose and without fee is hereby granted,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    18
  provided that the above copyright notice appear in all copies and that
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    19
  both the copyright notice and this permission notice and warranty
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    20
  disclaimer appear in supporting documentation, and that the names of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    21
  David R. Tarditi Jr. and Andrew W. Appel not be used in advertising
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    22
  or publicity pertaining to distribution of the software without
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    23
  specific, written prior permission.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    24
  
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    25
  David R. Tarditi Jr. and Andrew W. Appel disclaim all warranties with regard to
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    26
  this software, including all implied warranties of merchantability and fitness.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    27
  In no event shall David R. Tarditi Jr. and Andrew W. Appel be liable for any
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    28
  special, indirect or consequential damages or any damages whatsoever resulting
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    29
  from loss of use, data or profits, whether in an action of contract, negligence
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    30
  or other tortious action, arising out of or in connection with the use or
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    31
  performance of this software.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    32
*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    33
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    34
(**** Original file: base.sig ****)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    35
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    36
(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    37
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    38
(* base.sig: Base signature file for SML-Yacc.  This file contains signatures
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    39
   that must be loaded before any of the files produced by ML-Yacc are loaded
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    40
*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    41
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    42
(* STREAM: signature for a lazy stream.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    43
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    44
signature STREAM =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    45
 sig type 'xa stream
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    46
     val streamify : (unit -> '_a) -> '_a stream
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    47
     val cons : '_a * '_a stream -> '_a stream
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    48
     val get : '_a stream -> '_a * '_a stream
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    49
 end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    50
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    51
(* LR_TABLE: signature for an LR Table.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    52
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    53
   The list of actions and gotos passed to mkLrTable must be ordered by state
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    54
   number. The values for state 0 are the first in the list, the values for
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    55
    state 1 are next, etc.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    56
*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    57
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    58
signature LR_TABLE =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    59
    sig
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    60
        datatype ('a,'b) pairlist = EMPTY | PAIR of 'a * 'b * ('a,'b) pairlist
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    61
        datatype state = STATE of int
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    62
        datatype term = T of int
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    63
        datatype nonterm = NT of int
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    64
        datatype action = SHIFT of state
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    65
                        | REDUCE of int
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    66
                        | ACCEPT
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    67
                        | ERROR
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    68
        type table
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    69
        
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    70
        val numStates : table -> int
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    71
        val numRules : table -> int
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    72
        val describeActions : table -> state ->
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    73
                                (term,action) pairlist * action
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    74
        val describeGoto : table -> state -> (nonterm,state) pairlist
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    75
        val action : table -> state * term -> action
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    76
        val goto : table -> state * nonterm -> state
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    77
        val initialState : table -> state
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    78
        exception Goto of state * nonterm
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    79
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    80
        val mkLrTable : {actions : ((term,action) pairlist * action) array,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    81
                         gotos : (nonterm,state) pairlist array,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    82
                         numStates : int, numRules : int,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
    83
                         initialState : state} -> table
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    84
    end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    85
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    86
(* TOKEN: signature revealing the internal structure of a token. This signature
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    87
   TOKEN distinct from the signature {parser name}_TOKENS produced by ML-Yacc.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    88
   The {parser name}_TOKENS structures contain some types and functions to
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    89
    construct tokens from values and positions.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    90
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    91
   The representation of token was very carefully chosen here to allow the
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    92
   polymorphic parser to work without knowing the types of semantic values
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    93
   or line numbers.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    94
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    95
   This has had an impact on the TOKENS structure produced by SML-Yacc, which
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    96
   is a structure parameter to lexer functors.  We would like to have some
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    97
   type 'a token which functions to construct tokens would create.  A
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    98
   constructor function for a integer token might be
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    99
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   100
          INT: int * 'a * 'a -> 'a token.
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   101
 
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   102
   This is not possible because we need to have tokens with the representation
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   103
   given below for the polymorphic parser.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   104
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   105
   Thus our constructur functions for tokens have the form:
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   106
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   107
          INT: int * 'a * 'a -> (svalue,'a) token
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   108
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   109
   This in turn has had an impact on the signature that lexers for SML-Yacc
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   110
   must match and the types that a user must declare in the user declarations
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   111
   section of lexers.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   112
*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   113
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   114
signature TOKEN =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   115
    sig
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   116
        structure LrTable : LR_TABLE
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   117
        datatype ('a,'b) token = TOKEN of LrTable.term * ('a * 'b * 'b)
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   118
        val sameToken : ('a,'b) token * ('a,'b) token -> bool
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   119
    end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   120
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   121
(* LR_PARSER: signature for a polymorphic LR parser *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   122
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   123
signature LR_PARSER =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   124
    sig
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   125
        structure Stream: STREAM
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   126
        structure LrTable : LR_TABLE
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   127
        structure Token : TOKEN
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   128
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   129
        sharing LrTable = Token.LrTable
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   130
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   131
        exception ParseError
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   132
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   133
        val parse : {table : LrTable.table,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   134
                     lexer : ('_b,'_c) Token.token Stream.stream,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   135
                     arg: 'arg,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   136
                     saction : int *
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   137
                               '_c *
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   138
                                (LrTable.state * ('_b * '_c * '_c)) list * 
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   139
                                'arg ->
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   140
                                     LrTable.nonterm *
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   141
                                     ('_b * '_c * '_c) *
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   142
                                     ((LrTable.state *('_b * '_c * '_c)) list),
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   143
                     void : '_b,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   144
                     ec : { is_keyword : LrTable.term -> bool,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   145
                            noShift : LrTable.term -> bool,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   146
                            preferred_change : (LrTable.term list * LrTable.term list) list,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   147
                            errtermvalue : LrTable.term -> '_b,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   148
                            showTerminal : LrTable.term -> string,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   149
                            terms: LrTable.term list,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   150
                            error : string * '_c * '_c -> unit
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   151
                           },
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   152
                     lookahead : int  (* max amount of lookahead used in *)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   153
                                      (* error correction *)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   154
                        } -> '_b *
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   155
                             (('_b,'_c) Token.token Stream.stream)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   156
    end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   157
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   158
(* LEXER: a signature that most lexers produced for use with SML-Yacc's
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   159
   output will match.  The user is responsible for declaring type token,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   160
   type pos, and type svalue in the UserDeclarations section of a lexer.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   161
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   162
   Note that type token is abstract in the lexer.  This allows SML-Yacc to
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   163
   create a TOKENS signature for use with lexers produced by ML-Lex that
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   164
   treats the type token abstractly.  Lexers that are functors parametrized by
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   165
   a Tokens structure matching a TOKENS signature cannot examine the structure
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   166
   of tokens.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   167
*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   168
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   169
signature LEXER =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   170
   sig
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   171
       structure UserDeclarations :
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   172
           sig
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   173
                type ('a,'b) token
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   174
                type pos
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   175
                type svalue
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   176
           end
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   177
        val makeLexer : (int -> string) -> unit -> 
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   178
         (UserDeclarations.svalue,UserDeclarations.pos) UserDeclarations.token
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   179
   end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   180
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   181
(* ARG_LEXER: the %arg option of ML-Lex allows users to produce lexers which
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   182
   also take an argument before yielding a function from unit to a token
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   183
*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   184
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   185
signature ARG_LEXER =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   186
   sig
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   187
       structure UserDeclarations :
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   188
           sig
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   189
                type ('a,'b) token
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   190
                type pos
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   191
                type svalue
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   192
                type arg
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   193
           end
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   194
        val makeLexer : (int -> string) -> UserDeclarations.arg -> unit -> 
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   195
         (UserDeclarations.svalue,UserDeclarations.pos) UserDeclarations.token
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   196
   end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   197
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   198
(* PARSER_DATA: the signature of ParserData structures in {parser name}LrValsFun
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   199
   produced by  SML-Yacc.  All such structures match this signature.  
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   200
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   201
   The {parser name}LrValsFun produces a structure which contains all the values
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   202
   except for the lexer needed to call the polymorphic parser mentioned
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   203
   before.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   204
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   205
*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   206
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   207
signature PARSER_DATA =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   208
   sig
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   209
        (* the type of line numbers *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   210
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   211
        type pos
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   212
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   213
        (* the type of semantic values *)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   214
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   215
        type svalue
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   216
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   217
         (* the type of the user-supplied argument to the parser *)
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   218
        type arg
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   219
 
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   220
        (* the intended type of the result of the parser.  This value is
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   221
           produced by applying extract from the structure Actions to the
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   222
           final semantic value resultiing from a parse.
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   223
         *)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   224
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   225
        type result
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   226
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   227
        structure LrTable : LR_TABLE
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   228
        structure Token : TOKEN
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   229
        sharing Token.LrTable = LrTable
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   230
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   231
        (* structure Actions contains the functions which mantain the
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   232
           semantic values stack in the parser.  Void is used to provide
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   233
           a default value for the semantic stack.
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   234
         *)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   235
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   236
        structure Actions : 
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   237
          sig
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   238
              val actions : int * pos *
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   239
                   (LrTable.state * (svalue * pos * pos)) list * arg->
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   240
                         LrTable.nonterm * (svalue * pos * pos) *
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   241
                         ((LrTable.state *(svalue * pos * pos)) list)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   242
              val void : svalue
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   243
              val extract : svalue -> result
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   244
          end
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   245
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   246
        (* structure EC contains information used to improve error
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   247
           recovery in an error-correcting parser *)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   248
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   249
        structure EC :
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   250
           sig
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   251
             val is_keyword : LrTable.term -> bool
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   252
             val noShift : LrTable.term -> bool
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   253
             val preferred_change : (LrTable.term list * LrTable.term list) list
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   254
             val errtermvalue : LrTable.term -> svalue
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   255
             val showTerminal : LrTable.term -> string
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   256
             val terms: LrTable.term list
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   257
           end
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   258
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   259
        (* table is the LR table for the parser *)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   260
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   261
        val table : LrTable.table
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   262
    end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   263
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   264
(* signature PARSER is the signature that most user parsers created by 
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   265
   SML-Yacc will match.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   266
*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   267
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   268
signature PARSER =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   269
    sig
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   270
        structure Token : TOKEN
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   271
        structure Stream : STREAM
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   272
        exception ParseError
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   273
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   274
        (* type pos is the type of line numbers *)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   275
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   276
        type pos
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   277
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   278
        (* type result is the type of the result from the parser *)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   279
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   280
        type result
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   281
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   282
         (* the type of the user-supplied argument to the parser *)
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   283
        type arg
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   284
        
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   285
        (* type svalue is the type of semantic values for the semantic value
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   286
           stack
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   287
         *)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   288
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   289
        type svalue
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   290
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   291
        (* val makeLexer is used to create a stream of tokens for the parser *)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   292
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   293
        val makeLexer : (int -> string) ->
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   294
                         (svalue,pos) Token.token Stream.stream
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   295
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   296
        (* val parse takes a stream of tokens and a function to TextIO.print
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   297
           errors and returns a value of type result and a stream containing
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   298
           the unused tokens
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   299
         *)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   300
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   301
        val parse : int * ((svalue,pos) Token.token Stream.stream) *
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   302
                    (string * pos * pos -> unit) * arg ->
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   303
                                result * (svalue,pos) Token.token Stream.stream
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   304
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   305
        val sameToken : (svalue,pos) Token.token * (svalue,pos) Token.token ->
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   306
                                bool
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   307
     end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   308
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   309
(* signature ARG_PARSER is the signature that will be matched by parsers whose
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   310
    lexer takes an additional argument.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   311
*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   312
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   313
signature ARG_PARSER = 
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   314
    sig
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   315
        structure Token : TOKEN
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   316
        structure Stream : STREAM
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   317
        exception ParseError
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   318
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   319
        type arg
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   320
        type lexarg
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   321
        type pos
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   322
        type result
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   323
        type svalue
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   324
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   325
        val makeLexer : (int -> string) -> lexarg ->
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   326
                         (svalue,pos) Token.token Stream.stream
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   327
        val parse : int * ((svalue,pos) Token.token Stream.stream) *
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   328
                    (string * pos * pos -> unit) * arg ->
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   329
                                result * (svalue,pos) Token.token Stream.stream
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   330
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   331
        val sameToken : (svalue,pos) Token.token * (svalue,pos) Token.token ->
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   332
                                bool
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   333
     end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   334
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   335
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   336
(**** Original file: join.sml ****)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   337
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   338
(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   339
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   340
(* functor Join creates a user parser by putting together a Lexer structure,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   341
   an LrValues structure, and a polymorphic parser structure.  Note that
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   342
   the Lexer and LrValues structure must share the type pos (i.e. the type
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   343
   of line numbers), the type svalues for semantic values, and the type
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   344
   of tokens.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   345
*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   346
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   347
functor Join(structure Lex : LEXER
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   348
             structure ParserData: PARSER_DATA
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   349
             structure LrParser : LR_PARSER
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   350
             sharing ParserData.LrTable = LrParser.LrTable
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   351
             sharing ParserData.Token = LrParser.Token
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   352
             sharing type Lex.UserDeclarations.svalue = ParserData.svalue
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   353
             sharing type Lex.UserDeclarations.pos = ParserData.pos
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   354
             sharing type Lex.UserDeclarations.token = ParserData.Token.token)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   355
                 : PARSER =
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   356
struct
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   357
    structure Token = ParserData.Token
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   358
    structure Stream = LrParser.Stream
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   359
 
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   360
    exception ParseError = LrParser.ParseError
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   361
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   362
    type arg = ParserData.arg
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   363
    type pos = ParserData.pos
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   364
    type result = ParserData.result
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   365
    type svalue = ParserData.svalue
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   366
    val makeLexer = LrParser.Stream.streamify o Lex.makeLexer
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   367
    val parse = fn (lookahead,lexer,error,arg) =>
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   368
        (fn (a,b) => (ParserData.Actions.extract a,b))
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   369
     (LrParser.parse {table = ParserData.table,
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   370
                lexer=lexer,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   371
                lookahead=lookahead,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   372
                saction = ParserData.Actions.actions,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   373
                arg=arg,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   374
                void= ParserData.Actions.void,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   375
                ec = {is_keyword = ParserData.EC.is_keyword,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   376
                      noShift = ParserData.EC.noShift,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   377
                      preferred_change = ParserData.EC.preferred_change,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   378
                      errtermvalue = ParserData.EC.errtermvalue,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   379
                      error=error,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   380
                      showTerminal = ParserData.EC.showTerminal,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   381
                      terms = ParserData.EC.terms}}
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   382
      )
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   383
     val sameToken = Token.sameToken
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   384
end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   385
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   386
(* functor JoinWithArg creates a variant of the parser structure produced 
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   387
   above.  In this case, the makeLexer take an additional argument before
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   388
   yielding a value of type unit -> (svalue,pos) token
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   389
 *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   390
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   391
functor JoinWithArg(structure Lex : ARG_LEXER
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   392
             structure ParserData: PARSER_DATA
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   393
             structure LrParser : LR_PARSER
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   394
             sharing ParserData.LrTable = LrParser.LrTable
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   395
             sharing ParserData.Token = LrParser.Token
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   396
             sharing type Lex.UserDeclarations.svalue = ParserData.svalue
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   397
             sharing type Lex.UserDeclarations.pos = ParserData.pos
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   398
             sharing type Lex.UserDeclarations.token = ParserData.Token.token)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   399
                 : ARG_PARSER  =
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   400
struct
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   401
    structure Token = ParserData.Token
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   402
    structure Stream = LrParser.Stream
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   403
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   404
    exception ParseError = LrParser.ParseError
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   405
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   406
    type arg = ParserData.arg
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   407
    type lexarg = Lex.UserDeclarations.arg
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   408
    type pos = ParserData.pos
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   409
    type result = ParserData.result
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   410
    type svalue = ParserData.svalue
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   411
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   412
    val makeLexer = fn s => fn arg =>
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   413
                 LrParser.Stream.streamify (Lex.makeLexer s arg)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   414
    val parse = fn (lookahead,lexer,error,arg) =>
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   415
        (fn (a,b) => (ParserData.Actions.extract a,b))
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   416
     (LrParser.parse {table = ParserData.table,
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   417
                lexer=lexer,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   418
                lookahead=lookahead,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   419
                saction = ParserData.Actions.actions,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   420
                arg=arg,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   421
                void= ParserData.Actions.void,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   422
                ec = {is_keyword = ParserData.EC.is_keyword,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   423
                      noShift = ParserData.EC.noShift,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   424
                      preferred_change = ParserData.EC.preferred_change,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   425
                      errtermvalue = ParserData.EC.errtermvalue,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   426
                      error=error,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   427
                      showTerminal = ParserData.EC.showTerminal,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   428
                      terms = ParserData.EC.terms}}
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   429
      )
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   430
    val sameToken = Token.sameToken
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   431
end;
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   432
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   433
(**** Original file: lrtable.sml ****)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   434
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   435
(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   436
structure LrTable : LR_TABLE = 
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   437
    struct
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   438
        open Array List
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   439
        infix 9 sub
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   440
        datatype ('a,'b) pairlist = EMPTY
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   441
                                  | PAIR of 'a * 'b * ('a,'b) pairlist
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   442
        datatype term = T of int
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   443
        datatype nonterm = NT of int
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   444
        datatype state = STATE of int
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   445
        datatype action = SHIFT of state
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   446
                        | REDUCE of int (* rulenum from grammar *)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   447
                        | ACCEPT
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   448
                        | ERROR
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   449
        exception Goto of state * nonterm
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   450
        type table = {states: int, rules : int,initialState: state,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   451
                      action: ((term,action) pairlist * action) array,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   452
                      goto :  (nonterm,state) pairlist array}
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   453
        val numStates = fn ({states,...} : table) => states
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   454
        val numRules = fn ({rules,...} : table) => rules
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   455
        val describeActions =
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   456
           fn ({action,...} : table) => 
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   457
                   fn (STATE s) => action sub s
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   458
        val describeGoto =
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   459
           fn ({goto,...} : table) =>
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   460
                   fn (STATE s) => goto sub s
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   461
        fun findTerm (T term,row,default) =
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   462
            let fun find (PAIR (T key,data,r)) =
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   463
                       if key < term then find r
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   464
                       else if key=term then data
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   465
                       else default
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   466
                   | find EMPTY = default
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   467
            in find row
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   468
            end
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   469
        fun findNonterm (NT nt,row) =
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   470
            let fun find (PAIR (NT key,data,r)) =
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   471
                       if key < nt then find r
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   472
                       else if key=nt then SOME data
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   473
                       else NONE
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   474
                   | find EMPTY = NONE
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   475
            in find row
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   476
            end
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   477
        val action = fn ({action,...} : table) =>
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   478
                fn (STATE state,term) =>
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   479
                  let val (row,default) = action sub state
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   480
                  in findTerm(term,row,default)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   481
                  end
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   482
        val goto = fn ({goto,...} : table) =>
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   483
                        fn (a as (STATE state,nonterm)) =>
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   484
                          case findNonterm(nonterm,goto sub state)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   485
                          of SOME state => state
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   486
                           | NONE => raise (Goto a)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   487
        val initialState = fn ({initialState,...} : table) => initialState
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   488
        val mkLrTable = fn {actions,gotos,initialState,numStates,numRules} =>
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   489
             ({action=actions,goto=gotos,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   490
               states=numStates,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   491
               rules=numRules,
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   492
               initialState=initialState} : table)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   493
end;
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   494
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   495
(**** Original file: stream.sml ****)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   496
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   497
(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   498
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   499
(* Stream: a structure implementing a lazy stream.  The signature STREAM
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   500
   is found in base.sig *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   501
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   502
structure Stream :> STREAM =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   503
struct
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   504
   datatype 'a str = EVAL of 'a * 'a str Unsynchronized.ref | UNEVAL of (unit->'a)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   505
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   506
   type 'a stream = 'a str Unsynchronized.ref
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   507
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   508
   fun get(Unsynchronized.ref(EVAL t)) = t
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   509
     | get(s as Unsynchronized.ref(UNEVAL f)) = 
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   510
            let val t = (f(), Unsynchronized.ref(UNEVAL f)) in s := EVAL t; t end
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   511
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   512
   fun streamify f = Unsynchronized.ref(UNEVAL f)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   513
   fun cons(a,s) = Unsynchronized.ref(EVAL(a,s))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   514
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   515
end;
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   516
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   517
(**** Original file: parser2.sml ****)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   518
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   519
(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   520
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   521
(* parser.sml:  This is a parser driver for LR tables with an error-recovery
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   522
   routine added to it.  The routine used is described in detail in this
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   523
   article:
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   524
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   525
        'A Practical Method for LR and LL Syntactic Error Diagnosis and
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   526
         Recovery', by M. Burke and G. Fisher, ACM Transactions on
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   527
         Programming Langauges and Systems, Vol. 9, No. 2, April 1987,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   528
         pp. 164-197.
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   529
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   530
    This program is an implementation is the partial, deferred method discussed
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   531
    in the article.  The algorithm and data structures used in the program
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   532
    are described below.  
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   533
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   534
    This program assumes that all semantic actions are delayed.  A semantic
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   535
    action should produce a function from unit -> value instead of producing the
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   536
    normal value.  The parser returns the semantic value on the top of the
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   537
    stack when accept is encountered.  The user can deconstruct this value
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   538
    and apply the unit -> value function in it to get the answer.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   539
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   540
    It also assumes that the lexer is a lazy stream.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   541
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   542
    Data Structures:
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   543
    ----------------
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   544
        
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   545
        * The parser:
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   546
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   547
           The state stack has the type
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   548
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   549
                 (state * (semantic value * line # * line #)) list
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   550
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   551
           The parser keeps a queue of (state stack * lexer pair).  A lexer pair
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   552
         consists of a terminal * value pair and a lexer.  This allows the 
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   553
         parser to reconstruct the states for terminals to the left of a
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   554
         syntax error, and attempt to make error corrections there.
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   555
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   556
           The queue consists of a pair of lists (x,y).  New additions to
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   557
         the queue are cons'ed onto y.  The first element of x is the top
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   558
         of the queue.  If x is nil, then y is reversed and used
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   559
         in place of x.
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   560
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   561
    Algorithm:
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   562
    ----------
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   563
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   564
        * The steady-state parser:  
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   565
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   566
            This parser keeps the length of the queue of state stacks at
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   567
        a steady state by always removing an element from the front when
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   568
        another element is placed on the end.
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   569
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   570
            It has these arguments:
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   571
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   572
           stack: current stack
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   573
           queue: value of the queue
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   574
           lexPair ((terminal,value),lex stream)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   575
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   576
        When SHIFT is encountered, the state to shift to and the value are
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   577
        are pushed onto the state stack.  The state stack and lexPair are
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   578
        placed on the queue.  The front element of the queue is removed.
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   579
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   580
        When REDUCTION is encountered, the rule is applied to the current
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   581
        stack to yield a triple (nonterm,value,new stack).  A new
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   582
        stack is formed by adding (goto(top state of stack,nonterm),value)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   583
        to the stack.
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   584
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   585
        When ACCEPT is encountered, the top value from the stack and the
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   586
        lexer are returned.
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   587
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   588
        When an ERROR is encountered, fixError is called.  FixError
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   589
        takes the arguments to the parser, fixes the error if possible and
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   590
        returns a new set of arguments.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   591
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   592
        * The distance-parser:
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   593
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   594
        This parser includes an additional argument distance.  It pushes
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   595
        elements on the queue until it has parsed distance tokens, or an
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   596
        ACCEPT or ERROR occurs.  It returns a stack, lexer, the number of
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   597
        tokens left unparsed, a queue, and an action option.
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   598
*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   599
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   600
signature FIFO = 
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   601
  sig type 'a queue
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   602
      val empty : 'a queue
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   603
      exception Empty
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   604
      val get : 'a queue -> 'a * 'a queue
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   605
      val put : 'a * 'a queue -> 'a queue
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   606
  end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   607
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   608
(* drt (12/15/89) -- the functor should be used in development work, but
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   609
   it wastes space in the release version.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   610
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   611
functor ParserGen(structure LrTable : LR_TABLE
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   612
                  structure Stream : STREAM) : LR_PARSER =
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   613
*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   614
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   615
structure LrParser :> LR_PARSER =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   616
   struct
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   617
      structure LrTable = LrTable
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   618
      structure Stream = Stream
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   619
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   620
      fun eqT (LrTable.T i, LrTable.T i') = i = i'
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   621
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   622
      structure Token : TOKEN =
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   623
        struct
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   624
            structure LrTable = LrTable
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   625
            datatype ('a,'b) token = TOKEN of LrTable.term * ('a * 'b * 'b)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   626
            val sameToken = fn (TOKEN(t,_),TOKEN(t',_)) => eqT (t,t')
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   627
        end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   628
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   629
      open LrTable
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   630
      open Token
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   631
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   632
      val DEBUG1 = false
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   633
      val DEBUG2 = false
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   634
      exception ParseError
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   635
      exception ParseImpossible of int
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   636
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   637
      structure Fifo :> FIFO =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   638
        struct
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   639
          type 'a queue = ('a list * 'a list)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   640
          val empty = (nil,nil)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   641
          exception Empty
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   642
          fun get(a::x, y) = (a, (x,y))
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   643
            | get(nil, nil) = raise Empty
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   644
            | get(nil, y) = get(rev y, nil)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   645
          fun put(a,(x,y)) = (x,a::y)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   646
        end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   647
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   648
      type ('a,'b) elem = (state * ('a * 'b * 'b))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   649
      type ('a,'b) stack = ('a,'b) elem list
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   650
      type ('a,'b) lexv = ('a,'b) token
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   651
      type ('a,'b) lexpair = ('a,'b) lexv * (('a,'b) lexv Stream.stream)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   652
      type ('a,'b) distanceParse =
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   653
                 ('a,'b) lexpair *
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   654
                 ('a,'b) stack * 
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   655
                 (('a,'b) stack * ('a,'b) lexpair) Fifo.queue *
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   656
                 int ->
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   657
                   ('a,'b) lexpair *
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   658
                   ('a,'b) stack * 
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   659
                   (('a,'b) stack * ('a,'b) lexpair) Fifo.queue *
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   660
                   int *
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   661
                   action option
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   662
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   663
      type ('a,'b) ecRecord =
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   664
         {is_keyword : term -> bool,
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   665
          preferred_change : (term list * term list) list,
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   666
          error : string * 'b * 'b -> unit,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   667
          errtermvalue : term -> 'a,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   668
          terms : term list,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   669
          showTerminal : term -> string,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   670
          noShift : term -> bool}
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   671
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   672
      local 
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   673
         
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   674
         val println = fn s => (TextIO.print s; TextIO.print "\n")
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   675
         val showState = fn (STATE s) => "STATE " ^ (Int.toString s)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   676
      in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   677
        fun printStack(stack: ('a,'b) stack, n: int) =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   678
         case stack
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   679
           of (state,_) :: rest =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   680
                 (TextIO.print("\t" ^ Int.toString n ^ ": ");
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   681
                  println(showState state);
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   682
                  printStack(rest, n+1))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   683
            | nil => ()
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   684
                
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   685
        fun prAction showTerminal
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   686
                 (stack as (state,_) :: _, next as (TOKEN (term,_),_), action) =
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   687
             (println "Parse: state stack:";
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   688
              printStack(stack, 0);
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   689
              TextIO.print("       state="
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   690
                         ^ showState state      
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   691
                         ^ " next="
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   692
                         ^ showTerminal term
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   693
                         ^ " action="
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   694
                        );
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   695
              case action
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   696
                of SHIFT state => println ("SHIFT " ^ (showState state))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   697
                 | REDUCE i => println ("REDUCE " ^ (Int.toString i))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   698
                 | ERROR => println "ERROR"
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   699
                 | ACCEPT => println "ACCEPT")
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   700
        | prAction _ (_,_,action) = ()
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   701
     end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   702
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   703
    (* ssParse: parser which maintains the queue of (state * lexvalues) in a
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   704
        steady-state.  It takes a table, showTerminal function, saction
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   705
        function, and fixError function.  It parses until an ACCEPT is
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   706
        encountered, or an exception is raised.  When an error is encountered,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   707
        fixError is called with the arguments of parseStep (lexv,stack,and
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   708
        queue).  It returns the lexv, and a new stack and queue adjusted so
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   709
        that the lexv can be parsed *)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   710
        
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   711
    val ssParse =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   712
      fn (table,showTerminal,saction,fixError,arg) =>
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   713
        let val prAction = prAction showTerminal
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   714
            val action = LrTable.action table
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   715
            val goto = LrTable.goto table
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   716
            fun parseStep(args as
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   717
                         (lexPair as (TOKEN (terminal, value as (_,leftPos,_)),
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   718
                                      lexer
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   719
                                      ),
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   720
                          stack as (state,_) :: _,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   721
                          queue)) =
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   722
              let val nextAction = action (state,terminal)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   723
                  val _ = if DEBUG1 then prAction(stack,lexPair,nextAction)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   724
                          else ()
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   725
              in case nextAction
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   726
                 of SHIFT s =>
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   727
                  let val newStack = (s,value) :: stack
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   728
                      val newLexPair = Stream.get lexer
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   729
                      val (_,newQueue) =Fifo.get(Fifo.put((newStack,newLexPair),
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   730
                                                            queue))
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   731
                  in parseStep(newLexPair,(s,value)::stack,newQueue)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   732
                  end
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   733
                 | REDUCE i =>
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   734
                     (case saction(i,leftPos,stack,arg)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   735
                      of (nonterm,value,stack as (state,_) :: _) =>
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   736
                          parseStep(lexPair,(goto(state,nonterm),value)::stack,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   737
                                    queue)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   738
                       | _ => raise (ParseImpossible 197))
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   739
                 | ERROR => parseStep(fixError args)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   740
                 | ACCEPT => 
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   741
                        (case stack
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   742
                         of (_,(topvalue,_,_)) :: _ =>
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   743
                                let val (token,restLexer) = lexPair
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   744
                                in (topvalue,Stream.cons(token,restLexer))
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   745
                                end
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   746
                          | _ => raise (ParseImpossible 202))
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   747
              end
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   748
            | parseStep _ = raise (ParseImpossible 204)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   749
        in parseStep
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   750
        end
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   751
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   752
    (*  distanceParse: parse until n tokens are shifted, or accept or
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   753
        error are encountered.  Takes a table, showTerminal function, and
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   754
        semantic action function.  Returns a parser which takes a lexPair
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   755
        (lex result * lexer), a state stack, a queue, and a distance
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   756
        (must be > 0) to parse.  The parser returns a new lex-value, a stack
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   757
        with the nth token shifted on top, a queue, a distance, and action
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   758
        option. *)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   759
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   760
    val distanceParse =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   761
      fn (table,showTerminal,saction,arg) =>
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   762
        let val prAction = prAction showTerminal
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   763
            val action = LrTable.action table
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   764
            val goto = LrTable.goto table
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   765
            fun parseStep(lexPair,stack,queue,0) = (lexPair,stack,queue,0,NONE)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   766
              | parseStep(lexPair as (TOKEN (terminal, value as (_,leftPos,_)),
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   767
                                      lexer
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   768
                                     ),
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   769
                          stack as (state,_) :: _,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   770
                          queue,distance) =
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   771
              let val nextAction = action(state,terminal)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   772
                  val _ = if DEBUG1 then prAction(stack,lexPair,nextAction)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   773
                          else ()
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   774
              in case nextAction
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   775
                 of SHIFT s =>
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   776
                  let val newStack = (s,value) :: stack
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   777
                      val newLexPair = Stream.get lexer
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   778
                  in parseStep(newLexPair,(s,value)::stack,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   779
                               Fifo.put((newStack,newLexPair),queue),distance-1)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   780
                  end
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   781
                 | REDUCE i =>
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   782
                    (case saction(i,leftPos,stack,arg)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   783
                      of (nonterm,value,stack as (state,_) :: _) =>
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   784
                         parseStep(lexPair,(goto(state,nonterm),value)::stack,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   785
                                 queue,distance)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   786
                      | _ => raise (ParseImpossible 240))
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   787
                 | ERROR => (lexPair,stack,queue,distance,SOME nextAction)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   788
                 | ACCEPT => (lexPair,stack,queue,distance,SOME nextAction)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   789
              end
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   790
           | parseStep _ = raise (ParseImpossible 242)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   791
        in parseStep : ('_a,'_b) distanceParse 
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   792
        end
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   793
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   794
(* mkFixError: function to create fixError function which adjusts parser state
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   795
   so that parse may continue in the presence of an error *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   796
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   797
fun mkFixError({is_keyword,terms,errtermvalue,
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   798
              preferred_change,noShift,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   799
              showTerminal,error,...} : ('_a,'_b) ecRecord,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   800
             distanceParse : ('_a,'_b) distanceParse,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   801
             minAdvance,maxAdvance) 
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   802
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   803
            (lexv as (TOKEN (term,value as (_,leftPos,_)),_),stack,queue) =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   804
    let val _ = if DEBUG2 then
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   805
                        error("syntax error found at " ^ (showTerminal term),
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   806
                              leftPos,leftPos)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   807
                else ()
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   808
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   809
        fun tokAt(t,p) = TOKEN(t,(errtermvalue t,p,p))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   810
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   811
        val minDelta = 3
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   812
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   813
        (* pull all the state * lexv elements from the queue *)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   814
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   815
        val stateList = 
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   816
           let fun f q = let val (elem,newQueue) = Fifo.get q
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   817
                         in elem :: (f newQueue)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   818
                         end handle Fifo.Empty => nil
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   819
           in f queue
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   820
           end
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   821
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   822
        (* now number elements of stateList, giving distance from
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   823
           error token *)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   824
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   825
        val (_, numStateList) =
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   826
              List.foldr (fn (a,(num,r)) => (num+1,(a,num)::r)) (0, []) stateList
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   827
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   828
        (* Represent the set of potential changes as a linked list.
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   829
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   830
           Values of datatype Change hold information about a potential change.
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   831
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   832
           oper = oper to be applied
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   833
           pos = the # of the element in stateList that would be altered.
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   834
           distance = the number of tokens beyond the error token which the
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   835
             change allows us to parse.
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   836
           new = new terminal * value pair at that point
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   837
           orig = original terminal * value pair at the point being changed.
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   838
         *)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   839
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   840
        datatype ('a,'b) change = CHANGE of
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   841
           {pos : int, distance : int, leftPos: 'b, rightPos: 'b,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   842
            new : ('a,'b) lexv list, orig : ('a,'b) lexv list}
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   843
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   845
         val showTerms = String.concat o map (fn TOKEN(t,_) => " " ^ showTerminal t)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   846
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   847
         val printChange = fn c =>
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   848
          let val CHANGE {distance,new,orig,pos,...} = c
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   849
          in (TextIO.print ("{distance= " ^ (Int.toString distance));
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   850
              TextIO.print (",orig ="); TextIO.print(showTerms orig);
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   851
              TextIO.print (",new ="); TextIO.print(showTerms new);
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   852
              TextIO.print (",pos= " ^ (Int.toString pos));
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   853
              TextIO.print "}\n")
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   854
          end
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   855
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   856
        val printChangeList = app printChange
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   857
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   858
(* parse: given a lexPair, a stack, and the distance from the error
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   859
   token, return the distance past the error token that we are able to parse.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   860
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   861
        fun parse (lexPair,stack,queuePos : int) =
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   862
            case distanceParse(lexPair,stack,Fifo.empty,queuePos+maxAdvance+1)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   863
             of (_,_,_,distance,SOME ACCEPT) => 
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   864
                        if maxAdvance-distance-1 >= 0 
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   865
                            then maxAdvance 
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   866
                            else maxAdvance-distance-1
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   867
              | (_,_,_,distance,_) => maxAdvance - distance - 1
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   868
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   869
(* catList: concatenate results of scanning list *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   870
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   871
        fun catList l f = List.foldr (fn(a,r)=> f a @ r) [] l
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   872
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   873
        fun keywordsDelta new = if List.exists (fn(TOKEN(t,_))=>is_keyword t) new
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   874
                       then minDelta else 0
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   875
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   876
        fun tryChange{lex,stack,pos,leftPos,rightPos,orig,new} =
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   877
             let val lex' = List.foldr (fn (t',p)=>(t',Stream.cons p)) lex new
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   878
                 val distance = parse(lex',stack,pos+length new-length orig)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   879
              in if distance >= minAdvance + keywordsDelta new 
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   880
                   then [CHANGE{pos=pos,leftPos=leftPos,rightPos=rightPos,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   881
                                distance=distance,orig=orig,new=new}] 
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   882
                   else []
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   883
             end
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   884
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   885
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   886
(* tryDelete: Try to delete n terminals.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   887
              Return single-element [success] or nil.
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   888
              Do not delete unshiftable terminals. *)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   889
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   890
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   891
    fun tryDelete n ((stack,lexPair as (TOKEN(term,(_,l,r)),_)),qPos) =
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   892
        let fun del(0,accum,left,right,lexPair) =
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   893
                  tryChange{lex=lexPair,stack=stack,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   894
                            pos=qPos,leftPos=left,rightPos=right,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   895
                            orig=rev accum, new=[]}
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   896
              | del(n,accum,left,right,(tok as TOKEN(term,(_,_,r)),lexer)) =
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   897
                   if noShift term then []
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   898
                   else del(n-1,tok::accum,left,r,Stream.get lexer)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   899
         in del(n,[],l,r,lexPair)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   900
        end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   901
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   902
(* tryInsert: try to insert tokens before the current terminal;
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   903
       return a list of the successes  *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   904
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   905
        fun tryInsert((stack,lexPair as (TOKEN(_,(_,l,_)),_)),queuePos) =
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   906
               catList terms (fn t =>
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   907
                 tryChange{lex=lexPair,stack=stack,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   908
                           pos=queuePos,orig=[],new=[tokAt(t,l)],
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   909
                           leftPos=l,rightPos=l})
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   910
                              
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   911
(* trySubst: try to substitute tokens for the current terminal;
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   912
       return a list of the successes  *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   913
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   914
        fun trySubst ((stack,lexPair as (orig as TOKEN (term,(_,l,r)),lexer)),
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   915
                      queuePos) =
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   916
              if noShift term then []
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   917
              else
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   918
                  catList terms (fn t =>
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   919
                      tryChange{lex=Stream.get lexer,stack=stack,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   920
                                pos=queuePos,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   921
                                leftPos=l,rightPos=r,orig=[orig],
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   922
                                new=[tokAt(t,r)]})
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   923
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   924
     (* do_delete(toks,lexPair) tries to delete tokens "toks" from "lexPair".
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   925
         If it succeeds, returns SOME(toks',l,r,lp), where
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   926
             toks' is the actual tokens (with positions and values) deleted,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   927
             (l,r) are the (leftmost,rightmost) position of toks', 
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   928
             lp is what remains of the stream after deletion 
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   929
     *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   930
        fun do_delete(nil,lp as (TOKEN(_,(_,l,_)),_)) = SOME(nil,l,l,lp)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   931
          | do_delete([t],(tok as TOKEN(t',(_,l,r)),lp')) =
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   932
               if eqT (t, t')
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   933
                   then SOME([tok],l,r,Stream.get lp')
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   934
                   else NONE
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   935
          | do_delete(t::rest,(tok as TOKEN(t',(_,l,r)),lp')) =
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   936
               if eqT (t,t')
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   937
                   then case do_delete(rest,Stream.get lp')
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   938
                         of SOME(deleted,l',r',lp'') =>
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   939
                               SOME(tok::deleted,l,r',lp'')
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   940
                          | NONE => NONE
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   941
                   else NONE
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   942
                             
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   943
        fun tryPreferred((stack,lexPair),queuePos) =
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   944
            catList preferred_change (fn (delete,insert) =>
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   945
               if List.exists noShift delete then [] (* should give warning at
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   946
                                                 parser-generation time *)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   947
               else case do_delete(delete,lexPair)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   948
                     of SOME(deleted,l,r,lp) => 
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   949
                            tryChange{lex=lp,stack=stack,pos=queuePos,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   950
                                      leftPos=l,rightPos=r,orig=deleted,
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   951
                                      new=map (fn t=>(tokAt(t,r))) insert}
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   952
                      | NONE => [])
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   953
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   954
        val changes = catList numStateList tryPreferred @
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   955
                        catList numStateList tryInsert @
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   956
                          catList numStateList trySubst @
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   957
                            catList numStateList (tryDelete 1) @
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   958
                              catList numStateList (tryDelete 2) @
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   959
                                catList numStateList (tryDelete 3)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   960
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   961
        val findMaxDist = fn l => 
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   962
          List.foldr (fn (CHANGE {distance,...},high) => Int.max(distance,high)) 0 l
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   963
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   964
(* maxDist: max distance past error taken that we could parse *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   965
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   966
        val maxDist = findMaxDist changes
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   967
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   968
(* remove changes which did not parse maxDist tokens past the error token *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   969
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   970
        val changes = catList changes 
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   971
              (fn(c as CHANGE{distance,...}) => 
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   972
                  if distance=maxDist then [c] else [])
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   973
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   974
      in case changes 
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   975
          of (l as change :: _) =>
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   976
              let fun print_msg (CHANGE {new,orig,leftPos,rightPos,...}) =
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   977
                  let val s = 
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   978
                      case (orig,new)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   979
                          of (_::_,[]) => "deleting " ^ (showTerms orig)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   980
                           | ([],_::_) => "inserting " ^ (showTerms new)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   981
                           | _ => "replacing " ^ (showTerms orig) ^
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   982
                                 " with " ^ (showTerms new)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   983
                  in error ("syntax error: " ^ s,leftPos,rightPos)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   984
                  end
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   985
                   
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   986
                  val _ = 
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   987
                      (if length l > 1 andalso DEBUG2 then
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   988
                           (TextIO.print "multiple fixes possible; could fix it by:\n";
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   989
                            app print_msg l;
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   990
                            TextIO.print "chosen correction:\n")
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   991
                       else ();
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   992
                       print_msg change)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   993
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   994
                  (* findNth: find nth queue entry from the error
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   995
                   entry.  Returns the Nth queue entry and the  portion of
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   996
                   the queue from the beginning to the nth-1 entry.  The
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   997
                   error entry is at the end of the queue.
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   998
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
   999
                   Examples:
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
  1000
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1001
                   queue = a b c d e
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1002
                   findNth 0 = (e,a b c d)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1003
                   findNth 1 =  (d,a b c)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1004
                   *)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
  1005
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1006
                  val findNth = fn n =>
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1007
                      let fun f (h::t,0) = (h,rev t)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1008
                            | f (h::t,n) = f(t,n-1)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1009
                            | f (nil,_) = let exception FindNth
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1010
                                          in raise FindNth
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1011
                                          end
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1012
                      in f (rev stateList,n)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1013
                      end
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1014
                
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1015
                  val CHANGE {pos,orig,new,...} = change
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1016
                  val (last,queueFront) = findNth pos
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1017
                  val (stack,lexPair) = last
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
  1018
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1019
                  val lp1 = List.foldl(fn (_,(_,r)) => Stream.get r) lexPair orig
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1020
                  val lp2 = List.foldr(fn(t,r)=>(t,Stream.cons r)) lp1 new
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
  1021
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1022
                  val restQueue = 
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1023
                      Fifo.put((stack,lp2),
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1024
                               List.foldl Fifo.put Fifo.empty queueFront)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
  1025
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1026
                  val (lexPair,stack,queue,_,_) =
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1027
                      distanceParse(lp2,stack,restQueue,pos)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
  1028
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1029
              in (lexPair,stack,queue)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1030
              end
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1031
        | nil => (error("syntax error found at " ^ (showTerminal term),
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1032
                        leftPos,leftPos); raise ParseError)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
  1033
    end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
  1034
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
  1035
   val parse = fn {arg,table,lexer,saction,void,lookahead,
62015
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1036
                   ec=ec as {showTerminal,...} : ('_a,'_b) ecRecord} =>
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1037
        let val distance = 15   (* defer distance tokens *)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1038
            val minAdvance = 1  (* must parse at least 1 token past error *)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1039
            val maxAdvance = Int.max(lookahead,0)(* max distance for parse check *)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1040
            val lexPair = Stream.get lexer
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1041
            val (TOKEN (_,(_,leftPos,_)),_) = lexPair
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1042
            val startStack = [(initialState table,(void,leftPos,leftPos))]
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1043
            val startQueue = Fifo.put((startStack,lexPair),Fifo.empty)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1044
            val distanceParse = distanceParse(table,showTerminal,saction,arg)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1045
            val fixError = mkFixError(ec,distanceParse,minAdvance,maxAdvance)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1046
            val ssParse = ssParse(table,showTerminal,saction,fixError,arg)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1047
            fun loop (lexPair,stack,queue,_,SOME ACCEPT) =
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1048
                   ssParse(lexPair,stack,queue)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1049
              | loop (lexPair,stack,queue,0,_) = ssParse(lexPair,stack,queue)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1050
              | loop (lexPair,stack,queue,distance,SOME ERROR) =
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1051
                 let val (lexPair,stack,queue) = fixError(lexPair,stack,queue)
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1052
                 in loop (distanceParse(lexPair,stack,queue,distance))
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1053
                 end
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1054
              | loop _ = let exception ParseInternal
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1055
                         in raise ParseInternal
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1056
                         end
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1057
        in loop (distanceParse(lexPair,startStack,startQueue,distance))
db9c2af6ce72 expand hard tabs;
wenzelm
parents: 56281
diff changeset
  1058
        end
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
  1059
 end;
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
  1060
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
  1061
;