definição de tipos - lf3definição de tipos - lf3 plp - apresentação 1

45
Definição de tipos - LF3 PLP - Apresentação 1

Upload: internet

Post on 18-Apr-2015

112 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Definição de tipos - LF3

PLP - Apresentação 1

Page 2: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Equipe Felype Santiago Maria Carolina Paola Accioly Rodrigo Cardoso

Page 3: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

ProjetoConceitos básicos

Page 4: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Projeto Estender a LF3 com características de Haskell Definição de tipos

Tipos enumerados Tipos complexos Tipos recursivos

Page 5: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Tipos Enumerados Tipo definido por uma quantidade finita de

construtores.

Em Haskell:data Bool = True | Falsedata Estacao = Inverno | Verao | Outono | Primaveradata Temp = Frio | Quente

Page 6: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Tipos Complexos Tipo definido através do uso de outras

definições.

Em Haskell:type String = [Char]type Name = Stringtype Address = None | Addr Stringtype Person = (Name, Address)

Page 7: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Tipos Recursivos Tipo definido através do uso da própria definição.

Em Haskell:data Tree a = Leaf a 

| Branch (Tree a) (Tree a)

Branch  :: Tree a -> Tree a -> Tree aLeaf    :: a -> Tree a

Page 8: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Apresentação – Parte 1

Page 9: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Projeto (parte 1) Estender a LF3 com características de Haskell Definição de tipos (estender a LF3)

Tipos enumerados Tipos complexos Tipos recursivos

Page 10: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Tipos Enumerados (LF4) Definição dos tipos

type Bool = {True, False} type Temp = {Frio,Quente} type diasDaSemana =

{dom, seg, ter, qua, qui, sex, sab} Type meses =

{jan, fev, mar, abr, mai, jun, jul, ago, set, out, nov, dez}

Page 11: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Tipos Enumerados (LF4) Utilização dos tipos definidos

Função NEXT: retorna o elemento declarado imediatamente depois do enum passado como parâmetro.Exemplo: type diasUteis = {seg, ter, qua, qui, sex}

next(ter) = qua

Função PREVIOUS : retorna o elemento declarado imediatamente depois do enum passado como parâmetro.Exemplo: type diasUteis = {seg, ter, qua, qui, sex}

previous(sex) = qui

Page 12: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Tipos Enumerados (LF4) Utilização dos tipos definidos (cont.)

Função ORD: retorna a posição em que o elemento passado como parâmetro foi declarado (o primeiro elemento ocupa a posição 0).Exemplo: type diasUteis = {seg, ter, qua, qui, sex}

ord(qui) = 3

Page 13: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Algumas observações... (LF4) Nenhuma variável pode ser declarada com o

nome de um instância de um tipo enumerado no mesmo escopo. E vice-versa.

Tipos enumerados podem ser redefinidos em escopos mais internos

As instâncias de tipos enumerados não pode ser nenhuma palavra reservada da linguagem (true, false, etc)

Page 14: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Exemplos de programas (LF4) let type d = {dom, seg, ter, qua, qui, sex, sab}

in let var y = sex in next (y) = sab

let type dias = {seg, ter, qua} in let type diasAoContrario = {ter, seg, dom} in next(next(seg)) = ter

Page 15: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Funcionamento das pilhas

let var x = 1, type diasUteis = {seg, ter, qua, qui, sex} inlet type primTrimestre = {jan, fev, mar}, var y =

"e" in next(seg)

Page 16: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Pilha de compilação let var x = 1, type diasUteis = {seg, ter, qua, qui, sex} in

let type primTrimestre = {jan, fev, mar}, var y = "e"

in next(seg)

let var x = 1, type diasUteis = {seg, ter, qua, qui, sex} inlet type primTrimestre = {jan, fev, mar}, var y =

"e" in next(seg)

Pilha de compilação Map auxiliar

Page 17: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Pilha de compilação

x TipoInteiro<x, TipoInteiro>

let var x = 1, type diasUteis = {seg, ter, qua, qui, sex} inlet type primTrimestre = {jan, fev, mar}, var y =

"e" in next(seg)

Pilha de compilação Map auxiliar

Page 18: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Pilha de compilação

x TipoInteiro

<sex, TipoEnum (diasUteis)>

<qui, TipoEnum (diasUteis)>

<qua, TipoEnum (diasUteis)>

<ter, TipoEnum (diasUteis)>

<seg, TipoEnum (diasUteis)>

<x, TipoInteiro>

let var x = 1, type diasUteis = {seg, ter, qua, qui, sex} inlet type primTrimestre = {jan, fev, mar}, var y =

"e" in next(seg)

Pilha de compilação Map auxiliar

Page 19: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Pilha de compilação let var x = 1, type diasUteis = {seg, ter, qua, qui, sex} in

let type primTrimestre = {jan, fev, mar}, var y = "e"

in next(seg)

<sex, TipoEnum (diasUteis)>

<qui, TipoEnum (diasUteis)>

<qua, TipoEnum (diasUteis)>

<ter, TipoEnum (diasUteis)>

<seg, TipoEnum (diasUteis)>

<x, TipoInteiro>

Pilha de compilação Map auxiliar

Page 20: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Pilha de compilação

Pilha de compilação Map auxiliar

let var x = 1, type diasUteis = {seg, ter, qua, qui, sex} inlet type primTrimestre = {jan, fev, mar}, var y =

"e" in next(seg)

<sex, TipoEnum (diasUteis)>

<qui, TipoEnum (diasUteis)>

<qua, TipoEnum (diasUteis)>

<ter, TipoEnum (diasUteis)>

<seg, TipoEnum (diasUteis)>

<x, TipoInteiro>

let var x = 1, type diasUteis = {seg, ter, qua, qui, sex} inlet type primTrimestre = {jan, fev, mar}, var y =

"e" in next(seg)

<mar, TipoEnum (primTrimestre)>

<fev, TipoEnum (primTrimestre)>

<jan, TipoEnum (primTrimestre)>

Page 21: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Pilha de compilação

Pilha de compilação Map auxiliar

let var x = 1, type diasUteis = {seg, ter, qua, qui, sex} inlet type primTrimestre = {jan, fev, mar}, var y =

"e" in next(seg)

<sex, TipoEnum (diasUteis)>

<qui, TipoEnum (diasUteis)>

<qua, TipoEnum (diasUteis)>

<ter, TipoEnum (diasUteis)>

<seg, TipoEnum (diasUteis)>

<x, TipoInteiro>

let var x = 1, type diasUteis = {seg, ter, qua, qui, sex} inlet type primTrimestre = {jan, fev, mar}, var y =

"e" in next(seg)

<y, TipoString>

<mar, TipoEnum (primTrimestre)>

<fev, TipoEnum (primTrimestre)>

<jan, TipoEnum (primTrimestre)>

Page 22: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Pilha de compilação

Pilha de compilação Map auxiliar

<sex, TipoEnum (diasUteis)>

<qui, TipoEnum (diasUteis)>

<qua, TipoEnum (diasUteis)>

<ter, TipoEnum (diasUteis)>

<seg, TipoEnum (diasUteis)>

<x, TipoInteiro>

let var x = 1, type diasUteis = {seg, ter, qua, qui, sex} inlet type primTrimestre = {jan, fev, mar}, var y =

"e" in next(seg)

<y, TipoString>

<mar, TipoEnum (primTrimestre)>

<fev, TipoEnum (primTrimestre)>

<jan, TipoEnum (primTrimestre)>

<y, TipoString>

<mar, TipoEnum (primTrimestre)>

<fev, TipoEnum (primTrimestre)>

<jan, TipoEnum (primTrimestre)>

Page 23: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Pilha de Execuçãolet var x = 1, type diasUteis = {seg, ter, qua, qui, sex} in

let type primTrimestre = {jan, fev, mar}, var y = "e"

in next(seg)

let var x = 1, type diasUteis = {seg, ter, qua, qui, sex} inlet type primTrimestre = {jan, fev, mar}, var y =

"e" in next(seg)

Pilhas de execução Maps auxiliares

Page 24: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Pilha de Execução

<x, ValorInteiro(1)>

let var x = 1, type diasUteis = {seg, ter, qua, qui, sex} inlet type primTrimestre = {jan, fev, mar}, var y =

"e" in next(seg)

Pilhas de execução Maps auxiliar

Page 25: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Pilha de Execução

<sex, ValorEnum (sex, 4, Tipo(diasUteis))>

<qui, ValorEnum (qui, 3, Tipo(diasUteis))>

<qua, ValorEnum (qua, 2, Tipo(diasUteis))>

<ter, ValorEnum (ter, 1, Tipo(diasUteis))>

<seg, ValorEnum (seg, 0, Tipo(diasUteis))>

<x, ValorInteiro(1)>

let var x = 1, type diasUteis = {seg, ter, qua, qui, sex} inlet type primTrimestre = {jan, fev, mar}, var y =

"e" in next(seg)

Pilhas de execução Maps auxiliares

<diasUteis, [seg, ter, qua, qui, sex]>

Page 26: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Pilha de Execuçãolet var x = 1, type diasUteis = {seg, ter, qua, qui, sex} in

let type primTrimestre = {jan, fev, mar}, var y = "e"

in next(seg)

Pilhas de execução Maps auxiliar

<sex, ValorEnum (sex, 4, Tipo(diasUteis))>

<qui, ValorEnum (qui, 3, Tipo(diasUteis))>

<qua, ValorEnum (qua, 2, Tipo(diasUteis))>

<ter, ValorEnum (ter, 1, Tipo(diasUteis))>

<seg, ValorEnum (seg, 0, Tipo(diasUteis))>

<x, ValorInteiro(1)>

<diasUteis, [seg, ter, qua, qui, sex]>

Page 27: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Pilha de Execuçãolet var x = 1, type diasUteis = {seg, ter, qua, qui, sex} in

let type primTrimestre = {jan, fev, mar}, var y = "e"

in next(seg)

let var x = 1, type diasUteis = {seg, ter, qua, qui, sex} inlet type primTrimestre = {jan, fev, mar}, var y =

"e" in next(seg)

Pilhas de execução Maps auxiliar

<sex, ValorEnum (sex, 4, Tipo(diasUteis))>

<qui, ValorEnum (qui, 3, Tipo(diasUteis))>

<qua, ValorEnum (qua, 2, Tipo(diasUteis))>

<ter, ValorEnum (ter, 1, Tipo(diasUteis))>

<seg, ValorEnum (seg, 0, Tipo(diasUteis))>

<x, ValorInteiro(1)>

<diasUteis, [seg, ter, qua, qui, sex]>

<mar, ValorEnum(mar, 2, Tipo(primTrimestre))>

<fev, ValorEnum(fev, 1, Tipo(primTrimestre))>

<jan, ValorEnum(jan, 0, Tipo(primTrimestre))>

<primTrimestre, [jan, fev, mar]>

Page 28: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Pilha de Execuçãolet var x = 1, type diasUteis = {seg, ter, qua, qui, sex} in

let type primTrimestre = {jan, fev, mar}, var y = "e"

in next(seg)

let var x = 1, type diasUteis = {seg, ter, qua, qui, sex} inlet type primTrimestre = {jan, fev, mar}, var y =

"e" in next(seg)

Pilhas de execução Maps auxiliar

<sex, ValorEnum (sex, 4, Tipo(diasUteis))>

<qui, ValorEnum (qui, 3, Tipo(diasUteis))>

<qua, ValorEnum (qua, 2, Tipo(diasUteis))>

<ter, ValorEnum (ter, 1, Tipo(diasUteis))>

<seg, ValorEnum (seg, 0, Tipo(diasUteis))>

<x, ValorInteiro(1)>

<diasUteis, [seg, ter, qua, qui, sex]>

<y, ValorString(“e”)>

<mar, ValorEnum(mar, 2, Tipo(primTrimestre))>

<fev, ValorEnum(fev, 1, Tipo(primTrimestre))>

<jan, ValorEnum(jan, 0, Tipo(primTrimestre))>

<primTrimestre, [jan, fev, mar]>

Page 29: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Pilha de Execuçãolet var x = 1, type diasUteis = {seg, ter, qua, qui, sex} in

let type primTrimestre = {jan, fev, mar}, var y = "e"

in next(seg)

let var x = 1, type diasUteis = {seg, ter, qua, qui, sex} inlet type primTrimestre = {jan, fev, mar}, var y =

"e" in next(seg)

Pilhas de execução Maps auxiliar

<sex, ValorEnum (sex, 4, Tipo(diasUteis))>

<qui, ValorEnum (qui, 3, Tipo(diasUteis))>

<qua, ValorEnum (qua, 2, Tipo(diasUteis))>

<ter, ValorEnum (ter, 1, Tipo(diasUteis))>

<seg, ValorEnum (seg, 0, Tipo(diasUteis))>

<x, ValorInteiro(1)>

<diasUteis, [seg, ter, qua, qui, sex]>

<primTrimestre, [jan, fev, mar]>

<y, ValorString(“e”)>

<mar, ValorEnum(mar, 2, Tipo(primTrimestre))>

<fev, ValorEnum(fev, 1, Tipo(primTrimestre))>

<jan, ValorEnum(jan, 0, Tipo(primTrimestre))>

Page 30: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Pilha de Execução

Pilhas de execução

<sex, ValorEnum (sex, 4, Tipo(diasUteis))>

<qui, ValorEnum (qui, 3, Tipo(diasUteis))>

<qua, ValorEnum (qua, 2, Tipo(diasUteis))>

<ter, ValorEnum (ter, 1, Tipo(diasUteis))>

<seg, ValorEnum (seg, 0, Tipo(diasUteis))>

<x, ValorInteiro(1)><diasUteis, [jan, fev, mar]>

<y, ValorString(“e”)>

<mar, ValorEnum(mar, 2, Tipo(primTrimestre))>

<fev, ValorEnum(fev, 1, Tipo(primTrimestre))>

<jan, ValorEnum(jan, 0, Tipo(primTrimestre))>

<diasUteis, [jan, fev, mar]>

Page 31: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

BNF ValorConcreto ::= ValorInteiro | ValorBooleano

| ValorString | ValorLista | ValorEnum ExpUnaria ::= "-" Expressao | "not" Expressao

| "length" Expressao | "ord" Expressao | "next" Expressao | "previous" Expressao

| head(Expressao) | tail(Expressao) | ExpCompreensaoLista

Page 32: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

BNF DeclaracaoFuncional ::= DecVariavel

| DecTipo| DecFuncao| DeclaracaoFuncional "," DeclaracaoFuncional

DecTipo ::= "type" Id "=" "{" SeqEnum "}"

SeqEnum ::= ValorEnum | ValorEnum "," SeqEnum

Page 33: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Parser - Tokens < TYPE : "type"> < NEXT : "next" > < PREVIOUS : "previous" > < ORD : "ord" >

Page 34: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Parser - PDeclType()DeclaracaoFuncional PDeclType() :{

Id tipo;SeqEnum seqEnum;

}{

( <TYPE> tipo = PId() <ASSIGN> <LBRACE> seqEnum = PSeqEnum(tipo.toString()) <RBRACE>)

{return new DecType(tipo, seqEnum);

}}

Page 35: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Parser - PSeqEnumSeqEnum PSeqEnum(String tipo) :{

ValorEnum valEnum;List lista = null;int index = 0;

}{

(valEnum = PValorEnum(tipo, index++) {

lista = new ArrayList();lista.add(valEnum);

}( <COMMA> valEnum = PValorEnum(tipo, index++){

lista.add(valEnum);})*

){

return new SeqEnum(lista);}

}

Page 36: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Parser - PValorEnumValorEnum PValorEnum(String str, int index) : {

Token token;}{

token = <IDENTIFIER>{

String tokenStr = token.toString();return new ValorEnum(new Id(tokenStr), str, index);

}}

Page 37: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Parser - OperaçõesExpressao PExpNext() :{

Expressao retorno;}{

<NEXT> retorno = PExpPrimaria(){

return new ExpNext(retorno);}

}

Expressao PExpPrevious() :{

Expressao retorno;}{

<PREVIOUS> retorno = PExpPrimaria(){

return new ExpPrevious(retorno);}

}

Expressao PExpOrd() :{

Expressao retorno;}{

<ORD> retorno = PExpPrimaria(){

return new ExpOrd(retorno);}

}

Page 38: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Implementação Classes novas

DecType SeqEnum ValorEnum TipoEnum ExpOperacoesEnum• ExpNext• ExpPrevious• ExpOrd

Page 39: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Implementação Modificações em classes/interfaces

AmbienteFuncional<DefFuncao, DecType>• AmbienteExecucaoFuncional

– ContextoExecucaoFuncional

Page 40: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Implementação Modificações em métodos

ExpDeclaracao• avaliar• includeBindings• resolveBindings• resolveTypeBidings

Page 41: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Projeto – Parte 2

Page 42: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Projeto (parte 2) Estender a LF3 com características de Haskell Definição de tipos (estender a LF3)

Tipos enumerados Tipos complexos Tipos recursivos

Page 43: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Dúvidas/decisões de projetoPara finalizar...

Page 44: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Dúvidas/decisões de projeto Como declarar tipos recursivos em uma

linguagem não tipada? Uma pilha auxiliar para as estruturas foi a

melhor decisão? Como dar “apelidos” para tipos se eles não

são explícitos?

Page 45: Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1

Referências Programming Language Concepts and

Paradigms - David A. Watt Programming language processors in Java -

David A. Watt e Deryck F. Brown http://www.cin.ufpe.br/~if708 http://www.haskell.org/tutorial/goodies.html