Interpreter

Interpreter
Información sobre la plantilla
UMLClassDiagram02.gif
Concepto:Define una representación para su gramática junto con su intérprete.


Interpreter El patrón de diseño Interpreter dado un lenguaje, define una representación para su gramática junto con su intérprete que usa dicha representación para interpretar sentencias en ese lenguaje.

Como usarlo

  • Principalmente, cuando haya un lenguaje que interpretar y sus diferentes construcciones puedan representarse mediante árboles sintácticos abstractos. Da sus mejores resultados cuando la gramática es simple (con gramáticas complejas la jerarquía de clases se hace inmanejable y es mejor usar generadores automáticos de analizadores sintácticos) y la eficiencia no es una cuestión vital (existen formas más eficientes de interpretar, usando máquinas de estado finitas en lugar de árboles sintácticos).

Ventajas

  • Facilidad para cambiar o extender la gramática, mediante herencia, dado que las diferentes reglas de la gramática se representan con clases.
  • Facilidad para implementar la gramática, dado que las implementaciones de las clases nodo del árbol sintáctico son similares, pudiendo usarse para ello generadores automáticos de código.
  • Facilidad para introducir nuevas formas de interpretar las expresiones en la gramática (tener en cuenta el patrón Visitante).

Inconvenientes

  • Limitación en el tipo de gramáticas (y, por extensión, de problemas) para los que sirve esta aproximación: simples y sin grandes necesidades de eficiencia. Aunque el uso de otros patrones puede mitigar este problema, hay circunstancias en que un Intérprete no es lo más apropiado.

Relacionado con

  • Considerado en su forma más general (una operación distribuida sobre una jerarquía de clases basada en el patrón Composición), prácticamente toda aparición de éste lleva unida la de un Intérprete. Pero es una cuestión de perspectiva (subjetiva) la que nos lleva a plantearnos un Intérprete sólo cuando la jerarquía de clases (árbol sintáctico) define un lenguaje.
  • PesoMosca ofrece una forma de compartir los símbolos terminales del árbol sintáctico.
  • El Intérprete puede usar un Iterador para recorrer la estructura.
  • Visitante puede servir para mantener el comportamiento de cada nodo del árbol sintáctico abstracto en una sola clase.

Otros aspectos de interés

  • Si un tipo particular de problemas se presenta frecuentemente, puede ser provechoso expresar los diferentes casos del problema como sentencias de un lenguaje simple. Se puede, entonces, construir un intérprete que resuelva el problema interpretando dichas sentencias.
  • Si es frecuente la creación de nuevos intérpretes o de nuevas formas de “interpretar” es mejor tener un Visitante, donde poner la operación a realizar fuera de la estructura de árbol.
  • El Cliente construye (o recibe) una estructura de instancias de Expresiones terminales y Expresiones no terminales, ensambladas para formar un árbol sintáctico que representa la sentencia que se quiere interpretar, mientras que el Contexto contiene información global para el intérprete.
  • A pesar de la similitud de la estructura de este patrón con la del patrón Composición hay sus diferencias, como que al Intérprete no le interesa como se construye el árbol sintáctico (eso es cosa del Cliente o de quien sea).
  • Aunque la operación estrella es Interpretar, un Intérprete puede ser utilizado para realizar otra serie de operaciones sobre las sentencias de un lenguaje.

Fuentes