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

Slides:



Advertisements
Apresentações semelhantes
|Introdução a Java para programadores Telis. Jogo de Dados simples O jogo é jogado por dois jogadores. Cada jogador faz sua jogada (lança um dado), e.
Advertisements

Tipos Explícitos e Tipos Polimórficos para LF1
Paulo Marques Hernâni Pedroso
Prof. Thiago Pereira Rique
Programação Básica em Java
JavaCC e JJTree Geração de compiladores implementados em Java
Rafael Pinto Frederico Corrêa
7 Abstração Genérica Unidades genéricas e instanciação.
JAVA ENUMS © 2009 by Jorge L. de Souza Leão março de 2009 PEE - COPPE/UFRJ.
Sobrecarga e Declaração de Operadores Rafael Fonseca e Romeu Guimarães.
Linguagem OperOR Agenda Descrição da Linguagem Funcionalidades BNF Limitações e Dificuldades Desenvolvimento Exemplos Dificuldades.
Classes e objetos Arrays e Sobrecarga
Estrutura de Dados em Java
Curso de extensão em Desenvolvimento Web
Implementar Listas em Linguagem Funcional II
Departamento de Estatística e Informática
Programação Orientada a Objetos com Java
Definição de tipos - LF3Definição de tipos - LF3 PLP - Apresentação 1.
Conceitos de Linguagem de Programação
Metaprogramação – API Reflection da linguagem Java
Atributos, Encapsulamento e Interface em Java
Bags n Servem para armazenar a repetição de elementos n Tal qual conjuntos, a ordem dos elementos não importa n Por isso, também recebem a designação de.
Teoria e Implementação de Linguagens Computacionais – IF688
Estudo dos Conceitos e Paradigmas de Programação
©André Santos, Programação Funcional Classes em Haskell André Santos.
Paradigmas de Linguagens de Programação BNF e Interpretador da Linguagem Orientada a Objetos Augusto Sampaio Jackson, Jean, Patrícia, Saulo Centro de Informática.
Linguagem Funcional 2 Linguagem Funcional 2 - LF2 Estende LF1 com funções de alta ordem Uma função passa a ser um valor O contexto inclui um único componente:
Paradigma Funcional Apresentação de LF1.
Linguagem de Expressões 2
Augusto Sampaio e Paulo Borba Centro de Informática
Augusto Sampaio e Paulo Borba Centro de Informática
Equipe: Fernando Calheiros Flavia Leite Eduardo Wagner
Classes, Objetos, Atributos e Métodos JAVA
Augusto Sampaio e Paulo Borba Gustavo Pinto Marcelo Queiroz
1 PLP – Varargs Adauto Trigueiro de A. Filho Emanoel Barreiros Helaine Lins.
JAVA Orientação a Objetos Sun Campus Ambassador Aula 5.
Orientação a Objetos e Java Graduação em Ciência da Computação
Laboratório I Mateus Raeder. Mateus Raeder – fevereiro de 2009 Sobrecarga de métodos  Definição de métodos visibilidade tipo de retorno nome do método.
Programação Orientada à Objetos
Emanuella Aleixo ( José Antônio Juliana Mafra Marcela Balbino
Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota
Java Kickstart, day 2 Semelhanças com linguagem C.
Melhorias e Mensagens Amigáveis ao Usuário Centro de Informática Universidade Federal de Pernambuco Bruno Felipe Marco André Paulo Fernando Rodolfo Santos.
Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota (com material da Qualiti Software Process)
Classes Abstratas e Interface
GESTOR: TIC/TIC-E&P/GIDSEP versão 1 - julho/2013 Tecgraf PUC-Rio Fevereiro de 2014 IDL.
George Darmiton da Cunha Cavalcanti
Construtores e Destrutores
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
Semântica de Linguagens de Programação
1 Diego Machado Dias Rodrigo Cézar Luna dos Santos Weslley Silva Torres.
1 Programação Multi-Paradigma Cristiano Bertolini – Ellison Siqueira – Guilherme Avelino –
1 Reestruturação das Linguagens da Disciplina “Paradigmas de Linguagens de Programação” para Java 1.5 Alunos: Angelo Ribeiro (arnpr) Eduardo Tavares (eagt)
©André Santos, Programação Funcional Tipos Algébricos André Santos.
Modificadores Programação II.
Copyright 2000, Departamento de Informática, UFPE. Todos os direitos reservados sob a legislação em vigor. Orientação a Objetos e Java.
PLP – Paradigma de Linguagens de Programação
Técnicas de IO em LF1/LF2 Diego Martins, Laís Xavier, Paulo Martinelli e Turah Xavier.
Concorrência em LF1 Paradigmas de Linguagens de Programação 20 de junho de 2006 Aline Timóteo Carlos Rodrigues Flávia Falcão Tiago Rolim.
Adriana Carla Projeto de PLP. 2 Roteiro Objetivos Alterações  Contextualização  BNF / Parser  checaTipo()  avaliar() Demonstração.
JavaCC.
Projeto II - PLP Prof. Augusto Sampaio
Padrão Visitor Paulo Mauricio Gonçalves Jr Rodrigo Teixeira Ramos Paradigmas de Linguagens de Programação Prof. Augusto Sampaio Julho de 2003.
Array e ArrayList LPOO – 01/09/14.
Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 IDL.
Implementar Listas em Linguagem Funcional II Projeto I - PLP Prof. Augusto Sampaio Equipe :Ana Paula Cavalcanti (apcc2) Clélio Feitosa (cfs) Zildomar C.
MATA56 Tipos, Verificação de Tipos Agenda Objetivo desta aula: Introduzir os principais aspectos semânticos de variáveis Palavras-chave – nomes.
1 Programação Multi-Paradigma Cristiano Bertolini – Ellison Siqueira – Guilherme Avelino –
Introdução à Orientação a Objetos em Java Prof. Gustavo Wagner (Alterações) Slides originais: Prof. Tiago Massoni Desenvolvimento de Sistemas FATEC-PB.
Transcrição da apresentação:

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

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

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

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

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

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)

Alteração na BNF Gramática

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

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

Características da Linguagem 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

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

Alteração na BNF Implementação

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)

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)

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

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

Diagrama UML - Contexto

Diagrama UML - Tipos novos

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

Alteração na BNF Parser

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

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); }

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

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

Exemplos de programas Ao vivo é melhor! =D

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)

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

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

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