32
DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2

DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Embed Size (px)

Citation preview

Page 1: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

DEFINIÇÃO DE TIPOS – LF3

PLP – Apresentação 2

Page 2: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Equipe

Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Page 3: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Agenda

Descrição do projeto Gramática Decisões de projeto Implementação Parser Considerações finais

Page 4: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Contextualização do problema

Descrição do Projeto

Page 5: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Objetivo

Estender a Linguagem Funcional 3 com aspectos de Haskell

Permitir definição de tipos pelo programador Tipos enumerados Tipos recursivos Tipos complexos

Page 6: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

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 7: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

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 – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Tipos Complexos

Tipo definido através do uso de outras definições.

Em Haskell:type String = [Char]

type Name = String

type Address = None | Addr String

type Person = (Name, Address)

Page 9: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Alteração na BNF

Gramática

Page 10: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Alteração na BNF

ValorAbstrato ::= ValorFuncao | ValorTipo DeclaracaoFuncional ::= DecVariavel

| DecFuncao| DecTipo| DeclaracaoFuncional ","

DeclaracaoFuncional DecTipo ::= "type" Id "=" "{"

SeqConstrutores "}"

Page 11: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Alteração na BNF

SeqConstrutores ::= Construtor | Construtor "|" SeqConstrutores

Contrutor ::= Id | Id "(" ListaTipos ")" ListaTipos ::= TiposAceitos

| TiposAceitos "," ListaTipos TiposAceitos ::= "String" | "Boolean"

| "Int" | Id

Page 12: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Características da Linguagem

Decisões de projeto

Page 13: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Decisões de projeto

Tipos enumerados são tratados como construtores vazios.

Os nomes dos construtores não podem ser nenhuma palavra reservada da linguagem Ex: false, true, length, var, type...

Não são permitidas redefinições de construtores Nomes dos construtores são tratados como

palavra reservada em qualquer escopo Não podem ser utilizados como nomes de

variáveis, funções ou qualquer outro construtor

Page 14: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Decisões de projeto

Os tipos são declarados sequencialmente Evitar abertura de escopos desnecessários

Para declarar os construtores, é necessário determinar os tipos dos parâmetros aceitos Tipos primitivos (String, Boolean e Int) Qualquer tipo declarado pelo programador,

inclusive o próprio tipo sendo declarado ValorTipo herda de ValorAbstrato

Page 15: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Alteração na BNF

Implementação

Page 16: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Funcionamento das pilhas

let type dias = {dom | seg | ter | qua | qui | sex | sab}, var x = 1 in let type listaDias = {null | obj(dias) | lista(listaDias, listaDias)} in lista(lista(lista(obj(seg), obj(ter)), obj(qua)), null)

Page 17: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Pilha de compilação e execução

let type dias = {dom | seg | ter | qua | qui | sex | sab}, var x = 1 in let type listaDias = {null | obj(dias) | lista(listaDias, listaDias)} in lista(lista(lista(obj(seg), obj(ter)), obj(qua)), null)

Variáveis e funções

Tipos

let type dias = {dom | seg | ter | qua | qui | sex | sab}, var x = 1 in let type listaDias = {null | obj(dias) | lista(listaDias, listaDias)} in lista(lista(lista(obj(seg), obj(ter)), obj(qua)), null)

let type dias = {dom | seg | ter | qua | qui | sex | sab}, var x = 1 in let type listaDias = {null | obj(dias) | lista(listaDias, listaDias)} in lista(lista(lista(obj(seg), obj(ter)), obj(qua)), null)

<(dom, ConstEnum), (seg, ConstEnum),

(ter, ConstEnum), (qua, ConstEnum),

(qui, ConstEnum), (sex, ConstEnum),

(sab, ConstEnum)>DefType

<dias, DefType(<(dom, ConstEnum), (seg, ConstEnum),

(ter, ConstEnum), (qua, ConstEnum), (qui,

ConstEnum), (sex, ConstEnum), (sab,

ConstEnum)>)>

let type dias = {dom | seg | ter | qua | qui | sex | sab}, var x = 1 in let type listaDias = {null | obj(dias) | lista(listaDias, listaDias)} in lista(lista(lista(obj(seg), obj(ter)), obj(qua)), null)

let type dias = {dom | seg | ter | qua | qui | sex | sab}, var x = 1 in let type listaDias = {null | obj(dias) | lista(listaDias, listaDias)} in lista(lista(lista(obj(seg), obj(ter)), obj(qua)), null)

<x, TipoInteiro/ValorInt(1)>

let type dias = {dom | seg | ter | qua | qui | sex | sab}, var x = 1 in let type listaDias = {null | obj(dias) | lista(listaDias, listaDias)} in lista(lista(lista(obj(seg), obj(ter)), obj(qua)), null)

Page 18: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Pilha de compilação e execução

let type dias = {dom | seg | ter | qua | qui | sex | sab}, var x = 1 in let type listaDias = {null | obj(dias) | lista(listaDias, listaDias)} in lista(lista(lista(obj(seg), obj(ter)), obj(qua)), null)

<dias, DefType(<(dom, ConstEnum), (seg, ConstEnum),

(ter, ConstEnum), (qua, ConstEnum), (qui,

ConstEnum), (sex, ConstEnum), (sab,

ConstEnum)>)>

<x, TipoInteiro/ValorInt(1)

>

<(null, ConstEnum), (obj, ConstTipoRecursivo(dias)),

(lista, ConstTipoRecursivo(listaDias, listaDias))>

DefType

<listaDias, DefType(<(null, ConstEnum),

(obj, ConstTipoRecursivo(dias)), (lista, ConstTipoRecursivo(listaDias,

listaDias))>)>

let type dias = {dom | seg | ter | qua | qui | sex | sab}, var x = 1 in let type listaDias = {null | obj(dias) | lista(listaDias, listaDias)} in lista(lista(lista(obj(seg), obj(ter)), obj(qua)), null)

let type dias = {dom | seg | ter | qua | qui | sex | sab}, var x = 1 in let type listaDias = {null | obj(dias) | lista(listaDias, listaDias)} in lista(lista(lista(obj(seg), obj(ter)), obj(qua)), null)

let type dias = {dom | seg | ter | qua | qui | sex | sab}, var x = 1 in let type listaDias = {null | obj(dias) | lista(listaDias, listaDias)} in lista(lista(lista(obj(seg), obj(ter)), obj(qua)), null)

Variáveis e funções Tipos

Page 19: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Pilha de compilação e execução

let type dias = {dom | seg | ter | qua | qui | sex | sab}, var x = 1 in let type listaDias = {null | obj(dias) | lista(listaDias, listaDias)} in lista(lista(lista(obj(seg), obj(ter)), obj(qua)), null)

Variáveis e funções Tipos

<dias, DefType(<(dom, ConstEnum), (seg, ConstEnum),

(ter, ConstEnum), (qua, ConstEnum), (qui,

ConstEnum), (sex, ConstEnum), (sab,

ConstEnum)>)>

<x, TipoInteiro>

<listaDias, DefType(<(null, ConstEnum),

(obj, ConstTipoRecursivo(dias)), (lista, ConstTipoRecursivo(listaDias,

listaDias))>)>

Page 20: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Diagrama UML - Contexto

Page 21: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Diagrama UML - Tipos novos

Page 22: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Implementação - Modificações

Classes/Interfaces AmbienteFuncional<T, K>

AmbienteExecucaoFuncional ContextoExecucaoFuncional

AmbienteCompilacaoFuncional (NOVO) ContextoCompilacaoFuncional (NOVO)

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

ExpDeclaracao - Mapeamento de estruturas avaliar, includeBindings, resolveBindings,

resolveTypeBidings...

Page 23: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Alteração na BNF

Parser

Page 24: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Parser - PDeclType()

DeclaracaoFuncional PDeclType() :{

Id tipo;SeqConstrutor seqConstrutor;

}{

( <TYPE> tipo = PId() <ASSIGN> <LBRACE> seqConstrutor = PSeqConstrutor(tipo.toString()) <RBRACE>){

return new DecType(tipo, seqConstrutor);}

}

Page 25: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Parser - PSeqConstrutorSeqConstrutor PSeqConstrutor(String tipo) :{

Construtor construtor;List lista = null;int index = 0;

}{( construtor = PConstrutor(tipo, index++))

{ lista = new ArrayList(); lista.add(construtor);

}( (<BIT_OR> construtor = PConstrutor(tipo, index++)) {lista.add(construtor);}) *{ return new SeqConstrutor(lista); }

Page 26: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Parser - PConstrutor

Construtor PConstrutor(String tipo, int index):{Construtor construtor;}{((

LOOKAHEAD(<IDENTIFIER> <LPAREN>) construtor = PConstrutorTipoRecursivo(tipo)| LOOKAHEAD(<IDENTIFIER>) construtor = PConstrutorEnum(tipo, index) )){ return construtor; }

}

Page 27: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Exemplo de programas, conclusões e referências

Para finalizar...

Page 28: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Exemplos de programas Ao vivo é melhor! =D

Page 29: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Conclusões

Aumentou o poder de expressão da linguagem

Implementação única para tipos enumerados e recursivos.

Trabalhos futuros: Otimizar as heranças Funções nativas (NEXT, PREVIOUS e ORD)

Page 30: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

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.ht

ml

Page 31: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

Dúvidas... Sugestões...

Page 32: DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

DEFINIÇÃO DE TIPOS – LF3

PLP – Apresentação 2