src/HOL/TPTP/TPTP_Parser/ml-yacc/lib/lrtable.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
structure LrTable : LR_TABLE = 
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
     3
    struct
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
     4
	open Array List
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
     5
	infix 9 sub
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
     6
	datatype ('a,'b) pairlist = EMPTY
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
     7
				  | PAIR of 'a * 'b * ('a,'b) pairlist
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
     8
	datatype term = T of int
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
     9
	datatype nonterm = NT of int
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    10
	datatype state = STATE of int
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    11
	datatype action = SHIFT of state
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    12
			| REDUCE of int (* rulenum from grammar *)
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    13
			| ACCEPT
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    14
			| ERROR
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    15
	exception Goto of state * nonterm
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    16
	type table = {states: int, rules : int,initialState: state,
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    17
		      action: ((term,action) pairlist * action) array,
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    18
		      goto :  (nonterm,state) pairlist array}
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    19
	val numStates = fn ({states,...} : table) => states
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    20
	val numRules = fn ({rules,...} : table) => rules
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    21
	val describeActions =
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    22
	   fn ({action,...} : table) => 
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    23
	           fn (STATE s) => action sub s
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    24
	val describeGoto =
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    25
	   fn ({goto,...} : table) =>
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    26
	           fn (STATE s) => goto sub s
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    27
	fun findTerm (T term,row,default) =
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    28
	    let fun find (PAIR (T key,data,r)) =
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    29
		       if key < term then find r
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    30
		       else if key=term then data
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    31
		       else default
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    32
		   | find EMPTY = default
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    33
	    in find row
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    34
	    end
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    35
	fun findNonterm (NT nt,row) =
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    36
	    let fun find (PAIR (NT key,data,r)) =
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    37
		       if key < nt then find r
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    38
		       else if key=nt then SOME data
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    39
		       else NONE
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    40
		   | find EMPTY = NONE
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    41
	    in find row
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    42
	    end
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    43
	val action = fn ({action,...} : table) =>
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    44
		fn (STATE state,term) =>
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    45
		  let val (row,default) = action sub state
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    46
		  in findTerm(term,row,default)
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    47
		  end
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    48
	val goto = fn ({goto,...} : table) =>
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    49
			fn (a as (STATE state,nonterm)) =>
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    50
			  case findNonterm(nonterm,goto sub state)
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    51
			  of SOME state => state
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    52
			   | NONE => raise (Goto a)
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    53
	val initialState = fn ({initialState,...} : table) => initialState
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    54
	val mkLrTable = fn {actions,gotos,initialState,numStates,numRules} =>
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    55
	     ({action=actions,goto=gotos,
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    56
	       states=numStates,
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    57
	       rules=numRules,
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    58
               initialState=initialState} : table)
6431a93ffeb6 added ml-yacc library sources;
sultana
parents:
diff changeset
    59
end;