On this page
15. Interpreter
The Interpreter pattern is a behavioral design pattern that provides a way to evaluate sentences in a language. It is used to interpret expressions and evaluate grammar or language rules. The pattern defines a grammar for the language and provides an interpreter to interpret sentences in that language.
Key Characteristics:
- Grammar Definition: Defines the grammar or rules of the language.
- Interpreter: Provides a way to interpret or evaluate sentences based on the defined grammar.
- Expression Objects: Encapsulates the interpretation logic for different parts of the grammar.
How It Works:
- Context: Holds the information that is required for interpreting the expressions.
- Abstract Expression: Declares an abstract interpret method that will be implemented by concrete expression classes.
- Terminal Expression: Implements the interpret method for terminal symbols in the grammar.
- Non-Terminal Expression: Implements the interpret method for non-terminal symbols and uses other expression objects.
Example in PHP:
// Context
class Context {
private $input;
public function __construct($input) {
$this->input = $input;
}
public function getInput() {
return $this->input;
}
}
// Abstract Expression
interface Expression {
public function interpret(Context $context);
}
// Terminal Expression
class TerminalExpression implements Expression {
private $data;
public function __construct($data) {
$this->data = $data;
}
public function interpret(Context $context) {
return strpos($context->getInput(), $this->data) !== false;
}
}
// Non-Terminal Expression
class NonTerminalExpression implements Expression {
private $expr1;
private $expr2;
public function __construct(Expression $expr1, Expression $expr2) {
$this->expr1 = $expr1;
$this->expr2 = $expr2;
}
public function interpret(Context $context) {
return $this->expr1->interpret($context) && $this->expr2->interpret($context);
}
}
// Client Code
$context = new Context("The quick brown fox jumps over the lazy dog");
$expr1 = new TerminalExpression("quick");
$expr2 = new TerminalExpression("dog");
$nonTerminalExpr = new NonTerminalExpression($expr1, $expr2);
if ($nonTerminalExpr->interpret($context)) {
echo "The context contains both 'quick' and 'dog'.\n";
} else {
echo "The context does not contain both 'quick' and 'dog'.\n";
}
Explanation:
- Context: Context class holds the input that will be interpreted.
- Abstract Expression: Expression interface defines the interpret() method that all concrete expressions must implement.
- Terminal Expression: TerminalExpression class implements the interpret() method to check if a specific terminal symbol is present in the input.
- Non-Terminal Expression: NonTerminalExpression class implements the interpret() method to combine multiple expressions. It uses the AND logical operator in this example.
Benefits:
- Flexibility: Can interpret complex sentences based on defined grammar rules.
- Separation of Concerns: Separates the interpretation logic from the sentence structure.
- Extensibility: New expressions can be added without changing the existing code.
Use Cases:
- Language Parsing: When creating interpreters or compilers for programming languages.
- Expression Evaluation: For evaluating complex expressions based on defined rules.
- Configuration Parsing: Interpreting and processing configuration files or commands.
The Interpreter pattern is useful for creating a language or expression evaluator that adheres to a specific grammar, making it easier to interpret and process sentences or commands in that language.