CODESAMPLE

Interpreter - Python

Share on:

The Interpreter pattern defines a way to evaluate a language, a simple grammar, or a sequence of commands. It’s useful when you need to parse and execute expressions dynamically. This implementation defines a simple arithmetic expression interpreter with classes for terminals (numbers) and non-terminals (addition/subtraction expressions). The evaluate() method in each class is the core of the interpretation process. Python’s dynamic typing and use of classes makes it a natural fit, and the clear separation of expression components aligns well with Pythonic object-oriented principles.

# interpreter.py

class Node:
    """Base class for all nodes in the interpreter."""
    def evaluate(self, context=None):
        pass

class Number(Node):
    """Represents a number (terminal node)."""
    def __init__(self, value):
        self.value = value

    def evaluate(self, context=None):
        return self.value

class Add(Node):
    """Represents an addition expression (non-terminal node)."""
    def __init__(self, left, right):
        self.left = left
        self.right = right

    def evaluate(self, context=None):
        return self.left.evaluate(context) + self.right.evaluate(context)

class Subtract(Node):
    """Represents a subtraction expression (non-terminal node)."""
    def __init__(self, left, right):
        self.left = left
        self.right = right

    def evaluate(self, context=None):
        return self.left.evaluate(context) - self.right.evaluate(context)


# Example Usage
if __name__ == "__main__":
    # (1 + 2) - 3
    expression = Subtract(
        Add(Number(1), Number(2)),
        Number(3)
    )

    result = expression.evaluate()
    print(f"Result: {result}")  # Output: Result: 0

    # 5 - (2 + 1)
    expression2 = Subtract(
        Number(5),
        Add(Number(2), Number(1))
    )
    result2 = expression2.evaluate()
    print(f"Result: {result2}") # Output: Result: 2