Páginas

viernes, 20 de diciembre de 2013

Patrón Interpreter. Ejemplo Evaluador de Expresiones Notación Polaca Inversa



Patrón Interpreter:

 Ejemplo Evaluador de Expresiones en Notación Polaca Inversa



Este patrón es un caso especial de “Composite”, aplicado al parseo. El parseo transforma una entrada de texto en una estructura de datos (usualmente un árbol) que es apropiada para ser procesada. Generalmente los parseadores primero identifican los símbolos de la entrada y luego construyen el árbol de parseo para esos símbolos. 
Dado un lenguaje, el patrón “Interpreter” define una representación para su gramática y un intérprete para su lenguaje. Se emplea para definir un lenguaje para definir expresiones regulares que representen cadenas a buscar dentro de otras cadenas. Utiliza una clase para representar cada regla gramática.



En el mundo real, los lenguajes están formados por expresiones no terminales que contienen construcciones terminales dentro. Encontramos el patrón “Interpreter” a la hora de analizar esas expresiones.
Este patrón se debe utilizar cuando hay un lenguaje que interpretar y se puede interpretar sus palabras como árboles sintácticos abstractos. Para ello, la gramática debe ser simple.

Ejemplo de árbol sintáctico abstracto:
Árbol de sintaxis abstracta para el siguiente código del algoritmo de Euclides:
while b ≠ 0
if a > b
a := a − b
else
b := b − a
return a
Esquema UML del patrón:

AbstractExpression: declara una interfaz para la ejecución de una operación.
TerminalExpression: implementa una operación asociada con los símbolos terminales de la gramática
NonterminalExpression: implementa una operación de interpretación asociada con los símbolos no terminales de la gramática.
Context: contiene información global para el interprete.
Client: construye un árbol sintáctico abstracto que representa una sentencia particular en el lenguaje que la gramática define. El cliente construye una expresión

Ventajas:

  • Facilidad para cambiar la gramática, mediante herencia, dado que las diferentes reglas se representan con objetos.
  • 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.


Desventajas:

  • Limitación en el tipo de gramática: si no es simple, es casi imposible implementarlo.
  • No es conveniente utilizarlo si la eficiencia es un punto clave.


Ejemplo:  Evaluador de Expresiones. Ejemplo de la wikipedia ampliado
Se trata de evaluar expresiones matemáticas en notación polaca  inversa ( wikipedia  ). Vamos a tener encuenta las operaciones suma, resta, multiplicación y division. Ademas, si se produce algún error al analizar la expresión,  devolverá información sobre el, para que el usuario pueda modificar la expresion.
Proyecto:


Clase Expresion:
Va ha ser el interfase usado por las operaciones y numeros
->

Clase TerminalExpresion_Plus (operador suma)
->

Clase TerminalExpresion_Minus (operador resta )
->

Clase TerminalExpresion_Multi  (operador multiplicacion)
->
Clase TerminalExpresion _Div (operador  divisor)
->

Clase TerminalExpresion_Number (numero decimal)
->

Clase Parser:
Se encarga de recibir la expresion, construir el arbol y evaluar dicho arbol retornando informacion del valor o error producido
->

Clase Fmain: Programa principal
Formulario en pantalla, que rellenar el textbox con una expresion y pulsar el boton "Evaluar", se encarga de mostrar la información.
->

Captura de la aplicación ejecutandose:





Enlace de Descarga: enlace



Fuentes:
http://es.wikipedia.org/wiki/Interpreter_(patr%C3%B3n_de_dise%C3%B1o)
http://www.godtic.com/blog/2012/11/15/patrones-de-diseno-gof/
http://migranitodejava.blogspot.com.es/search/label/Interpreter
http://www.oodesign.com/interpreter-pattern.html
http://ldc.usb.ve/~mgoncalves/IS2/sd07/grupo6.pdf
http://www.blackwasp.co.uk/Interpreter.aspx
http://sourcemaking.com/design_patterns/interpreter/cpp/1