comparison python/ppci/symboltable.py @ 96:a350055d6119

movage
author windel
date Mon, 24 Dec 2012 13:30:12 +0100
parents python/libs/compiler/symboltable.py@32078200cdd6
children
comparison
equal deleted inserted replaced
95:4a37d6992bd3 96:a350055d6119
1 from .nodes import *
2 from .errors import Error
3
4 class SymbolTable:
5 """
6 Symbol table for a current scope.
7 It has functions:
8 - hasname for checking for a name in current scope or above
9 - addSymbol to add an object
10 """
11 def __init__(self, parent=None):
12 self.parent = parent
13 self.syms = {}
14
15 def __repr__(self):
16 return 'Symboltable with {0} symbols\n'.format(len(self.syms))
17
18 def printTable(self, indent=0):
19 for name in self.syms:
20 print(self.syms[name])
21
22 def getAllLocal(self, cls):
23 """ Get all local objects of a specific type """
24 r = []
25 for key in self.syms.keys():
26 sym = self.syms[key]
27 if issubclass(type(sym), cls):
28 r.append(sym)
29 return r
30
31 def getLocal(self, cls, name):
32 if name in self.syms.keys():
33 sym = self.syms[name]
34 if isinstance(sym, cls):
35 return sym
36 else:
37 Error('Wrong type found')
38 else:
39 Error('Symbol not found')
40
41 # Retrieving of specific classes of items:
42 def get(self, cls, name):
43 if self.hasSymbol(name):
44 sym = self.getSymbol(name)
45 if issubclass(type(sym), cls):
46 return sym
47 raise SymbolException('type {0} undefined'.format(typename))
48
49 def has(self, cls, name):
50 if self.hasSymbol(name):
51 sym = self.getSymbol(name)
52 if issubclass(type(sym), cls):
53 return True
54 return False
55
56 # Adding and retrieving of symbols in general:
57 def addSymbol(self, sym):
58 if sym.name in self.syms.keys():
59 raise Exception('Symbol "{0}" redefined'.format(sym.name))
60 else:
61 self.syms[sym.name] = sym
62
63 def getSymbol(self, name):
64 if name in self.syms.keys():
65 return self.syms[name]
66 else:
67 if self.parent:
68 return self.parent.getSymbol(name)
69 else:
70 Error('Symbol "{0}" undeclared!'.format(name))
71
72 def hasSymbol(self, name):
73 if name in self.syms.keys():
74 return True
75 else:
76 if self.parent:
77 return self.parent.hasSymbol(name)
78 else:
79 return False
80