Mercurial > repos > tabletprog
annotate modules/symbols.tp @ 331:61f5b794d939
Breaking change: method call syntax now always uses the syntactic receiver as the actual receiver. This makes its behavior different from function call syntax, but solves some problems with methods being shadowed by local variables and the like.
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 28 Mar 2015 14:21:04 -0700 |
parents | aea99b93cf2f |
children |
rev | line source |
---|---|
252
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1 { |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2 _null <- #{ |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3 find:else <- :_ :else { |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
4 else: |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 } |
302
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
6 ifDefined:else <- :name ifdef :else { |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
7 else: |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
8 } |
252
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
9 } |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
10 _local <- 0 |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
11 _closedover <- 1 |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
12 _upvar <- 2 |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
13 _method <- 3 |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
14 _self <- 4 |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
15 _parent <- 5 |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
16 |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
17 _nextMethodId <- 0 |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
18 _method <- :_name { |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
19 _id <- _nextMethodId |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
20 _nextMethodId <- _id + 1 |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
21 #{ |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
22 name <- { _name } |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
23 id <- { _id } |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
24 string <- { "method " . _name . "(" . _id . ")" } |
302
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
25 isMethod? <- { true } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
26 isLocal? <- { false } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
27 } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
28 } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
29 _local <- :_name _def { |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
30 #{ |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
31 name <- { _name } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
32 string <- { "local " . _name } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
33 def <- { _def } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
34 isMethod? <- { false } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
35 closedOver? <- false |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
36 isLocal? <- { true } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
37 } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
38 } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
39 _upvar <- :parent { |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
40 if: (parent isLocal?) { |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
41 parent closedOver?!: true |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
42 #{ |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
43 name <- { parent name } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
44 def <- { parent def } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
45 closedOver? <- { parent closedOver? } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
46 isMethod? <- { parent isMethod? } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
47 string <- { "upvar " . name} |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
48 isLocal? <- { false } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
49 depth <- 1 |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
50 } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
51 } else: { |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
52 parent depth!: (parent depth) + 1 |
252
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
53 } |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
54 } |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
55 #{ |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
56 nullTable <- { _null } |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
57 |
302
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
58 tableWithParent <- :_parent { |
252
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
59 _symbols <- dict hash |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
60 #{ |
302
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
61 ifDefined:else <- :name ifdef :else { |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
62 _symbols ifget: name :sym { |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
63 ifdef: sym |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
64 } else: { |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
65 _parent ifDefined: name :sym { |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
66 ifdef: (_upvar: sym) |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
67 } else: else |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
68 } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
69 } |
252
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
70 find:else <- :name :else { |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
71 _symbols get: name else: { |
302
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
72 _parent ifDefined: name :sym { |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
73 if: (sym isMethod?) { |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
74 //TODO: methods on parent objects |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
75 sym |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
76 } else: { |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
77 _upvar: sym |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
78 } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
79 } else: { |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
80 else: |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
81 } |
252
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
82 } |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
83 } |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
84 defineMethod <- :name { |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
85 _symbols get: name else: { |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
86 _symbols set: name (_method: name) |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
87 } |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
88 self |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
89 } |
302
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
90 define <- :name def { |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
91 s <- (_local: name def) |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
92 _symbols set: name s |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
93 s |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
94 } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
95 find:elseDefine <- :name :def { |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
96 find: name else: { |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
97 define: name def |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
98 } |
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
99 } |
252
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
100 print <- { |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
101 foreach: _symbols :name info { |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
102 print: name . ": " . info . "\n" |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
103 } |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
104 } |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
105 } |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
106 } |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
107 |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
108 table <- { |
302
aea99b93cf2f
More fleshed out implementation of symbol tables
Michael Pavone <pavone@retrodev.com>
parents:
263
diff
changeset
|
109 tableWithParent: _null |
252
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
110 } |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
111 |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
112 buildMethodTable <- :tree { |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
113 _object <- ast obj |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
114 _assignment <- ast assignment |
263
98147071baf6
Add support for llMessage definitions in buildMethodTables
Michael Pavone <pavone@retrodev.com>
parents:
252
diff
changeset
|
115 _call <- ast call |
98147071baf6
Add support for llMessage definitions in buildMethodTables
Michael Pavone <pavone@retrodev.com>
parents:
252
diff
changeset
|
116 |
252
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
117 tree fold: table with: :acc el { |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
118 if: (el nodeType) = _object { |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
119 (el messages) fold: acc with: :acc msg { |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
120 if: (msg nodeType) = _assignment { |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
121 acc defineMethod: ((msg to) name) |
263
98147071baf6
Add support for llMessage definitions in buildMethodTables
Michael Pavone <pavone@retrodev.com>
parents:
252
diff
changeset
|
122 } else: { |
98147071baf6
Add support for llMessage definitions in buildMethodTables
Michael Pavone <pavone@retrodev.com>
parents:
252
diff
changeset
|
123 if: (msg nodeType) = _call && (msg llMessage?) { |
98147071baf6
Add support for llMessage definitions in buildMethodTables
Michael Pavone <pavone@retrodev.com>
parents:
252
diff
changeset
|
124 acc defineMethod: (((msg args) value) name) |
98147071baf6
Add support for llMessage definitions in buildMethodTables
Michael Pavone <pavone@retrodev.com>
parents:
252
diff
changeset
|
125 } |
252
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
126 } |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
127 acc |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
128 } |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
129 } else: { |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
130 acc |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
131 } |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
132 } |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
133 } |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
134 } |
004946743678
Added code for building a method symbol table
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
135 } |