# AST.py
# Stephanie Taylor
# Definitions for nodes of Abstract Syntax Tree
# For a language with dynamic typing, no side effects, and only one scope
# Note: this version if for Expressions only (no statements)

# Abstract syntax 
# 
# Expression = BinaryExpression | Identifier | Value
# BinaryExpression = string op (+,-,*,/,<,>,==,!=,AND,OR), Expression left, Expression right
# Variable = string name
# Value = a literal integer or boolean

class BinaryExpression:
    def __init__( self, left, operator, right ):
        self.left = left
        self.operator = operator
        self.right = right
        
    def printTree( self, spaces ):
        print( spaces + "Binary Operation: " + self.operator )
        self.left.printTree( spaces + "  " )
        self.right.printTree( spaces + "  " )

class Variable:
    def __init__( self, name ):
        self.name = name
        
    def printTree( self, spaces ):
        print( spaces + "Id: " + self.name )
        
class Value:
    def __init__( self, value ):
        self.value = value # should be a boolean or integer
        
    def printTree( self, spaces ):
        if self.value is True or self.value is False:
            print( spaces + "Bool: " + str(self.value) )
        else:
            print( spaces + "Int: " + str(self.value) )

    def __str__( self ):
        return str(self.value)
                                        
