Exemplo n.º 1
0
    def Evaluate(self, st):

        new_st = SymbolTable(st)
        get_node = st.getter(self.value)
        node = get_node[0]
        func_void = get_node[1]

        if func_void == "FUNCTION":
            new_st.declare(node.children[0][0], node.children[0][1])

        if node.children:
            if len(self.children) > len(node.children[1]):
                raise ValueError(f"Too many arguments in {self.value}")

            if len(self.children) < len(node.children[1]):
                raise ValueError(f"missing arguments in {self.value}")

        for i in range(len(node.children[1])):
            new_st.create(node.children[1][i][0],
                          self.children[i].Evaluate(st),
                          node.children[1][i][1])

        for child in node.children[2]:
            child.Evaluate(new_st)

        if func_void == "FUNCTION":
            return_value = new_st.getter(self.value)
            # print(return_value)

            #if the type match
            if return_value[1] == node.children[0][1]:
                return return_value[0]