Mercurial > repos > tabletprog
comparison modules/symbols.tp @ 252:004946743678
Added code for building a method symbol table
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 10 May 2014 19:11:01 -0700 |
parents | |
children | 98147071baf6 |
comparison
equal
deleted
inserted
replaced
251:2557ce4e671f | 252:004946743678 |
---|---|
1 { | |
2 _null <- #{ | |
3 find:else <- :_ :else { | |
4 else: | |
5 } | |
6 } | |
7 _local <- 0 | |
8 _closedover <- 1 | |
9 _upvar <- 2 | |
10 _method <- 3 | |
11 _self <- 4 | |
12 _parent <- 5 | |
13 | |
14 _nextMethodId <- 0 | |
15 _method <- :_name { | |
16 _id <- _nextMethodId | |
17 _nextMethodId <- _id + 1 | |
18 #{ | |
19 name <- { _name } | |
20 id <- { _id } | |
21 string <- { "method " . _name . "(" . _id . ")" } | |
22 } | |
23 } | |
24 #{ | |
25 nullTable <- { _null } | |
26 | |
27 tablewithParent <- :_parent { | |
28 _symbols <- dict hash | |
29 #{ | |
30 find:else <- :name :else { | |
31 _symbols get: name else: { | |
32 _parent find: name else: else | |
33 } | |
34 } | |
35 defineMethod <- :name { | |
36 _symbols get: name else: { | |
37 _symbols set: name (_method: name) | |
38 } | |
39 self | |
40 } | |
41 print <- { | |
42 foreach: _symbols :name info { | |
43 print: name . ": " . info . "\n" | |
44 } | |
45 } | |
46 } | |
47 } | |
48 | |
49 table <- { | |
50 tablewithParent: _null | |
51 } | |
52 | |
53 buildMethodTable <- :tree { | |
54 _object <- ast obj | |
55 _assignment <- ast assignment | |
56 tree fold: table with: :acc el { | |
57 if: (el nodeType) = _object { | |
58 (el messages) fold: acc with: :acc msg { | |
59 if: (msg nodeType) = _assignment { | |
60 acc defineMethod: ((msg to) name) | |
61 } | |
62 acc | |
63 } | |
64 } else: { | |
65 acc | |
66 } | |
67 } | |
68 } | |
69 } | |
70 } |