Mercurial > repos > tabletprog
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/modules/symbols.tp Sat May 10 19:11:01 2014 -0700 @@ -0,0 +1,70 @@ +{ + _null <- #{ + find:else <- :_ :else { + else: + } + } + _local <- 0 + _closedover <- 1 + _upvar <- 2 + _method <- 3 + _self <- 4 + _parent <- 5 + + _nextMethodId <- 0 + _method <- :_name { + _id <- _nextMethodId + _nextMethodId <- _id + 1 + #{ + name <- { _name } + id <- { _id } + string <- { "method " . _name . "(" . _id . ")" } + } + } + #{ + nullTable <- { _null } + + tablewithParent <- :_parent { + _symbols <- dict hash + #{ + find:else <- :name :else { + _symbols get: name else: { + _parent find: name else: else + } + } + defineMethod <- :name { + _symbols get: name else: { + _symbols set: name (_method: name) + } + self + } + print <- { + foreach: _symbols :name info { + print: name . ": " . info . "\n" + } + } + } + } + + table <- { + tablewithParent: _null + } + + buildMethodTable <- :tree { + _object <- ast obj + _assignment <- ast assignment + tree fold: table with: :acc el { + if: (el nodeType) = _object { + (el messages) fold: acc with: :acc msg { + if: (msg nodeType) = _assignment { + acc defineMethod: ((msg to) name) + } + acc + } + } else: { + acc + } + } + } + } +}