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

Apr 16, 2015

Download

Documents

Internet User
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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