Mercurial > repos > tabletprog
comparison modules/symbols.tp @ 302:aea99b93cf2f
More fleshed out implementation of symbol tables
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 25 Jul 2014 13:46:43 -0700 |
parents | 98147071baf6 |
children |
comparison
equal
deleted
inserted
replaced
301:5d24b3117aa7 | 302:aea99b93cf2f |
---|---|
1 { | 1 { |
2 _null <- #{ | 2 _null <- #{ |
3 find:else <- :_ :else { | 3 find:else <- :_ :else { |
4 else: | |
5 } | |
6 ifDefined:else <- :name ifdef :else { | |
4 else: | 7 else: |
5 } | 8 } |
6 } | 9 } |
7 _local <- 0 | 10 _local <- 0 |
8 _closedover <- 1 | 11 _closedover <- 1 |
17 _nextMethodId <- _id + 1 | 20 _nextMethodId <- _id + 1 |
18 #{ | 21 #{ |
19 name <- { _name } | 22 name <- { _name } |
20 id <- { _id } | 23 id <- { _id } |
21 string <- { "method " . _name . "(" . _id . ")" } | 24 string <- { "method " . _name . "(" . _id . ")" } |
25 isMethod? <- { true } | |
26 isLocal? <- { false } | |
27 } | |
28 } | |
29 _local <- :_name _def { | |
30 #{ | |
31 name <- { _name } | |
32 string <- { "local " . _name } | |
33 def <- { _def } | |
34 isMethod? <- { false } | |
35 closedOver? <- false | |
36 isLocal? <- { true } | |
37 } | |
38 } | |
39 _upvar <- :parent { | |
40 if: (parent isLocal?) { | |
41 parent closedOver?!: true | |
42 #{ | |
43 name <- { parent name } | |
44 def <- { parent def } | |
45 closedOver? <- { parent closedOver? } | |
46 isMethod? <- { parent isMethod? } | |
47 string <- { "upvar " . name} | |
48 isLocal? <- { false } | |
49 depth <- 1 | |
50 } | |
51 } else: { | |
52 parent depth!: (parent depth) + 1 | |
22 } | 53 } |
23 } | 54 } |
24 #{ | 55 #{ |
25 nullTable <- { _null } | 56 nullTable <- { _null } |
26 | 57 |
27 tablewithParent <- :_parent { | 58 tableWithParent <- :_parent { |
28 _symbols <- dict hash | 59 _symbols <- dict hash |
29 #{ | 60 #{ |
61 ifDefined:else <- :name ifdef :else { | |
62 _symbols ifget: name :sym { | |
63 ifdef: sym | |
64 } else: { | |
65 _parent ifDefined: name :sym { | |
66 ifdef: (_upvar: sym) | |
67 } else: else | |
68 } | |
69 } | |
30 find:else <- :name :else { | 70 find:else <- :name :else { |
31 _symbols get: name else: { | 71 _symbols get: name else: { |
32 _parent find: name else: else | 72 _parent ifDefined: name :sym { |
73 if: (sym isMethod?) { | |
74 //TODO: methods on parent objects | |
75 sym | |
76 } else: { | |
77 _upvar: sym | |
78 } | |
79 } else: { | |
80 else: | |
81 } | |
33 } | 82 } |
34 } | 83 } |
35 defineMethod <- :name { | 84 defineMethod <- :name { |
36 _symbols get: name else: { | 85 _symbols get: name else: { |
37 _symbols set: name (_method: name) | 86 _symbols set: name (_method: name) |
38 } | 87 } |
39 self | 88 self |
89 } | |
90 define <- :name def { | |
91 s <- (_local: name def) | |
92 _symbols set: name s | |
93 s | |
94 } | |
95 find:elseDefine <- :name :def { | |
96 find: name else: { | |
97 define: name def | |
98 } | |
40 } | 99 } |
41 print <- { | 100 print <- { |
42 foreach: _symbols :name info { | 101 foreach: _symbols :name info { |
43 print: name . ": " . info . "\n" | 102 print: name . ": " . info . "\n" |
44 } | 103 } |
45 } | 104 } |
46 } | 105 } |
47 } | 106 } |
48 | 107 |
49 table <- { | 108 table <- { |
50 tablewithParent: _null | 109 tableWithParent: _null |
51 } | 110 } |
52 | 111 |
53 buildMethodTable <- :tree { | 112 buildMethodTable <- :tree { |
54 _object <- ast obj | 113 _object <- ast obj |
55 _assignment <- ast assignment | 114 _assignment <- ast assignment |