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]