src/HOL/TPTP/TPTP_Parser/ml-yacc/lib/parser1.sml
author wenzelm
Wed, 04 Oct 2017 12:00:53 +0200
changeset 66787 64b47495676d
parent 46845 6431a93ffeb6
permissions -rw-r--r--
obsolete;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46845
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
     1
(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *)
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
     2
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
     3
(* drt (12/15/89) -- the functor should be used during development work,
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
     4
   but it is wastes space in the release version.
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
     5
   
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
     6
functor ParserGen(structure LrTable : LR_TABLE
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
     7
		  structure Stream : STREAM) : LR_PARSER =
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
     8
*)
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
     9
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    10
structure LrParser :> LR_PARSER =
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    11
 struct
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    12
     val print = fn s => output(std_out,s)
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    13
     val println = fn s => (print s; print "\n")
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    14
     structure LrTable = LrTable
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    15
     structure Stream = Stream
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    16
     structure Token : TOKEN =
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    17
	struct
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    18
	    structure LrTable = LrTable
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    19
	    datatype ('a,'b) token = TOKEN of LrTable.term * ('a * 'b * 'b)
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    20
	    val sameToken = fn (TOKEN (t,_),TOKEN(t',_)) => t=t'
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    21
	end
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    22
     
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    23
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    24
     open LrTable 
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    25
     open Token
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    26
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    27
     val DEBUG = false
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    28
     exception ParseError
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    29
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    30
      type ('a,'b) elem = (state * ('a * 'b * 'b))
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    31
      type ('a,'b) stack = ('a,'b) elem list
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    32
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    33
      val showState = fn (STATE s) => ("STATE " ^ (makestring s))
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    34
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    35
      fun printStack(stack: ('a,'b) elem list, n: int) =
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    36
         case stack
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    37
           of (state, _) :: rest =>
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    38
                 (print("          " ^ makestring n ^ ": ");
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    39
                  println(showState state);
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    40
                  printStack(rest, n+1)
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    41
                 )
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    42
            | nil => ()
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    43
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    44
      val parse = fn {arg : 'a,
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    45
		      table : LrTable.table,
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    46
		      lexer : ('_b,'_c) token Stream.stream,
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    47
		      saction : int * '_c * ('_b,'_c) stack * 'a ->
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    48
				nonterm * ('_b * '_c * '_c) * ('_b,'_c) stack,
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    49
		      void : '_b,
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    50
		      ec = {is_keyword,preferred_change,
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    51
			    errtermvalue,showTerminal,
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    52
			    error,terms,noShift},
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    53
		      lookahead} =>
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    54
 let fun prAction(stack as (state, _) :: _, 
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    55
		  next as (TOKEN (term,_),_), action) =
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    56
             (println "Parse: state stack:";
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    57
              printStack(stack, 0);
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    58
              print("       state="
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    59
                         ^ showState state	
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    60
                         ^ " next="
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    61
                         ^ showTerminal term
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    62
                         ^ " action="
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    63
                        );
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    64
              case action
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    65
                of SHIFT s => println ("SHIFT " ^ showState s)
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    66
                 | REDUCE i => println ("REDUCE " ^ (makestring i))
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    67
                 | ERROR => println "ERROR"
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    68
		 | ACCEPT => println "ACCEPT";
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    69
              action)
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    70
        | prAction (_,_,action) = action
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    71
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    72
      val action = LrTable.action table
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    73
      val goto = LrTable.goto table
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    74
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    75
      fun parseStep(next as (TOKEN (terminal, value as (_,leftPos,_)),lexer) :
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    76
			('_b,'_c) token * ('_b,'_c) token Stream.stream,
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    77
		    stack as (state,_) :: _ : ('_b ,'_c) stack) =
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    78
         case (if DEBUG then prAction(stack, next,action(state, terminal))
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    79
               else action(state, terminal))
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    80
              of SHIFT s => parseStep(Stream.get lexer, (s,value) :: stack)
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    81
               | REDUCE i =>
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    82
		    let val (nonterm,value,stack as (state,_) :: _ ) =
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    83
					 saction(i,leftPos,stack,arg)
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    84
		    in parseStep(next,(goto(state,nonterm),value)::stack)
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    85
		    end
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    86
               | ERROR => let val (_,leftPos,rightPos) = value
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    87
		          in error("syntax error\n",leftPos,rightPos);
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    88
			     raise ParseError
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    89
			  end
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    90
  	       | ACCEPT => let val (_,(topvalue,_,_)) :: _ = stack
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    91
			       val (token,restLexer) = next
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    92
			   in (topvalue,Stream.cons(token,lexer))
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    93
			   end
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    94
      val next as (TOKEN (terminal,(_,leftPos,_)),_) = Stream.get lexer
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    95
   in parseStep(next,[(initialState table,(void,leftPos,leftPos))])
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    96
   end
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    97
end;
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    98