PLP – Paradigma de Linguagens de Programação Tipos recursivos parametrizados
Motivação Linguagem Base LF2 A linguagem LF2 não permite definir tipos, e consequentemente não permite definir tipos recursivos. Introduzir tipos livres, comuns em programação funcional. Permitir a definição do parâmetro em tempo de execução
Conceitos Inseriridos Definição de Tipos Enumerados (Parte 1) Definição de Tipos Recursivos (Parte 1 e 2) Definição de Tipos Recursivos com parametrização (Parte 2)
Linguagens que utilizam estes conceitos Recursão de Tipos Haskell data List a = Nil | Cons a (List a) Tipos Parametrizados Java -> Generics public class PilhaGenerica<T> { private List<T> elementos; private int topo; ... }
O que Muda na BNF? Valor ::= ValorConcreto | ValorAbstrato ValorConcreto ::= ValorInteiro | ValorBooleano | ValorString ValorAbstrato ::= Id | ValorEnum | ValorFuncao ValorFuncao ::= "fn" Id Id "." Expressao ValorEnum ::= Id “.” ValorTupla | Id “.” Valor ValorTupla ::= “(“Expressão“,” ListExp ”)”
O que Muda na BNF? ListaDeclaracao ::= DeclaracaoFuncional | DeclaracaoTipos | DeclaracaoFuncional “,” ListaDeclaracao | DeclaracaoTipos “,” ListaDeclaracao DeclaracaoFuncional ::= DecVariavel | DecFuncao DeclaracaoTipos ::= EnumType EnumType ::= “type” Id “<” ListId “>” “=” ListaTags ListaTags ::= Tag | Tag “|” ListaTags Tag ::= Id | Id “.” EspecTipo
O que Muda na BNF? EspecTipo ::= EspecTipoPrimitivo | EspecTipoTupla | EspecTipoAbstract EspecTipoAbstract ::= Id | Id EspecTipoParam EspecTipoParam ::= “<”ListaEspecTipoPrimitivo”>” | “<”ListId”>” ListaEspecTipoPrimitivo ::= EspecTipoPrimitivo | EspecTipoPrimitivo ”,” ListaEspecTipoPrimitivo EspecTipoPrimitivo ::= “Int” | “Bool” | “String” EspecTipoTupla ::= “(“ EspecTipo “,” ListaEspecTipo “)” ListaEspecTipo ::= EspecTipo | EspecTipo ”,” ListaEspecTipo
O que Muda na BNF?
Checagem de tipos Método “Checatipo” de tipos primitivos é sempre TRUE; Método “Checatipo” de tipo tupla = “Checatipo” expressão esquerda && “Checatipo” expressão direita
Avaliar Método “Avaliar” do Valor Tupla Avalia cada EspecTipo Retorna um novo ValorTupla com os valores avaliados
Parametrização Os tipos Enum podem ter infinitos parâmetros Cada parâmetro é inicializado com o Tipo Indeterminado Na primeira ocorrência do parâmetro o tipo é atualizado.
Exemplo de utilização let type x<T> = s.string | b.(int,x) in s.”string” let type Arv<T> = Folha.T | Branch.(Arv,Arv) in let var t = Branch.(Branch.(Folha.1,Folha.2),Folha.3) in Branch.(t,Folha.5) let type x<T> = Vazia | cons.(T,x) in let fun isVazia x = if x==Vazia then true else false in isVazia(Vazia)
Considerações Finais e Trabalhos Futuros Suporte a tipos recursivos parametrizados já realizado. Tratamento de blocos aninhados (nested blocks) para dar suporte a casos como este: let type Arv<T> = Folha.T | Branch.(Arv<T>,Arv<string>, Arv<T>) in let var t = Branch.(Folha.5, Folha.“oi”, Folha.6)
Equipe: Liana Lisboa Jorge Oliveira Thiago Burgos Monitores: Rafael Oliveira, Joabe Jesus