Padrão de Projeto Interpreter

Slides:



Advertisements
Apresentações semelhantes
Avaliador de Expressões
Advertisements

Estruturas de Repetição
Paulo Marques Hernâni Pedroso
Classes Abstratas e Interfaces
Modificadores Marco Antonio. Introdução Em todas as linguagens de programação o acesso a classes/métodos deve seguir algumas regras.
Chain of Responsibility
Projeto de Sistemas de Software
Projeto de Sistemas de Software
Projeto de Sistemas de Software
Projeto de Sistemas de Software Trabalho de Padrões de Projeto
Projeto de Sistemas de Software Kelly Leal Leandra Mara da Silva
Strategy Projeto de Sistemas de Software
Padrões de Projeto Prototype.
Design Patterns Interpreter
Juliana França Santos Aquino
Kleinner Farias e Raphael do Vale
Padrão de Projeto Iterator
Projeto de Sistemas de Software Leandra Mara da Silva
Linguagens de Programação Orientadas a Objetos
Generalização, Especialização e Conceitos
Programação Básica em Java
Padrões GoF - Strategy.
Animador para a Linguagem Funcional 2 Carlos Eduardo Lima Lucas Roberto Bechert Schmitz Leonardo Lucena.
Walfredo Cirne walfredo.dsc.ufpb.br
Polimorfismo e Classes Abstratas Profa
Linguagem PHP Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Wagner Santos C. de Jesus
JAVA ENUMS © 2009 by Jorge L. de Souza Leão março de 2009 PEE - COPPE/UFRJ.
UMA ABORDAGEM SOBRE ORIENTAÇÃO A OBJETOS!
Paradigmas de Linguagens de Programação Paradima da Programação Orientada à Objetos Professor: Armando Hage Belém-2008.
CRIANDO OBJETOS EM JAVA
Concorrência em Java Threads em Java.
Programação Orientada a Objetos com Java
Professor: Hyggo Almeida
Análise léxica e sintática
Nazareno Andrade (baseado no material de Hyggo Almeida)
Padrão de Projeto Visitor
Gramáticas Livres de Contexto
Atributos, Encapsulamento e Interface em Java
Chamada Remota de Procedimentos
OPERADORESOPERADORES SCJP – Otimize-TI. Operadores Java Resultado: Maioria das operações é um booleano ou numérico. Não podem ser sobrecarregados (Existem.
Estudo de Caso: um editor de documentos
Análise Léxica Primeira fase de um compilador
Os métodos equals() e hashCode()
Orientação a Objetos e Java Graduação em Ciência da Computação
LEONARDO SIMAS JUSSI BARROS WESLLEY VIEIRA Flyweight.
Pilhas Profa. Nádia Félix.
Programação Orientada à Objetos
Analise sintática aula-07-analise-sintática.pdf.
Aulas 2 e 3 – Java – Prof. Marcelo Heitor # O método main e argumentos na linha de comando; # Fluxo padrão de entrada e saída; # A classe JOptionPane;
Concorrência e thread Petrônio Júnior(pglj) Márcio Neves(mmn2)
Wagner Santos C. de Jesus
Programação Orientada a Objetos - Java
UTFPR – Campus Curitiba - DAELN Cursos de Eng. Eletrônica/Eng
Introdução às Java Threads
Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota
Java Kickstart, day 2 Semelhanças com linguagem C.
Aula Prática 4 Monitoria IP/CC (~if669).
Polimorfismo.
Equipe: Osias Carneiro, Anderson Soares, André Araújo
Classes Abstratas e Interface
Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -
Certificação Marco Antonio. Introdução A compreensão desse capítulo é muito importante pois trata de um assunto essencial em qualquer linguagem de programação,
Aula Prática 1 Monitoria IP/CC (~if669) (A partir do slide elaborado por Luís Gabriel)
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
Semântica de Linguagens de Programação
Estrutura de Dados Prof. André Cypriano M. Costa
Classes Abstratas e Interface. 2 Classe Abstrata  Uma classe abstrata serve apenas como modelo para uma classe concreta (classe que comumente usamos);
1 Interface (o termo) » Interface (a palavra reservada): Java estendeu o conceito de interfaces à um nível ainda mais flexível que permite construir entidades.
Transcrição da apresentação:

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

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

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

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

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

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

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

Estrutura © LES/PUC-Rio

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

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

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

Implementação © LES/PUC-Rio 12

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

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

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

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