tipos explícitos e tipos polimórficos para lf1 alexandre barza josé benito laís neves

17
Tipos Explícitos e Tipos Polimórficos para LF1 Alexandre Barza José Benito Laís Neves

Upload: internet

Post on 16-Apr-2015

110 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Tipos Explícitos e Tipos Polimórficos para LF1 Alexandre Barza José Benito Laís Neves

Tipos Explícitos e Tipos Polimórficos para LF1

Alexandre BarzaJosé BenitoLaís Neves

Page 2: Tipos Explícitos e Tipos Polimórficos para LF1 Alexandre Barza José Benito Laí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

Page 3: Tipos Explícitos e Tipos Polimórficos para LF1 Alexandre Barza José Benito Laís Neves

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

Page 4: Tipos Explícitos e Tipos Polimórficos para LF1 Alexandre Barza José Benito Laís Neves

Parser Modificado

Tokens de tipos

Page 5: Tipos Explícitos e Tipos Polimórficos para LF1 Alexandre Barza José Benito Laís Neves

Parser Modificado

Regra Tipo

Page 6: Tipos Explícitos e Tipos Polimórficos para LF1 Alexandre Barza José Benito Laís Neves

Parser Modificado

Regra Tipo Polimórfico

Page 7: Tipos Explícitos e Tipos Polimórficos para LF1 Alexandre Barza José Benito Laís Neves

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)

Page 8: Tipos Explícitos e Tipos Polimórficos para LF1 Alexandre Barza José Benito Laís Neves

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!

Page 9: Tipos Explícitos e Tipos Polimórficos para LF1 Alexandre Barza José Benito Laís Neves

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;

}

Page 10: Tipos Explícitos e Tipos Polimórficos para LF1 Alexandre Barza José Benito Laís Neves

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

Page 11: Tipos Explícitos e Tipos Polimórficos para LF1 Alexandre Barza José Benito Laís Neves

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

Page 12: Tipos Explícitos e Tipos Polimórficos para LF1 Alexandre Barza José Benito Laís Neves

Análise da Implementação

• DefFuncao

Novos Atributos

Page 13: Tipos Explícitos e Tipos Polimórficos para LF1 Alexandre Barza José Benito Laís Neves

DefFuncao

Empilhamento dos Tipos

Checagem de Tipos da Expressão

Checagem de Tipos da Imagem

Page 14: Tipos Explícitos e Tipos Polimórficos para LF1 Alexandre Barza José Benito Laís Neves

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

Page 15: Tipos Explícitos e Tipos Polimórficos para LF1 Alexandre Barza José Benito Laís Neves

Tipo Função

Verifica os tipos polimórficos após eles

terem sido inferidos

Page 16: Tipos Explícitos e Tipos Polimórficos para LF1 Alexandre Barza José Benito Laís Neves

Tipo Polimórfico

• Método eIgual(Tipo tipo)

Apenas compara se tokens forem

iguais

Page 17: Tipos Explícitos e Tipos Polimórficos para LF1 Alexandre Barza José Benito Laís Neves

Demonstração