Tipos Explícitos e Tipos Polimórficos para LF1
Alexandre BarzaJosé BenitoLaís Neves
RoadMap
• Parte 1 – Implementação dos tipos explícitos
• Parte 2– Melhoria das mensagens de erros de tipos– Implementação de tipos polimórficos para
funções
BNF ModificadaExpDeclaracao ::= "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
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 + 1let var a : string = "hello" in a ++ "world”letvar b : boolean= true in b and true
• Declaração de Funçãolet fun prod : int int -> int x y =
if y == 0then 0else 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)
public <T0, T1> int sec(T0 x, T1 y){return x;
}
public <T0, T1> T0 sec1(T0 x, T1 y){
return y;}
Erros em tempo de compilação!Erros em tempo de compilação!
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;
}
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;}
Tipos Polimórficos em LF1
let fun sec : T0 T1 -> int x y = x in sec(1, 2)
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 IncorretosExemplos Incorretos
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)
Exemplos CorretosExemplos Corretos
Análise da Implementação
• DefFuncao
Novos Atributos
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
Verifica se Tipos Primitivos são Compatíveis
Tipo Função
Verifica os tipos polimórficos após eles
terem sido inferidos
Tipo Polimórfico
• Método eIgual(Tipo tipo)
Apenas compara se tokens forem
iguais
Demonstração