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

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

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

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