Skip to content
Snippets Groups Projects
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)