Mercurial > lcfOS
view python/ks/symboltable.py @ 176:5fd02aa38b42
Added while loop code generation
author | Windel Bouwman |
---|---|
date | Sat, 20 Apr 2013 12:00:51 +0200 |
parents | 91af0e40f868 |
children | e9b27f7193e3 |
line wrap: on
line source
from .nodes import * from ...core.errors import Error class SymbolTable: """ Symbol table for a current scope. It has functions: - hasname for checking for a name in current scope or above - addSymbol to add an object """ def __init__(self, parent=None): self.parent = parent self.syms = {} def __repr__(self): return 'Symboltable with {0} symbols\n'.format(len(self.syms)) def printTable(self, indent=0): for name in self.syms: print(self.syms[name]) def getAllLocal(self, cls): """ Get all local objects of a specific type """ r = [] for key in self.syms.keys(): sym = self.syms[key] if issubclass(type(sym), cls): r.append(sym) return r def getLocal(self, cls, name): if name in self.syms.keys(): sym = self.syms[name] if isinstance(sym, cls): return sym else: Error('Wrong type found') else: Error('Symbol not found') # Retrieving of specific classes of items: def get(self, cls, name): if self.hasSymbol(name): sym = self.getSymbol(name) if issubclass(type(sym), cls): return sym raise SymbolException('type {0} undefined'.format(typename)) def has(self, cls, name): if self.hasSymbol(name): sym = self.getSymbol(name) if issubclass(type(sym), cls): return True return False # Adding and retrieving of symbols in general: def addSymbol(self, sym): if sym.name in self.syms.keys(): raise Exception('Symbol "{0}" redefined'.format(sym.name)) else: self.syms[sym.name] = sym def getSymbol(self, name): if name in self.syms.keys(): return self.syms[name] else: if self.parent: return self.parent.getSymbol(name) else: Error('Symbol "{0}" undeclared!'.format(name)) def hasSymbol(self, name): if name in self.syms.keys(): return True else: if self.parent: return self.parent.hasSymbol(name) else: return False