src/Pure/Syntax/parse_tree.ML
author clasohm
Thu, 16 Sep 1993 12:20:38 +0200
changeset 0 a5a9c433f639
child 18 c9ec452ff08f
permissions -rw-r--r--
Initial revision
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     1
(*  Title:      Pure/Syntax/parse_tree
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     3
    Author:     Tobias Nipkow and Markus Wenzel, TU Muenchen
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
signature PARSE_TREE =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
sig
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
  structure Lexicon: LEXICON
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
  structure Ast: AST
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
  local open Lexicon Ast in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
    datatype ParseTree =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
      Node of string * ParseTree list |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
      Tip of Token
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
    val mk_pt: string * ParseTree list -> ParseTree
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
    val pt_to_ast: (string -> (ast list -> ast) option) -> ParseTree -> ast
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
  end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
functor ParseTreeFun(structure Lexicon: LEXICON and Ast: AST): PARSE_TREE =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
struct
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    21
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
structure Lexicon = Lexicon;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
structure Ast = Ast;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    24
open Lexicon Ast;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    25
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
(* datatype ParseTree *)  (* FIXME rename *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
datatype ParseTree =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
  Node of string * ParseTree list |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
  Tip of Token;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
(* mk_pt *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
fun mk_pt("", [pt]) = pt
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
  | mk_pt("", _) = error "mk_pt: funny copy op in parse tree"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
  | mk_pt(s, ptl) = Node (s, ptl);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
(* pt_to_ast *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
fun pt_to_ast trf pt =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
  let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
    fun trans a args =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
      (case trf a of
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
        None => mk_appl (Constant a) args
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
      | Some f =>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
          (f args) handle _ => error ("pt_to_ast: error in translation for " ^ a));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
    fun trav (Node (a, pts)) = trans a (map trav pts)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
      | trav (Tip (IdentSy x)) = Variable x
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
      | trav (Tip (VarSy xi)) = Variable (string_of_vname xi)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
      | trav (Tip (TFreeSy x)) = Variable x
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
      | trav (Tip (TVarSy xi)) = Variable (string_of_vname xi)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
      | trav (Tip _) = error "pt_to_ast: unexpected token in parse tree";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
  in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
    trav pt
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63