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 }