La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

César Estéban Castañeda Luis Andrés Almanza

Presentaciones similares


Presentación del tema: "César Estéban Castañeda Luis Andrés Almanza"— Transcripción de la presentación:

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

2 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)

3 UML “Interpreter”

4 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.

5 Ejemplo Notación Polaca Inversa

6 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); }

7 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 ); }

8 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();

9 Ejemplo IV class InterpreterExample {
public static void main(String[] args) { String expression = " "; Parser p = new Parser(expression); System.out.println("'" + expression +"' equals " + p.evaluate()); }

10 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.

11 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.

12 Referencias http://www.dofactory.com/Patterns/PatternInterpreter.asp x
erpreter.pdf


Descargar ppt "César Estéban Castañeda Luis Andrés Almanza"

Presentaciones similares


Anuncios Google