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

  1. Facilità nel cambiare ed estendere la grammatica
  2. Facilità nell'implementare la grammatica
  3. Le grammatiche complesse sono difficili da mantenere
  4. 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:
  1. Creazione dell'albero sintattico astratto
  2. Definizione del metodo Interpret
  3. 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