Patrón “Interpreter” César Estéban Castañeda Luis Andrés Almanza.

12
Patrón “Interpreter” César Estéban Castañeda Luis Andrés Almanza

Transcript of Patrón “Interpreter” César Estéban Castañeda Luis Andrés Almanza.

Page 1: Patrón “Interpreter” César Estéban Castañeda Luis Andrés Almanza.

Patrón “Interpreter”

César Estéban CastañedaLuis Andrés Almanza

Page 2: Patrón “Interpreter” César Estéban Castañeda Luis Andrés Almanza.

Propósito del Patrón “Interpreter”

Definir la representación de una gramática de un lenguaje, junto con su interprete.

(Lenguajes de Programación)

Page 3: Patrón “Interpreter” César Estéban Castañeda Luis Andrés Almanza.

UML “Interpreter”

Page 4: Patrón “Interpreter” César Estéban Castañeda Luis Andrés Almanza.

Componentes del patrón “Interpreter”

AbstractExpression: Declara una interfaz para ejecutar una operación.

TerminalExpression: Implementa una operación asociada a un símbolo terminal en la gramática del lenguaje.

NonterminalExpression: Implementa una operación para un símbolo no terminal. Esta expresión normalmente hace llamadas recursivas a si misma.

Context: Contiene la información global a el interprete. Client:

Construye y/o envía una abstracción de la representación del árbol representando un ejemplo de la gramática del lenguaje, este compone de expresiones terminales y no terminales.

Ejecuta la operación del interprete.

Page 5: Patrón “Interpreter” César Estéban Castañeda Luis Andrés Almanza.

Ejemplo Notación Polaca Inversa

Page 6: Patrón “Interpreter” César Estéban Castañeda Luis Andrés Almanza.

Ejemplo I interface Expression {

public void interpret(Stack<Integer> s);

}

class TerminalExpression_Number implements

Expression {

private int number;

public TerminalExpression_Number(int number) { this.number = number; }

public void interpret(Stack<Integer> s) { s.push(number); }

}

Page 7: Patrón “Interpreter” César Estéban Castañeda Luis Andrés Almanza.

Ejemplo II class TerminalExpression_Plus implements

Expression { public void interpret(Stack<Integer> s)

{ s.push( s.pop() + s.pop() ); }} class TerminalExpression_Minus implements

Expression { public void interpret(Stack<Integer> s) { int

tmp = s.pop(); s.push( s.pop() - tmp ); }}

Page 8: Patrón “Interpreter” César Estéban Castañeda Luis Andrés Almanza.

Ejemplo III class Parser { private ArrayList<Expression> parseTree = new

ArrayList<Expression>(); public Parser(String s) { for (String token : s.split(" ")) { if (token.equals("+")) parseTree.add( new

TerminalExpression_Plus() ); else if (token.equals("-")) parseTree.add( new

TerminalExpression_Minus() ); else parseTree.add( new

TerminalExpression_Number(Integer.valueOf(token)) ); } } public int evaluate() { Stack<Integer> context = new Stack<Integer>(); for (Expression e : parseTree) e.interpret(context); return context.pop(); }}

Page 9: Patrón “Interpreter” César Estéban Castañeda Luis Andrés Almanza.

Ejemplo IV class InterpreterExample { public static void main(String[] args) { String expression = "42 2 1 - +"; Parser p = new Parser(expression); System.out.println("'" + expression +"'

equals " + p.evaluate()); }}

Page 10: Patrón “Interpreter” César Estéban Castañeda Luis Andrés Almanza.

Ventajas del patrón “Interpreter” Fácil de extender y cambiar la gramática de

un lenguaje, aprovechando la herencia. La implementación de gramática nueva es

sencilla, las clases son fáciles de escribir. Añadir nuevas forma de interpretar las

expresiones es sencillo.

Page 11: Patrón “Interpreter” César Estéban Castañeda Luis Andrés Almanza.

Desventajas del patrón “Interpreter” El patrón no explica como crear el árbol

sintáctico. Las gramáticas complejas son difíciles de

mantener, esto a causa de que la jerarquía de clases se volvería virtualmente inmanejable.

La eficiencia del interprete es menor a la de otros métodos; si se necesita velocidad de procesamiento es mejor utilizar otros mecanismos que solución estos problemas.

Page 12: Patrón “Interpreter” César Estéban Castañeda Luis Andrés Almanza.

Referencias http://www.dofactory.com/Patterns/PatternInte

rpreter.aspx http://kybele.escet.urjc.es/documentos/SI/Patr

ones/12_Interpreter.pdf http://en.wikipedia.org/wiki/Interpreter_patter

n