Spaces:
Running
Running
''' | |
ABSTRACT SYNTAX TREE | |
This file contains the Python class that defines the abstract syntax tree (AST) representation. | |
''' | |
class OperatorNode: | |
''' | |
Class to represent operator nodes (i.e., an operator and its operands) as an AST. | |
Args: | |
operator (object): operator object (e.g., Add, Subtract, etc.) | |
children (list): list of children nodes (operands) | |
Example: | |
add_node = OperatorNode(Add(), [IntegerConstant(7), IntegerConstant(5)]) | |
subtract_node = OperatorNode(Subtract(), [IntegerConstant(3), IntegerConstant(1)]) | |
multiply_node = OperatorNode(Multiply(), [add_node, subtract_node]) | |
multiply_node.evaluate() # returns 24 | |
multiply_node.str() # returns "((7 + 5) * (3 - 1))" | |
For variable computation, the input arguments are passed to the evaluate() method. | |
For example, if instead: | |
add_node = OperatorNode(Add(), [IntegerVariable(0), IntegerConstant(5)]) | |
multiply_node.evaluate([7]) # returns 24 | |
''' | |
def __init__(self, operator, children): | |
self.operator = operator # operator object (e.g., Add, Subtract, etc.) | |
self.children = children # list of children nodes (operands) | |
self.weight = operator.weight + sum([child.weight for child in children]) # weight of the program | |
self.type = operator.return_type # return type of the operator object | |
def evaluate(self, input = None): | |
# check arity of operator in AST | |
if len(self.children) != self.operator.arity: | |
raise ValueError("Invalid number of operands for operator") | |
# recursively evaluate the operator and its operands | |
operands = [child.evaluate(input) for child in self.children] | |
return self.operator.evaluate(*operands, input) | |
def str(self): | |
# check arity of operator in AST | |
if len(self.children) != self.operator.arity: | |
raise ValueError("Invalid number of operands for operator") | |
# recursively generate a string representation of the AST | |
operand_strings = [child.str() for child in self.children] | |
return self.operator.str(*operand_strings) |