Mercurial > lcfOS
view python/libs/compiler/symboltable.py @ 71:5351594349b0
Moved error to core
author | windel |
---|---|
date | Fri, 02 Nov 2012 14:05:00 +0100 |
parents | 32078200cdd6 |
children |
line wrap: on
line source
from .nodes import * from .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