14
1 Diego Machado Dias Rodrigo Cézar Luna dos Santos Weslley Silva Torres

1 Diego Machado Dias Rodrigo Cézar Luna dos Santos Weslley Silva Torres

Embed Size (px)

Citation preview

Page 1: 1 Diego Machado Dias Rodrigo Cézar Luna dos Santos Weslley Silva Torres

1

Diego Machado DiasRodrigo Cézar Luna dos Santos

Weslley Silva Torres

Page 2: 1 Diego Machado Dias Rodrigo Cézar Luna dos Santos Weslley Silva Torres

2

Ponteiros e Procedimentos de alta ordem em

Linguagem Imperativa 2

Page 3: 1 Diego Machado Dias Rodrigo Cézar Luna dos Santos Weslley Silva Torres

Versões:

Ponteiros com aritmética (LI2P1)Ponteiros sem aritmética + Procedimentos de alta ordem (LI2P2)

Page 4: 1 Diego Machado Dias Rodrigo Cézar Luna dos Santos Weslley Silva Torres

Gramática LI2PI

Atribuicao ::= Id ":=" Expressao | “*” Id ":=" Expressao

ExpUnaria ::= … | “*” Expressao | “&” Id

DeclaracaoVariavel ::= "var" Id "=" Expressao | “var *” Id = Expressao

Note: Observe que o operador “*” é seguido de uma expressão, desta forma, é dereferenciar uma expressão, esta decisão de projeto habilita aritmética de ponteiros.

Page 5: 1 Diego Machado Dias Rodrigo Cézar Luna dos Santos Weslley Silva Torres

ContextoExecucaoImperativa

Como funciona?1. Fornece uma implementação para interface Ambiente

2. Faz um mapeamento direto entre identificadores e valores

O que mudamos?1. Reestruturamos o mapeamento entre identificadores e valores,

para torná-lo mais concreto, mapeando identificadores em

endereços e endereços em valores.

Page 6: 1 Diego Machado Dias Rodrigo Cézar Luna dos Santos Weslley Silva Torres

ContextoExecucaoImperativa

• Preservamos a assinatura dos métodos

incrementa() : void

restaura() : void

map(idArg : Id, valorId : T) : void

get(idArg : Id) : T

• Adicionamos novos métodos getAddress(idArg : Id) : Integer

getValue (adress : Integer) : T

proximoEndereco() : Integer

Page 7: 1 Diego Machado Dias Rodrigo Cézar Luna dos Santos Weslley Silva Torres

ContextoExecuçãoImperativa{ var a = 33, var b = “PLP”, var c = true, var *p = &a}

Implementação LI2P1Ponteiros não possuem tipo

especifico.

Page 8: 1 Diego Machado Dias Rodrigo Cézar Luna dos Santos Weslley Silva Torres

ContextoExecuçãoImperativa{ var a = 33, var b = “PLP”, var c = true, var *p = &a}

Implementação LI2P2Ponteiros não possuem tipo

especifico.

Page 9: 1 Diego Machado Dias Rodrigo Cézar Luna dos Santos Weslley Silva Torres

Gramática LI2P2

Atribuicao ::= Id ":=" Expressao | “*” Id ":=" Expressao

ExpUnaria ::= … | “*” Id | “&” Id

DeclaracaoVariavel ::= "var" Id "=" Expressao | “var *” Id = Expressao

Valor ::= ValorConcreto | ValorAbstrato

ValorAbstrato ::= ValorProcedimento

ValorProcedimento = “pc” “(“ ListaDeclaracaoParametro “)”

“{“ Comando “}”

Tipo ::= … | “ptrstr” | “ptrint” | “ptrbool” | “<” ListaTipo ”>”

ListaTipo ::= Tipo | Tipo, ListaTipo

Page 10: 1 Diego Machado Dias Rodrigo Cézar Luna dos Santos Weslley Silva Torres

•Ponteiros passam a ter tipos internos: PTRINTEIRO, PTRBOOLEANO, PTRSTRING;

• Ao ocorrer uma atribuição ao local apontado por um ponteiro, é verificado se o tipo do local apontado é compatível com o tipo da expressão r-value (lvalue := rvalue);

• Operadores binários podem verificar se os tipos dos operandos estão de acordo com os tipos esperados (ex: *a+*b, *a and *b);

•Eliminamos a possibilidade de definir ponteiros para ponteiros e fazer aritmética de ponteiros.

Page 11: 1 Diego Machado Dias Rodrigo Cézar Luna dos Santos Weslley Silva Torres

Procedimentos de alta ordem(LI2P2)

Page 12: 1 Diego Machado Dias Rodrigo Cézar Luna dos Santos Weslley Silva Torres

• Na Linguagem Imperativa 2 (LI2), procedimentos não possuem status de valor, desta forma, não podem ser atribuídos à variáveis nem ser passados como parâmetros.

• Na LI2P2 procedimentos passam a ser um valores

• O ContextoExecucaoImperativa2 em LI2P2 só possui o mapeamento de identificadores em valores. O mapeamento de identificadores em procedimentos foi eliminado.

•Um programa é um comando

Page 13: 1 Diego Machado Dias Rodrigo Cézar Luna dos Santos Weslley Silva Torres

Como expressar o tipo de um procedimento?

Tipo ::= … | “ptrstr” | “ptrint” | “ptrbool” | “<” ListaTipo ”>” ListaTipo ::= Tipo | Tipo, ListaTipo

Exemplo: proc somaCondicional (int a, int b, boolean c) { if c == true then write (a+b) else skip };

TIPO (somaCondicional) = <int, int, boolean>

Page 14: 1 Diego Machado Dias Rodrigo Cézar Luna dos Santos Weslley Silva Torres

Todos na torcida!!Validação dos interpretadores.Parte 1: Ponteiros sem aritmética

Parte 2: Ponteiros com aritmética + Procedimento de alta ordem