Pattern Interpreter
Pattern Name
Interpreter
Intent
Dato un lingiaggio, definisce una rappresentazione per la sua grammatica e un interprete che usi la grammantica per interpretare le proposizioni del linguaggio.
Also Known As
-
Motivation (Forces)
Se un problema si presenta spesso, forse è utile definire un linguaggio per risolverlo.
Applicability
Il pattern viene usato quando si ha un linguaggio da interpretare ed è possibile rappresentare le proposizioni del linguaggio come alberi sintattici astratti.
Il pattern interpreter assolverà al meglio al suo scopo quando:
- La grammatica è semplice (per grammatiche complesse dei generatori di analizzatori grammaticali)
- L'efficienza non è un aspetto critico. Spesso è più "performante" passare attraverso altre forme (tipo macchine a stati)
Structure
Participants
-
AbstractExpression - definisce il metodo astratto
Interpret comune a tutti i nodi dell'albero sintattico astratto.
-
TerminalExpression - Implementa il metodo
Interpret associato ai simboli terminali della gramamtica. E' necessaria un'istanza per ogni simbolo terminale in una proposizione.
-
NonTerminalExpression - E' necessaria una classe per ogni regola della gramatica. Contiene un riferimento alle istanza di ogni simbolo definito nella regola. Implementa il metodo
Interpret per i simboli non terminali della grammatica. Il metodo chiama se stesso ricorsivamente sui riferimenti ai simboli definiti nella regola.
-
Context - contiene le informazioni comuni all'interprete.
-
Client - Costruisce un albero sintattico astratto che rappresenta una particlare proposizione nel linguaggio che la grammatica descrive. L'albero sintattico astratto è costruito con istanza delle classi
NonTerminalExpression e TerminalExpression. Invoca il metodo Interpret.
Collaboration
Consequences
- Facilità nel cambiare ed estendere la grammatica
- Facilità nell'implementare la grammatica
- Le grammatiche complesse sono difficili da mantenere
- Aggiungere nuovi modi per interpretare le espressioni
Implementation
Il pattern Interpreter ha molti punti in comune con il
Pattern Composite. Gli aspetti sequenti sono specifici dell'Interpreter:
- Creazione dell'albero sintattico astratto
- Definizione del metodo Interpret
-
Condivisione dei simboli terminali tramite l'uso del pattern Flyweight
Sample Code
Known Uses
- Compilatori per lingaggi ad oggetti
- Quasi ogni uso del pattern Composite conterrà un Interpreter
Related Patterns
- Composite
- Flyweight
- Iterator
- Visitor