Upload
pedrohenrique-souto
View
215
Download
2
Embed Size (px)
Citation preview
1
Diego Machado DiasRodrigo Cézar Luna dos Santos
Weslley Silva Torres
2
Ponteiros e Procedimentos de alta ordem em
Linguagem Imperativa 2
Versões:
Ponteiros com aritmética (LI2P1)Ponteiros sem aritmética + Procedimentos de alta ordem (LI2P2)
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.
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.
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
ContextoExecuçãoImperativa{ var a = 33, var b = “PLP”, var c = true, var *p = &a}
Implementação LI2P1Ponteiros não possuem tipo
especifico.
ContextoExecuçãoImperativa{ var a = 33, var b = “PLP”, var c = true, var *p = &a}
Implementação LI2P2Ponteiros não possuem tipo
especifico.
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
•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.
Procedimentos de alta ordem(LI2P2)
• 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
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>
Todos na torcida!!Validação dos interpretadores.Parte 1: Ponteiros sem aritmética
Parte 2: Ponteiros com aritmética + Procedimento de alta ordem