Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouManoela Sol Alterado mais de 10 anos atrás
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 <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) 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) <dias, DefType(<(dom, ConstEnum), (seg, ConstEnum), (ter, ConstEnum), (qua, ConstEnum), (qui, ConstEnum), (sex, ConstEnum), (sab, ConstEnum)>)> <(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çõ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 <dias, DefType(<(dom, ConstEnum), (seg, ConstEnum), (ter, ConstEnum), (qua, ConstEnum), (qui, ConstEnum), (sex, ConstEnum), (sab, ConstEnum)>)> <listaDias, DefType(<(null, ConstEnum), (obj, ConstTipoRecursivo(dias)), (lista, ConstTipoRecursivo(listaDias, listaDias))>)>
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 http://www.cin.ufpe.br/~if708 http://www.haskell.org/tutorial/goodies.html
31
Dúvidas... Sugestões...
32
DEFINIÇÃO DE TIPOS – LF3 PLP – Apresentação 2
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.