paradigmas de linguagens de programação bnf e interpretador da linguagem orientada a objetos...
TRANSCRIPT
Paradigmas de Linguagens de Programação
BNF e Interpretador daLinguagem Orientada a
Objetos
Augusto SampaioJackson, Jean, Patrícia, Saulo
Centro de Informática
Universidade Federal de Pernamburco
2012.1
BNF
• Mudança de paradigma: imperativa 1 => OO1
• Conceitos fundamentais de orientação a objetos ficaram de fora
• OO2 veio para adicionar Construtor (de fato) e Herança
• http://www.cin.ufpe.br/~in1007/linguagens/OrientadaObjetos2/orientadaObjetos2.html
2
Construtor
• Métodos especiais chamados automaticamente a cada criação de um objeto
• Através do comando new• Não possuem valor de retorno e
tem o mesmo nome da classe
3
Construtor
• Inicialmente, na linguagem OO1, não existe a definição formal de construtor
• A classe é criada através de um construtor simples, sem ser possível especializa-lo
• Linguagens mais sofisticadas permitem essa capacidade
4
Construtor
• Classes Geradas– NewOO2 (ListaExpressao)– DecClasseSimplesOO2
(DecConstrutor)– DecConstrutor (checaTipo,
getProcedimento)– DefClasseOO2– DecVariavelObjetoOO2
5
Construtor - NewOO2
6
Construtor - DecConstrutor
7
Exemplo Construtor
8
{ classe Eletrodomestico{ boolean ligado = false, int voltagem = 220; Eletrodomestico(boolean ligado, int voltagem){ this.ligado := ligado; this.voltagem := voltagem }, proc ligar(){ this.ligado := true }, proc desligar(){ this.ligado := false },
Exemplo Construtor - Cont
9
proc imprimeEstado(){ write("Ligado: " ++ this.ligado); write("Voltagem: " ++ this.voltagem) } }; { Eletrodomestico eletro := new Eletrodomestico(false,110); eletro.imprimeEstado(); eletro.ligar(); eletro.imprimeEstado() }}
Herança
• Comandos Modificados:– AtribuicaoOO2– ChamadaMetodoOO2– NewOO2
• Expressões modificadas:– AcessoAtributoOO2– AcessoAtributoThisOO2
10
Herança - AtribuicaoOO2
11
Herança - ChamadaMetodoOO2
12
Herança - NewOO2
13
Herança Exemplo
14
classe Tv extends Eletrodomestico{ int canal = 3, int volume = 0; Tv(boolean ligado, int voltagem, int canal, int volume){ this.ligado := ligado; this.voltagem := voltagem; this.canal := canal; this.volume := volume }, proc aumentarVolume(){ this.volume := this.volume + 1 }, proc diminuirVolume(){ if(not (this.volume == 0)) then { this.volume := this.volume - 1 } },
Herança Exemplo - Cont
15
proc imprimeEstadoTv(){ this.imprimeEstado(); write("Canal: " ++ this.canal); write("Volume: " ++ this.volume) } }; { Tv tv := new Tv(false,110,13,20); write(tv.voltagem);write("------------------------"); tv.imprimeEstado();write("------------------------"); tv.imprimeEstadoTv();write("------------------------"); tv.aumentarVolume(); tv.imprimeEstadoTv() }
Ambiente do Interpretador
• O ambiente inclui SETE componentes: – uma pilha de mapeamentos de
identificadores em valores– um mapeamento de referências em
objetos– a próxima referência disponível– um mapeamento de identificadores em
definições de classes– listas de valores de entrada e saída– Lista de mapeamento de superclasses
[classe => superclasse]
Contexto do Objeto
• Cada objeto tem um estado independente
• O estado do objeto (seu contexto) é um mapeamento entre identificadores e valores.
• Os identificadores são os atributos desse objeto
17
Pilha Ids <id, valor> Map de Objetos <valorRef,objeto>
mapDefClasse<id, DefClasse>
{classe Eletrodomestico{ //ligado, voltagem //ligar, desligar, imprimeEstado},classe Tv extends Eletrodomestico{ //canal, volume //aumentarVolume, diminuirVolume //imprimeEstadoTv}
in
out
Eletrodomestico = DefClasse{{campos}, {metodos}}
proxRef = Ref0
ArrayList<SuperClasseMap> Tv = DefClasse{{campos}, {metodos}}
<Tv, Eletrodomestico>
proxRef = Ref0proxRef = Ref1
Pilha Ids <id, valor>
…{ Tv tv := new Tv(false,110,13,20);…
EstadoObjTv0volume=0Canal=3
in
out
tv = null
Map de Objetos <valorRef,objeto>
tv = Ref0 Ref0 = ObjTv0
mapDefClasse<id, DefClasse>
Eletrodomestico = DefClasse{{campos}, {metodos}}
Tv = DefClasse{{campos}, {metodos}}
<Tv, Eletrodomestico>
ligado = false,voltagem = 220
EstadoObjTv0volume=20 ligado = falseCanal=13 voltagem = 110
ArrayList<SuperClasseMap>
proxRef = Ref0proxRef = Ref1
Pilha Ids <id, valor>
…tv.imprimeEstado();//metodo da superclassetv.imprimeEstadoTv()}
EstadoObjTv0volume=0Canal=3
in
out Map de Objetos
<valorRef,objeto>
tv = Ref0 Ref0 = ObjTv0
mapDefClasse<id, DefClasse>
Eletrodomestico = DefClasse{{campos}, {metodos}}
Tv = DefClasse{{campos}, {metodos}}
<Tv, Eletrodomestico>
ligado = false,voltagem = 220
EstadoObjTv0volume=20 ligado = falseCanal=13 voltagem = 110
ArrayList<SuperClasseMap>
TO-DO
• Implementar Overloading• Implementar Polimorfismo• Adicionar operador super• Adicionar modificadores de acesso
21