A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Padrão de Projeto Interpreter

Apresentações semelhantes


Apresentação em tema: "Padrão de Projeto Interpreter"— Transcrição da apresentação:

1 Padrão de Projeto Interpreter
Kleinner Farias © LES/PUC-Rio

2 Agenda Propósito/Intenção Motivação Exemplo Aplicabilidade Estrutura
Participantes Conseqüências Implementação © LES/PUC-Rio

3 Afinal, qual é o propósito do Interpreter?
Intenção Afinal, qual é o propósito do Interpreter? - Dada uma linguagem, definir uma representação para a sua gramática juntamente com um interpretador que usa representação para interpretar sentenças da linguagem. Interpreter descreve como definir uma gramática para linguagens simples, representar sentenças e interpretar estas sentenças. © LES/PUC-Rio

4 Motivação Quando devemos usar o padrão Interpreter? - Se um tipo específico de problema ocorre com freqüência suficiente, pode valer a pena expressar instâncias do problema como sentenças de uma linguagem simples. Alguns Problemas: Use o Padrão Interpreter. Como irei trabalhar com patterns of strings? Algorítmos de busca podem interpretar uma expressão regular que especifica um conjunto de cadeias a serem encontrados. Como irei fazer pesquisa de caracteres? © LES/PUC-Rio

5 Motivação O Interpreter analisa o problema dividindo-o em pequenos pedaços, e então coloca os pedaços de volta juntos, como uma sentença numa linguagem simples. Pattern matching – pesquisar cadeias de caracteres que correspondem a um determinado padrão. Pattern of strings – expressões regulares Match – algoritmo de busca © LES/PUC-Rio

6 Exemplo BooleanExp ::= VariableExp | Constant | OrExp | AndExp | NotExp | '(' BooleanExp ')' AndExp ::= BooleanExp 'and' BooleanExp OrExp ::= BooleanExp 'or' BooleanExp NotExp ::= BooleanExp 'not' BooleanExp Constant ::= 'true' | 'false' VariableExp ::= 'A' | 'B' | ... | 'Z‘ Onde temos: - Símbolos não-terminais: BooleanExp, AndExp, OrExp, NotExp. - Símbolos terminais: Constant, VariableExp © LES/PUC-Rio

7 Aplicabilidade Quando houver uma linguagem para interpretar e seja possível representar sentenças da linguagem como árvores sintéticas abstratas. Quando ele funciona melhor? - A gramática é simples. - A eficiência não é uma preocupação crítica. © LES/PUC-Rio

8 Estrutura © LES/PUC-Rio

9 Participantes AbstractExpression – declara uma operação que será comum a todos os nós na árvore sintática abstrata. TerminalExpression – implementa operações definidas na AbstractExpression NonTerminalExpression - para cada regra da gramática é necessário um NonTerminalExpression. - mantém variáveis de instância do tipo AbstratctExpression. - implementa uma operação Interpret. Context - contém informação que é global para o interpretador. Client – contrói ou recebe um árvore sintática. © LES/PUC-Rio

10 Conseqüências Facilidade de mudar e estender gramática – usa classe para representar regras da gramática. Implementar a gramática também é fácil – os “nodos” da árvore são implementados de uma maneira similar. Gramáticas complexas são difíceis de manter – para cada regra da gramática é definido uma classe. Acrescentando novas formas de interpretar expressões – torna mais fácil resolver uma expressão de uma nova maneira. © LES/PUC-Rio

11 Implementação Criação da árvore sintática abstrata – o padrão não define como criar a árvore sintática abstrata. Compartilhando símbolos terminais com o padrão FlyWeight – compartilhamento de símbolos terminais usando o padrão FlyWeight. Flexibilidade – as classes podem ser alteras e modificadas facilmente. © LES/PUC-Rio

12 Implementação © LES/PUC-Rio 12

13 Implementação public class Context {
private Hashtable context = new Hashtable(); public void assign(String name, boolean val) { context.put(name, new Boolean(val)); } public boolean lookUp(String name) { return ((Boolean)context.get(name)).booleanValue(); public Context() { public interface BooleanExp { public abstract boolean evaluate( Context c ); public abstract BooleanExp replace(String var, BooleanExp exp); public abstract BooleanExp copy(); } © LES/PUC-Rio 13

14 Implementação public class AndExp implements BooleanExp {
private BooleanExp operand1; private BooleanExp operand2; public andExp (BooleanExp oper1, BooleanExp oper2) { operand1 = oper1; operand2 = oper2; } public boolean evaluate(Context c) { return operand1.Evaluate(c) && operand2.Evaluate(c); public BooleanExp copy() { return new AndExp(operand1.Copy(), operand2.Copy()); public BooleanExp replace(String var, BooleanExp exp) { return new AndExp( operand1.Replace(var, exp), operand2.Replace(var, exp) ); © LES/PUC-Rio 14

15 Implementação public class VariableExp implements BooleanExp {
private String name; public VariableExp(String _name) { name = _name; } public boolean evaluate(Context c) { return c.LookUp(name); public BooleanExp copy() { return new VariableExp(name); public BooleanExp replace(String var, BooleanExp exp) { if(var.equals(name)) { return exp.Copy(); } else { © LES/PUC-Rio 15

16 Implementação public class Test {
public static void main(String[] args) { // Test : // (true and x) or (y and (not x)) Context context = new Context(); VariableExp x = new VariableExp("X"); VariableExp y = new VariableExp("Y"); VariableExp bTure = new VariableExp("true"); VariableExp bFalse = new VariableExp("false"); context.Assign("true", true); context.Assign("false", false); context.Assign("X", true); context.Assign("Y", true); BooleanExp expression = new orExp( new AndExp(bTure, x), new AndExp(y, new NotExp(x)) ); boolean result = expression.evaluate(context); System.out.println("The result is:" + result); } © LES/PUC-Rio 16


Carregar ppt "Padrão de Projeto Interpreter"

Apresentações semelhantes


Anúncios Google