Animador para a Linguagem Funcional 2 Carlos Eduardo

  • Slides: 15
Download presentation
Animador para a Linguagem Funcional 2 Carlos Eduardo Lima Lucas Roberto Bechert Schmitz Leonardo

Animador para a Linguagem Funcional 2 Carlos Eduardo Lima Lucas Roberto Bechert Schmitz Leonardo Lucena

Proposta p Desenvolver um Animador Web que execute “passo-a-passo” programas da Linguagem Funcional 2,

Proposta p Desenvolver um Animador Web que execute “passo-a-passo” programas da Linguagem Funcional 2, mostrando o que ocorre com o ambiente durante a execução. p Desenvolver um Editor Web para as Linguagens de PLP

Animação / Visualização de Programas p Exemplos de Softwares que animam / visualizam programas:

Animação / Visualização de Programas p Exemplos de Softwares que animam / visualizam programas: n Eliot - Anima algoritmos p n http: //www. cs. helsinki. fi/research/aaps/Eliot/ Jeliot – Anima Programas Java p http: //cs. joensuu. fi/jeliot/

O que visualizar A avaliação do programa p A avaliação das expressões que compõem

O que visualizar A avaliação do programa p A avaliação das expressões que compõem o programa p O ambiente de Execução p Os bindings p

Estratégia Dividir a execução em passos p Cada passo corresponde a uma modificação causada

Estratégia Dividir a execução em passos p Cada passo corresponde a uma modificação causada por: p n n A avaliação de uma expressão O incremento do ambiente A restauração do ambiente A introdução de um binding

Metas(Requisitos) de Implementação p Quanto menos alterar a implementação da linguagem melhor p Facilidade

Metas(Requisitos) de Implementação p Quanto menos alterar a implementação da linguagem melhor p Facilidade de adaptar o animador a novas extensões da Linguagem Funcional 2 p Terminar o projeto em 2 semanas

Como Implementar? p Opções n n n Usando o padrão de projeto Visitor Usando

Como Implementar? p Opções n n n Usando o padrão de projeto Visitor Usando Reflection Usando Java Debug Interface (JDI) Inserindo o código do animador dentro da linguagem A linguagem informa ao animador o que está fazendo.

Estrutura do Animador p Animador n void terminar. Avaliacao(Expressao, Valor) n void inserir. Binding(Id,

Estrutura do Animador p Animador n void terminar. Avaliacao(Expressao, Valor) n void inserir. Binding(Id, Valor) n void incrementar. Contexto() n void restaurar. Contexto() n List<Passo> get. Passos() * Passo Ambiente * Contexto * Binding

Estrutura do Animador p Passo n Ambiente ambiente; n String avaliacao; n String codigo;

Estrutura do Animador p Passo n Ambiente ambiente; n String avaliacao; n String codigo; n String valor; * Passo Ambiente * Contexto * Binding

Adaptando o Contexto. Execucao public class Contexto. Execucao extends Contexto<Valor> implements Ambiente. Execucao {

Adaptando o Contexto. Execucao public class Contexto. Execucao extends Contexto<Valor> implements Ambiente. Execucao { private Animador animador; public Animador get. Animador() { return animador; } public Contexto. Execucao() { this. animador = animador; } @Override public void incrementa() { super. incrementa(); animador. incrementar. Contexto(); } @Override public void map(Id id. Arg, Valor valor. Id) throws Variavel. Ja. Declarada. Exception { super. map(id. Arg, valor. Id); animador. inserir. Binding(id. Arg, valor. Id); } @Override public void restaura() { super. restaura(); animador. restaurar. Contexto(); } }

Adaptando os métodos avaliar() public class Exp. Soma extends Exp. Binaria { … public

Adaptando os métodos avaliar() public class Exp. Soma extends Exp. Binaria { … public Valor avaliar(Ambiente. Execucao amb) throws Variavel. Nao. Declarada. Exception, Variavel. Ja. Declarada. Exception { // iniciar a avaliação Animador animador = amb. get. Animador(); // avaliação da expressão da esquerda Valor a = (Valor. Inteiro)get. Esq(). avaliar(amb); set. Exp. Esq(a); // avaliação da expressão da direita Valor b = (Valor. Inteiro) get. Dir(). avaliar(amb); set. Exp. Dir(b); // terminar a avaliação Valor c = new Valor. Inteiro( ((Valor. Inteiro)a). valor() + ((Valor. Inteiro)b). valor() ); animador. terminar. Avaliacao(this, c); set. Exp. Esq(null); set. Exp. Dir(null); return c; }

Adaptando os métodos to. String() public abstract class Exp. Binaria implements Expressao { private

Adaptando os métodos to. String() public abstract class Exp. Binaria implements Expressao { private Expressao exp. Esq; private Expressao exp. Dir; public String get. Exp. Esq(){ if (exp. Esq==null) exp. Esq = get. Esq(); return exp. Esq. to. String(); } public void set. Exp. Esq(Expressao exp) { exp. Esq = exp; } public String get. Exp. Dir(){. . . } public void set. Exp. Dir(Expressao exp) {. . . } public String to. String() { String. Buffer sb = new String. Buffer(); sb. append(get. Exp. Esq(). to. String()); sb. append(' '); sb. append(operador); sb. append(' '); sb. append(get. Exp. Dir(). to. String()); return sb. to. String(); } }

Executando o programa 1 + 2 + 3 usuário programa expr _ + 3

Executando o programa 1 + 2 + 3 usuário programa expr _ + 3 expr 1 + 2 executar() animador avaliar() terminar. Avaliacao(expr 1+ 2, 3) to. String() [Novo Passo] to. String() “ 3” “ 3+3” to. String() get. Animador() get. Passos() “ 6” terminar. Avaliacao(expr _ +3, 6) [Novo Passo]

Trabalhos Futuros Melhorar a visualização p Incluir as extensões das outras equipes p Transformar

Trabalhos Futuros Melhorar a visualização p Incluir as extensões das outras equipes p Transformar o animador em um plugin do eclipse (Sugestão de Eduardo Tavares) p Implementar o animador usando Aspectos (A animação seria um aspecto). p Implementar o animador usando o padrão Visitor p Estender o animador para as linguagens Imperativa e Orientada a Objetos p

Animador para a Linguagem Funcional 2 Carlos Eduardo Lima Lucas Roberto Bechert Schmitz Leonardo

Animador para a Linguagem Funcional 2 Carlos Eduardo Lima Lucas Roberto Bechert Schmitz Leonardo Lucena