Escolar Documentos
Profissional Documentos
Cultura Documentos
Linguagens e Programao
Ana Madureira
Engenharia Informtica Ano Lectivo: 2011/2012
30/04/2012
30/04/2012
Tabelas multinvel
Nas linguagens estruturadas por blocos necessrio tomar nota de alguma forma do scope dos nomes Geralmente a prpria estrutura da tabela reflecte o embutimento dos blocos As operaes para este tipo de tabela incluem: create_scope(parent_scope) - cria um novo nvel, embutido no parent_scope, retornando um seu apontador insert(scope, x) - coloca o nome x no nvel scope (ocorrncias definidoras) lookup(x) - procura o nome x, comeando no scope mais prximo, retornando a sua posio na tabela (ocorrncias aplicadas) lookup_last(x) - procura apenas no nvel mais recente delete_scope(scope) - retira da tabela todo o nvel correspondente ao scope scope
30/04/2012
Verificao de tipos
O compilador deve verificar: Tipos de dados dos operandos, fornecidos a um operador, e a respectiva definio do operador so legais e compatveis; isto deve, verificar se esto de acordo com o sistema de tipos definido na linguagem
O sistema de tipos define para cada operador da linguagem e/ou construo gramatical, os tipos dos operandos e os tipos dos resultados possveis As linguagens, para as quais todos os erros relacionados com o sistema de tipos podem ser detectados e identificados durante a compilao, dizem-se estaticamente tipadas (ou fortemente tipadas) As linguagens, para as quais pode ser necessrio, durante a execuo dos programas, fazer verificaes de tipos, a fim de detectar erros, dizem-se dinamicamente tipadas (Prolog, Lisp, Scheme, p.ex.)
30/04/2012
Sistemas de tipos
Um sistema de tipos uma coleco de regras para associar expresses de tipos s vrias partes de um programa Os sistemas de tipos podem ser especificados atravs de definies dirigidas pela sintaxe, ou seja com atributos e aces semnticas As regras definidas num sistema de tipos, so regras que podem ser lidas em linguagem corrente como: Se ambos os operandos dos operadores aritmticos de adio, subtraco e multiplicao forem do tipo inteiro, ento o resultado dessa operao do tipo inteiro O resultado do operador unrio '&' o endereo do seu operando; se o tipo do operando for " ", o tipo do resultado "apontador para " A expresso "apontador para " uma expresso de tipos (operao sobre tipos)
30/04/2012
Expresses de tipos
Uma expresso de tipos qualquer expresso cujo resultado um tipo: pode ser um tipo bsico, ou o resultado da aplicao de um operador designado por construtor de tipo, a qualquer outra expresso de tipos. Os tipos bsicos e construtores dependem da linguagem. Tipos bsicos: so normais os seguintes - boolean, char, integer, real, void; um tipo bsico especial o tipo 'type_error', utilizado para marcar situaes de erro durante a verificao de tipos Certas linguagens permitem associar um nome (identificador) a tipos definidos pelo utilizador; para essas linguagens os nomes que designam tipos so tambm expresses de tipos Um construtor de tipo aplicado a uma expresso de tipos uma expresso de tipos
30/04/2012
Construtores de tipos
Arrays - Seja T uma expresso de tipos; ento array(I, T) uma expresso que representa o tipo de um array com elementos do tipo T e conjunto de ndices I; geralmente I um subconjunto (subrange) dos inteiros Subrange Seja T um tipo simples ordenado; ento subrange(min, max, T) uma expresso que representa o conjunto dos valores t: {t T e min t max} Registos - Este construtor associa nomes e tipos dos campos de um registo ou estrutura Exemplo: record((address integer) (lexeme array(1..15, char))) define um tipo registo com 2 campos (address e lexeme) do tipo integer e array de char (com posies de 1 a 15)
Construtores de tipos
Apontadores - A expresso (de tipos) apontador(T), em que T tambm uma expresso, designa um tipo que um apontador para um objecto de tipo T Funes - Associa-se tambm um tipo s funes. O respectivo construtor normalmente notado por . O tipo de funo escreve-se D C, em que D o tipo do domnio da funo e C o do contradomnio (ou resultado); quando os parmetros de entrada so mais do que um, o tipo do domnio representado por um produto cartesiano Exemplo: A seguinte funo em Pascal function f (a, b : char) : integer; tem tipo: char char pointer(integer) Variveis - Em certas situaes pode haver necessidade de ter, em expresses de tipos, variveis que representam tipos
30/04/2012
Esta linguagem produz programas compostos por declaraes (D), seguidas de instrues (S) As declaraes associam tipos (T) a identificadores; possui 3 tipos bsicos (char, integer e boolean), alm de apontadores e arrays. Os arrays so declarados com um nico valor de ndice, assumindo-se que este vai de 1 at esse valor; assim a declarao: array[256] of char corresponde a um array de 256 caracteres com ndices que vo de 1 a 256. No sistema de tipos a implementar usam-se ainda os nomes simples type_error, usado para assinalar erros e o valor void, associado s instrues sem erro. Como na 1 produo o D aparece antes de S, todas as declaraes devero estar feitas antes das instrues. Um programa gerado por esta gramtica poder ser: key : integer; result : boolean; result = key < 1999
30/04/2012
{ addtype(id.entry, T.type) } T char { T.type = char } T integer { T.type = integer } T boolean { T.type = bool } T array [ num ] of T1 { T.type = array(1..num.val, T1.type) } T T1 { T.type = pointer(T1.type) }
E E1 [ E2 ]
E E1 < E2
E E1 and E2
E E1
30/04/2012
S id = E S if E then S1 S while E do S1 S S1 ; S2
{ S.type = (E.type == lookup(id.entry)) ? void : type_error } { S.type = (E.type == bool) ? S1.type : type_error } { S.type = (E.type == bool) ? S1.type : type_error } { S.type = (S1.type == void && S2.type == void) ? void : type_error }
Verificao de funes
Embora a gramtica que nos serviu de exemplo at ao momento no inclua funes, vamos acrescent-las agora, considerando somente funes de um parmetro. A sua declarao (associao de um nome ao tipo de funo) pode ser feita acrescentando a seguinte regra para tipo: T T1 T2 A seta que aparece entre plicas um terminal da linguagem; uma declarao de uma funo, com aquela regra poderia ser: func : char integer que nos diz que func uma funo de argumento de tipo char com resultado de tipo inteiro. Para permitir a chamada de funes teramos agora de acrescentar mais uma regra s expresses: E E1 (E2) As regras semnticas de verificao de tipos poderiam ser:
T T1 T2 E E1 (E2) { T.type = T1.type T2.type } { E.type = (E2.type == s && E1.type == s t) ? t : type_error }
10
30/04/2012
Overloading de operadores
Diz-se que um operador est overloaded se tiver significados diferentes, dependentes do contexto Por exemplo, quando se usa um operador aritmtico, tal como +, normalmente este pode ser aplicado a inteiros, reais ou ainda a outros tipos, sendo assim necessrio verificar em que contexto aplicado para que se possa reconhecer o seu significado e, possivelmente, proceder converso de tipo de algum dos operandos : com A e B inteiros com A e B reais com A e B complexos Um operador overloaded, em cada situao, s poder ter um nico significado; no so permitidas ambiguidades A resoluo de uma situao de overloading designa-se por identificao de operadores A+ B
Nestes casos os esquemas de verificao de tipos j abordados anteriormente servem para a resoluo da situao de overloading presente
11
30/04/2012
(3 * 5) * z (2) (3)
O tipo do operador * na expresso com dois operandos inteiros no pode ser determinado conhecendo apenas os operandos
Exemplo (cont.)
Aps as declaraes anteriores, a expresso 3 * 5 tanto pode ser do tipo integer como do tipo complex, dependendo do seu contexto. Se a expresso completa 2 * (3 * 5), ento 3 * 5 ser do tipo integer. Mas se a expresso for (3 * 5) * z e se z for declarada como complex, ento 3 * 5 ser do tipo complex Soluo possvel: propagao dos tipos na rvore de parse, usando a notao ps-fixa e uma ordem de visita dos ns primeiro em profundidade
Expresso 3 * 5
Expresso (3 * 5) * z
12
30/04/2012
Polimorfismo
Funes polimrficas funes em que as instrues do seu corpo podem ser executadas com argumentos de diferentes tipos Funes polimrficas facilitam a implementao de algoritmos que manipulem estruturas de dados, independentemente do seu tipo A implementao de um mdulo de verificao de tipos pode ser dificultado no caso de linguagens com funes polimrficas Exemplo:
int max(int, int) - extrai o mximo entre dois inteiros int max(const int *, int) - extrai o mximo de um array de inteiros
Polimorfismo
Consideremos o seguinte pseudo-cdigo: A funo deref tem o mesmo efeito que os operadores do function deref(p); Pascal e * do C. begin p (do tipo ) um apontador para um objecto de tipo return p desconhecido . = pointer() end;
,point er( )
deref
Vamos usar uma linguagem para verificar funes polimrficas, gerada a partir da seguinte gramtica: P D; E D D; D | id : Q Q type_variable, Q | T T T T | basic_type | type_variable | (T) E E(E) | E, E | id
13
30/04/2012
Lb1 : Lb2 Lb1 subexpresso Polimorfismo Lb2 tipo da subexpresso Os programas gerados por esta gramtica so constitudos por uma sequncia de declaraes, seguido pela expresso E que se pretende verificar, por exemplo: deref: ,point er() deref q : pointer(pointer(integer)); deref(deref(q)) A rvore de parse para a expresso derefo(derefi(q)), cujo tipo se pretende verificar a seguinte:
pointer(o)=pointer(integer) aplicao : i
o=integer
i=pointer(integer)
q : pointer(pointer(integer))
14