Tipos Explícitos e Tipos Polimórficos para LF1 Alexandre Barza José Benito Laís Neves
RoadMap Parte 1 Parte 2 Implementação dos tipos explícitos Melhoria das mensagens de erros de tipos Implementação de tipos polimórficos para funções
BNF Modificada ExpDeclaracao ::= "let" DeclaracaoFuncional "in" Expressao DeclaracaoFuncional ::= DecVariavel | DecFuncao | DeclaracaoFuncional "," DeclaracaoFunciona DecVariavel::= “var” Id “:” Tipo “=” Expressao DecFuncao ::= “fun” Id “:” ListaTipo “->” Tipo ListaId “=” Expressao Tipo := “string” | “int” | “boolean” | TipoPolimorfico TipoPolimorfico := “T” <IDENTIFICADOR_NUMERICO> ListaTipo ::= Tipo | ListaTipo, ListaTipo Regra Modificada Nova Regra
Parser Modificado Barza! Tokens de tipos
Parser Modificado Regra Tipo
Parser Modificado Regra Tipo Polimórfico
Exemplos Tipos Explícitos Declaração de Variável let var x : int= 1 in x + 1 let var a : string = "hello" in a ++ "world” letvar b : boolean= true in b and true Declaração de Função let fun prod : int int -> int x y = if y == 0 then 0 else x + prod(x,y-1) in prod(3,3)
Antes um Breve Parênteses Tipos Polimórficos em Java Erro: tipos incompatíveis da imagem (int) e da expressão x (T0) Erro: tipos incompatíveis da imagem (T0) e da expressão y(T1) Erros em tempo de compilação! public <T0, T1> int sec(T0 x, T1 y){ return x; } let fun sec : T0 T1 -> T0 x y = y in sec(1, “true”) public <T0, T1> T0 sec1(T0 x, T1 y) { return y; }
Tipos Polimórficos em Java Erro: tipos incompatíveis da imagem (T0) e da expressão y (boolean) Erro: tipos incompatíveis da imagem (T0) e da expressão 2+1(int) public <T0> T0 sec2(T0 x, boolean y){ return y; } public <T0, T1> T0 sec3(T0 x, T1 y){ return 2+1; } let fun sec : T0 T1-> T0 x y = 2+1 in sec(1, true)
Tipos Polimórficos em Java Exemplos Corretos public <T0, T1> int sec4(T0 x, T1 y){ return 1+2; } public <T0, T1> T0 sec5(T0 x, T1 y) { return x; } Let fun sec : T0 T1 -> T0 x y = x in sec(1, true)
Tipos Polimórficos em LF1 let fun sec : T0 T1 -> int x y = x in sec(1, 2) Exemplos Incorretos let fun sec : T0 T1 -> T0 x y = y in sec(1, true) let fun sec : T0 boolean-> T0 x y = y in sec(1, true) let fun sec : T0 T1-> T0 x y = 2+1 in sec(1, true) Exemplos Corretos let fun sec : T0 T1 -> int x y = 1+2 in sec(1, true) let fun sec : T0 T1 -> T0 x y = x in sec(1, true)
Análise da Implementação DefFuncao Novos Atributos Lais
DefFuncao Empilhamento dos Tipos Checagem de Tipos da Expressão Checagem de Tipos da Imagem
DefFuncao Verifica se Imagem e Expressão são Tipos Polimórficos Verifica se Imagem e Expressão são Tipos Primitivos So compara se imagem e expressao forem ambas Primitivas ou Polimorficas Verifica se Tipos Primitivos são Compatíveis
Verifica os tipos polimórficos após eles terem sido inferidos Tipo Função Verifica os tipos polimórficos após eles terem sido inferidos
Apenas compara se tokens forem iguais Tipo Polimórfico Método eIgual(Tipo tipo) Apenas compara se tokens forem iguais
Demonstração