Paradigmas de Linguagens de Programação
BNF e Interpretador da
Linguagem Orientada a Objetos 1
Augusto Sampaio e Paulo Borba
Gustavo Pinto
Marcelo Queiroz
Rafael Dantas
Renan Pereira
Centro de Informática
Universidade Federal de Pernamburco
O Paradigma Orientado a Objetos
Visão Geral
• Atributos são similares às variáveis
das Linguagens Imperativas 1 e 2
• Métodos são similares aos
procedimentos da Linguagem
Imperativa 2
Métodos não são valores e podem
ser recursivos e parametrizados
Visão Geral
• Estende a Linguagem Imperativa 1
com
– declarações de classes,
– criação dinâmica de objetos, e
– chamada de métodos
BNF
• http://www.cin.ufpe.br/~in1007/linguagens/Or
ientadaObjetos1/orientadaObjetos1.html
• Novos comandos:
– New, ChamadaMétodo, Atribuição (baseada em
AcessoVariável)
• Novas declarações:
– DecClasse, DecVariavelObjeto
• Criação de Contexto para o Objeto
– ContextoObjeto
Programa Exemplo 1
{
classe Contador {
int valor = 1;
proc print() {
write(this.valor)
},
proc inc() {
this.valor := this.valor+1
}
};
{
Contador c := new Contador,
Contador c2:= new Contador;
c := c2;
c2.print();
c.inc();
c2.print();
c.inc();
c2.print()
}
Programa Exemplo 2
{ classe LValor {
int valor = -100,
LValor prox = null;
proc insere(int v) {
if ((this).valor == -100) then {
this.valor := v;
this.prox := new LValor
} else {(this).prox.insere(v)}
},
Programa Exemplo 2 – cont.
proc print() {
write(this.valor);
if (not(this.prox == null)) then
{(this).prox.print()}
else {skip}
}
};
{
}
}
LValor lv := new LValor;
lv.insere(3); lv.insere(4);
lv.print()
Ambiente do Interpretador
• O ambiente inclui seis componentes:
– uma pilha de mapeamentos de
identificadores (incluindo this) em valores
(incluindo referências)
– um mapeamento de referências em objetos
– a próxima referência disponível a ser
alocada
– um mapeamento de identificadores em
definições de classes
– listas de valores de entrada e saída
Contexto do Objeto
• O objeto passa a ter um estado
independente
• O estado do objeto (seu contexto) é
um mapeamento entre identificadores
e valores.
• Os identificadores são os atributos
desse objeto
10
mapDefClasse<id, DefClasse>
Contador =
DefClasse{{valor}, {print(),
inc()}}
proxRef = Ref0
Pilha Ids <id, valor>
classe Contador {
int valor = 1;
proc print()
{write(this.valor)},
proc inc()
{this.valor := this.valor+1}
}
…
Map de Objetos
<valorRef,objeto>
in
out
comando.executar(decClasse.elabora(ambiente));
mapDefClasse<id, DefClasse>
Contador =
DefClasse{{valor}, {print(),
inc()}}
proxRef = Ref2
Ref0
EstadoObj1
valor = 1
c2
c2 == Ref1
null
c1
c1 == Ref0
null
Ref0 = ObjContador1
Ref1 = ObjContador2
Pilha Ids <id, valor>
Map de Objetos
<valorRef,objeto>
…
{
Contador c1 := new Contador,
Contador c2:= new Contador
;
…
EstadoObj2
valor = 1
in
out
comando.executar(decClasse.elabora(ambiente));
ambiente.incrementa();
comando.executar(declaracao.elabora(ambiente));
declaracao2.elabora(declaracao1.elabora(ambiente))
decVariavelObjeto.elabora()
new.executa()
mapDefClasse<id, DefClasse>
Contador =
DefClasse{{valor}, {print(),
inc()}}
proxRef = Ref2
EstadoObj1
valor = 1
c2 = Ref1
c1 = Ref1
Ref0
Ref0 = ObjContador1
Ref1 = ObjContador2
Pilha Ids <id, valor>
Map de Objetos
<valorRef,objeto>
…
c1 := c2;
…
EstadoObj2
valor = 1
in
out
comando.executar(declaracao.elabora(ambiente));
comando1.executar()
atribuicao.executar()
ambiente.changeValor(idVariavel, expressao.avaliar)
mapDefClasse<id, DefClasse>
Contador =
DefClasse{{valor}, {print(),
inc()}}
proxRef = Ref2
EstadoObj1
valor = 1
c2 = Ref1
c1 = Ref1
Ref0 = ObjContador1
Ref1 = ObjContador2
Pilha Ids <id, valor>
Map de Objetos
<valorRef,objeto>
…
c1.inc();
c1.inc();
c2.print()
}
}
EstadoObj2
valor = 1
in
out 3
out
comando.executar(declaracao.elabora(ambiente));
comando2(3 e 4).executar()
chamadaMetodo.executar()
ambiente.changeValor(new Id("this"),vr) (Amb do Objeto)
ambiente.incrementa() (Ambiente do Objeto)
procedimento.executar()
ambiente.restaura()
Projeto e Implementação do
Interpretador
• http://www.cin.ufpe.br/~in1007/lingu
agens/OrientadaObjetos1/orientada
Objetos1.html
• A execução de comandos retorna um
contexto derivado do que é recebido
como argumento
• Modelo de projeto
• Partes do código
Exercícios
• Estenda a Linguagem Orientada a
Objetos com os seguintes recursos:
– remoção dinâmica de objetos
– inspeção dinâmica de tipos, como o
instanceof de Java
– construtores (inicializadores) como em
Java (implementado na OO2)
Download

Aula 21 - Centro de Informática da UFPE