equal
deleted
inserted
replaced
|
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 |