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