0
|
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 |
|