@startuml

note "Primary setup." as N1
note "Design motivator: Interpreter Pattern.  \nContent motivator: Translated from a BNF representation." as N2
'note " Backus-Naur Form (BNF) for a Formula tree\n \n <Formula> ::= <Node>\n <Node> ::= <Function> | <Terminal>\n \n <Function> ::= <BinaryFunction> | UnaryFunction\n <BinaryFunction> ::= <Node> <BinaryOperator> <Node>\n <UnaryFunction> ::= <UnaryOperator> (<Node>) \n  <BinaryOperator> ::= "+", "-", "*" (user defined)\n <UnaryOperator> ::= "SIN" | "COS" | "LOG" | ... (Defined in the Determinants)\n \n <Terminal> ::= <Number> | <Variable>\n <Variable> ::= "A"...\n <Number> ::= N * (0|1|2|3|4|5|6|7|8|9)" as N3

abstract class Expression {
    interpret(Context)
}

class Context {
    set_output(outp)
    get_output(): outp
}

class Formula {
    _node = Node
    interpret(Context)
}
Formula .. N1
Expression <|-- Formula

abstract class Node {
}
Expression <|-- Node


abstract class Function {
}
Node <|-- Function

abstract class Terminal {
}
Node <|-- Terminal


class BinaryFunction {
    _binary_op
    _node1
    _node2
    interpret(Context)
}
Function <|-- BinaryFunction

class UnaryFunction {
    _unary_op
    _node1
    interpret(Context)
}
Function <|-- UnaryFunction

class Number {
    _number
    interpret(Context)
}
Terminal <|-- Number

class Variable {
    _variable
    interpret(Context)
}
Terminal <|-- Variable




@enduml