A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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

Apresentações semelhantes


Apresentação em tema: "DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2. Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso."— Transcrição da apresentação:

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

2 Equipe Felype Santiago Maria Carolina Paola Rodrigues Rodrigo Cardoso

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

4 Contextualização do problema Descrição do Projeto

5 Objetivo Estender a Linguagem Funcional 3 com aspectos de Haskell Permitir definição de tipos pelo programador Tipos enumerados Tipos recursivos Tipos complexos

6 Tipos Enumerados Tipo definido por uma quantidade finita de construtores. Em Haskell: data Bool = True | False data Estacao = Inverno | Verao | Outono | Primavera data Temp = Frio | Quente

7 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 a Leaf :: a -> Tree a

8 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)

9 Alteração na BNF Gramática

10 Alteração na BNF ValorAbstrato ::= ValorFuncao | ValorTipo DeclaracaoFuncional ::= DecVariavel | DecFuncao | DecTipo | DeclaracaoFuncional "," DeclaracaoFuncional DecTipo ::= "type" Id "=" "{" SeqConstrutores "}"

11 Alteração na BNF SeqConstrutores ::= Construtor | Construtor "|" SeqConstrutores Contrutor ::= Id | Id "(" ListaTipos ")" ListaTipos ::= TiposAceitos | TiposAceitos "," ListaTipos TiposAceitos ::= "String" | "Boolean" | "Int" | Id

12 Características da Linguagem Decisões de projeto

13 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

14 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

15 Alteração na BNF Implementação

16 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)

17 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 )> 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)

18 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) )> <(null, ConstEnum), (obj, ConstTipoRecursivo(dias)), (lista, ConstTipoRecursivo(listaDias, listaDias))> DefType )> 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çõesTipos

19 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çõesTipos )> )>

20 Diagrama UML - Contexto

21 Diagrama UML - Tipos novos

22 Implementação - Modificações Classes/Interfaces AmbienteFuncional AmbienteExecucaoFuncional ContextoExecucaoFuncional AmbienteCompilacaoFuncional (NOVO) ContextoCompilacaoFuncional (NOVO) Aplicação Modificações em métodos ExpDeclaracao - Mapeamento de estruturas avaliar, includeBindings, resolveBindings, resolveTypeBidings...

23 Alteração na BNF Parser

24 Parser - PDeclType() DeclaracaoFuncional PDeclType() : { Id tipo; SeqConstrutor seqConstrutor; } { ( tipo = PId() seqConstrutor = PSeqConstrutor(tipo.toString()) ) { return new DecType(tipo, seqConstrutor); }

25 Parser - PSeqConstrutor SeqConstrutor PSeqConstrutor(String tipo) : { Construtor construtor; List lista = null; int index = 0; }{ ( construtor = PConstrutor(tipo, index++)) { lista = new ArrayList(); lista.add(construtor); } ( ( construtor = PConstrutor(tipo, index++)) {lista.add(construtor);} ) * { return new SeqConstrutor(lista); }

26 Parser - PConstrutor Construtor PConstrutor(String tipo, int index): {Construtor construtor;} { (( LOOKAHEAD( ) construtor = PConstrutorTipoRecursivo(tipo) | LOOKAHEAD( ) construtor = PConstrutorEnum(tipo, index) )) { return construtor; } }

27 Exemplo de programas, conclusões e referências Para finalizar...

28 Exemplos de programas Ao vivo é melhor! =D

29 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)

30 Referências Programming Language Concepts and Paradigms - David A. Watt Programming language processors in Java - David A. Watt e Deryck F. Brown

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

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


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

Apresentações semelhantes


Anúncios Google