# HG changeset patch # User Michael Pavone # Date 1406321203 25200 # Node ID aea99b93cf2f43e2ddb1d12891a6a33afe1b095c # Parent 5d24b3117aa7a8700dd007c594a7adb95d50747b More fleshed out implementation of symbol tables diff -r 5d24b3117aa7 -r aea99b93cf2f modules/symbols.tp --- a/modules/symbols.tp Fri Jul 25 13:43:36 2014 -0700 +++ b/modules/symbols.tp Fri Jul 25 13:46:43 2014 -0700 @@ -3,6 +3,9 @@ find:else <- :_ :else { else: } + ifDefined:else <- :name ifdef :else { + else: + } } _local <- 0 _closedover <- 1 @@ -19,17 +22,63 @@ name <- { _name } id <- { _id } string <- { "method " . _name . "(" . _id . ")" } + isMethod? <- { true } + isLocal? <- { false } + } + } + _local <- :_name _def { + #{ + name <- { _name } + string <- { "local " . _name } + def <- { _def } + isMethod? <- { false } + closedOver? <- false + isLocal? <- { true } + } + } + _upvar <- :parent { + if: (parent isLocal?) { + parent closedOver?!: true + #{ + name <- { parent name } + def <- { parent def } + closedOver? <- { parent closedOver? } + isMethod? <- { parent isMethod? } + string <- { "upvar " . name} + isLocal? <- { false } + depth <- 1 + } + } else: { + parent depth!: (parent depth) + 1 } } #{ nullTable <- { _null } - tablewithParent <- :_parent { + tableWithParent <- :_parent { _symbols <- dict hash #{ + ifDefined:else <- :name ifdef :else { + _symbols ifget: name :sym { + ifdef: sym + } else: { + _parent ifDefined: name :sym { + ifdef: (_upvar: sym) + } else: else + } + } find:else <- :name :else { _symbols get: name else: { - _parent find: name else: else + _parent ifDefined: name :sym { + if: (sym isMethod?) { + //TODO: methods on parent objects + sym + } else: { + _upvar: sym + } + } else: { + else: + } } } defineMethod <- :name { @@ -38,6 +87,16 @@ } self } + define <- :name def { + s <- (_local: name def) + _symbols set: name s + s + } + find:elseDefine <- :name :def { + find: name else: { + define: name def + } + } print <- { foreach: _symbols :name info { print: name . ": " . info . "\n" @@ -47,7 +106,7 @@ } table <- { - tablewithParent: _null + tableWithParent: _null } buildMethodTable <- :tree {