Defines a grammar and an interpreter that processes sentences in that grammar.
Useful for simple DSLs or expression evaluation.
abstract class Expression {
int interpret();
}
class Number implements Expression {
final int value;
Number(this.value);
@override
int interpret() => value;
}
class Add implements Expression {
final Expression left, right;
Add(this.left, this.right);
@override
int interpret() => left.interpret() + right.interpret();
}
class Multiply implements Expression {
final Expression left, right;
Multiply(this.left, this.right);
@override
int interpret() => left.interpret() * right.interpret();
}
// Usage: (3 + 5) * 2
final expr = Multiply(Add(Number(3), Number(5)), Number(2));
print(expr.interpret()); // 16