MemberNodes.py 3.04 KiB
from AST import ASTNode, getParseTreeNodes, getTypeName
from LineNodes import ExprNode, BlockNode
# field
class FieldNode(ASTNode):
# always list all fields in the init method to show the class structure
def __init__(self, parseTree):
self.parseTree = parseTree
self.name = ''
self.fieldType = ''
self.fieldInit = None
self.mods = []
self.isPrimType = False # easy boolean flag, can be optimize later
self.env = None
self.children = []
for node in parseTree.children:
if node.name == 'methodMod':
for m in node.children:
self.mods.append(m.lex)
elif node.name == 'type':
self.isPrimType, self.fieldType = getTypeName(node)
elif node.name == 'variableDcl':
nameNodes = getParseTreeNodes(['ID', 'COMPID'], node, ['variableInit'])
for n in nameNodes:
self.name = n.lex
nameNodes = getParseTreeNodes(['variableInit'], node)
for n in nameNodes:
self.fieldInit = ExprNode(n)
if self.fieldInit: self.children.append(self.fieldInit)
###########################################################
# method
class MethodNode(ASTNode):
# always list all fields in the init method to show the class structure
def __init__(self, parseTree):
self.parseTree = parseTree
self.name = ''
self.methodType = ''
self.params = {} # a dictionary {paramName -> (isPrimType, typeName)}, after type linking: {paramName -> typeNode}
self.mods = []
self.body = None
self.isPrimType = False # easy boolean flag, can be optimize later
self.env = None
self.children = []
# get method name
nameNodes = getParseTreeNodes(['ID'], parseTree, ['params', 'type', 'methodBody'])
for n in nameNodes:
self.name = n.lex
nameNodes = getParseTreeNodes(['param'], parseTree, ['methodBody'])
for n in nameNodes:
paramName = ''
paramType = ''
for c in n.children:
if c.name == 'type':
paramType = getTypeName(c)
elif c.name == 'ID':
paramName = c.lex
self.params[paramName] = paramType
nameNodes = getParseTreeNodes(['type', 'VOID'], parseTree, ['methodBody', 'params'])
for n in nameNodes:
if n.name == 'VOID':
self.isPrimType = True
self.methodType = n.lex
else:
self.isPrimType, self.methodType = getTypeName(n)
for node in parseTree.children:
if node.name == 'methodMod':
for m in node.children:
self.mods.append(m.lex)
elif node.name == 'methodBody':
nameNodes = getParseTreeNodes(['block'], node)
for n in nameNodes:
self.body = BlockNode(n)
if self.body: self.children.append(self.body)