Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ianj-als/pcl.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/pclc/visitors/symbol_table.py')
-rw-r--r--src/pclc/visitors/symbol_table.py102
1 files changed, 35 insertions, 67 deletions
diff --git a/src/pclc/visitors/symbol_table.py b/src/pclc/visitors/symbol_table.py
index 1e68f80..98492c7 100644
--- a/src/pclc/visitors/symbol_table.py
+++ b/src/pclc/visitors/symbol_table.py
@@ -17,88 +17,56 @@
# along with Pipeline Creation Language (PCL). If not, see <http://www.gnu.org/licenses/>.
#
class SymbolTable(object):
- class Scope(object):
- def __init__(self):
- self.__table = dict()
- self.__nested_scopes = list()
- self.__root = None
-
- def addNestedScope(self, scope):
- scope.__root = self
- return self.__nested_scopes.append(scope)
-
- def getRoot(self):
- return self.__root
-
- def __getitem__(self, key):
- return self.__table[key]
-
- def __setitem__(self, key, value):
- self.__table[key] = value
-
- def __delitem__(self, key):
- del self.__table[key]
-
- def __contains__(self, item):
- return item in self.__table
-
- def __iteritems__(self):
- return self.__table.__iteritems__()
-
- def iterkeys(self):
- return self.__table.iterkeys()
-
- def keys(self):
- return self.__table.keys()
-
- def has_key(self, key):
- return self.__table.has_key(key)
+ def __init__(self):
+ self.__table = dict()
+ self.__nested_scopes = list()
+ self.__parent = None
- def _get_nested_scopes_iter(self):
- return self.__nested_scopes.__iter__()
+ def add_nested_scope(self, scope):
+ scope.__parent = self
+ return self.__nested_scopes.append(scope)
- def __init__(self):
- self.__tree = SymbolTable.Scope()
- self.__current_scope = self.__tree
+ def get_parent(self):
+ return self.__parent
def __getitem__(self, key):
- scope = self.__current_scope
- while scope is not None:
- if scope.has_key(key):
- return scope[key]
- scope.getRoot()
-
- raise KeyError
+ return self.__table[key]
def __setitem__(self, key, value):
- self.__current_scope[key] = value
+ self.__table[key] = value
+
+ def __delitem__(self, key):
+ del self.__table[key]
def __contains__(self, item):
- scope = self.__current_scope
+ scope = self
while scope is not None:
- if item in scope:
+ if item in scope.__table:
return True
- scope = scope.getRoot()
+ scope = scope.__parent
return False
- def push_inner_scope(self):
- scope = SymbolTable.Scope()
- self.__current_scope.addNestedScope(scope)
- self.__current_scope = scope
+ def __iteritems__(self):
+ return self.__table.__iteritems__()
- def pop_inner_scope(self):
- outer_scope = self.__current_scope.getRoot()
- if outer_scope is not None:
- self.__current_scope = outer_scope
+ def iterkeys(self):
+ return self.__table.iterkeys()
+
+ def keys(self):
+ return self.__table.keys()
+
+ def has_key(self, key):
+ return self.__table.has_key(key)
def __str__(self):
disp = lambda s, d: (" " * d) + ("%d : " % d) + ", ".join([str(sym) for sym in s.keys()]) + "\n"
- def trav(s, d):
- rep = disp(s, d)
- for ns in s._get_nested_scopes_iter():
- rep += trav(ns, d + 1)
- return rep
-
- return trav(self.__tree, 0)
+ def trav(st):
+ if st is None:
+ return (0, "")
+
+ depth, result = trav(st.__parent)
+ return (depth + 1, result + disp(st, depth))
+
+ return trav(self)[1]