Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/compiler/Semant/basics/sympaths.sml
ViewVC logotype

Annotation of /sml/trunk/src/compiler/Semant/basics/sympaths.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 249 - (view) (download)
Original Path: sml/branches/SMLNJ/src/compiler/Semant/basics/sympaths.sml

1 : monnier 249 (* Copyright 1996 by AT&T Bell Laboratories *)
2 :     (* sympaths.sml *)
3 :    
4 :     structure SymPath : SYMPATH =
5 :     struct
6 :    
7 :     structure S = Symbol
8 :    
9 :     datatype path = SPATH of S.symbol list
10 :    
11 :     exception SymPath
12 :    
13 :     val empty = SPATH nil
14 :    
15 :     fun null(SPATH p) = List.null p
16 :    
17 :     fun extend(SPATH p: path, s: S.symbol) = SPATH(p @ [s])
18 :    
19 :     fun prepend(s: S.symbol, SPATH p: path) = SPATH(s::p)
20 :    
21 :     fun append(SPATH front: path, SPATH back: path) = SPATH(front @ back)
22 :    
23 :     fun first(SPATH []: path) = raise SymPath
24 :     | first(SPATH(s::_)) = s
25 :    
26 :     fun rest(SPATH []: path) = raise SymPath
27 :     | rest(SPATH(_::p)) = SPATH p
28 :    
29 :     fun length(SPATH p: path) = List.length p
30 :    
31 :     (* the last element of a path *)
32 :     fun last(SPATH p) =
33 :     List.last p
34 :     handle List.Empty => ErrorMsg.impossible "SymPath.last"
35 :    
36 :     fun equal(SPATH p1: path, SPATH p2: path) = (p1 = p2)
37 :    
38 :     val resultId = Symbol.strSymbol "<resultStr>"
39 :     val returnId = Symbol.strSymbol "<returnStr>"
40 :    
41 :     fun toString(SPATH p: path) =
42 :     let fun f [s] = [Symbol.name s]
43 :     | f (a::r) =
44 :     if (Symbol.eq(a,resultId)) orelse
45 :     (Symbol.eq(a,returnId))
46 :     then f r
47 :     else Symbol.name a :: "." :: f r
48 :     | f nil = ["<empty spath>"]
49 :     in concat(f p)
50 :     end
51 :    
52 :     end (* structure SymPath *)
53 :    
54 :    
55 :     structure InvPath : INVPATH =
56 :     struct
57 :    
58 :     structure S = Symbol
59 :    
60 :     datatype path = IPATH of S.symbol list
61 :    
62 :     exception InvPath
63 :    
64 :     val empty = IPATH nil
65 :    
66 :     fun null(IPATH p) = List.null p
67 :    
68 :     fun extend(IPATH p: path, s: S.symbol) = IPATH(s::p)
69 :    
70 :     fun append(IPATH front: path, IPATH back: path) = IPATH(back @ front)
71 :    
72 :     fun last(IPATH []: path) = raise InvPath
73 :     | last(IPATH(s::_)) = s
74 :    
75 :     fun lastPrefix(IPATH []: path) = raise InvPath
76 :     | lastPrefix(IPATH(_::p)) = IPATH p
77 :    
78 :     fun equal(IPATH p1:path, IPATH p2:path) = (p1 = p2)
79 :    
80 :     fun toString(IPATH p: path) =
81 :     let fun f [s] = [Symbol.name s, ">"]
82 :     | f (a::r) = Symbol.name a :: "." :: f r
83 :     | f nil = [">"]
84 :     in concat("<" :: f p)
85 :     end
86 :    
87 :     end (* structure InvPath *)
88 :    
89 :    
90 :     structure ConvertPaths : CONVERTPATHS =
91 :     struct
92 :    
93 :     type spath = SymPath.path
94 :     type ipath = InvPath.path
95 :    
96 :     fun invertSPath(SymPath.SPATH p : SymPath.path) : InvPath.path =
97 :     InvPath.IPATH(rev p)
98 :     fun invertIPath(InvPath.IPATH p : InvPath.path) : SymPath.path =
99 :     SymPath.SPATH(rev p)
100 :    
101 :     end (* structure ConvertPaths *)
102 :    
103 :     (*
104 :     * $Log$
105 :     *)

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0