Vous êtes sur la page 1sur 38

Analise Semantica

Este material baseado nos materiais de autoria da profa. V. Feltrim


Lstrutura geral de um compilador
programa-fonte
analisador lxico
analisador sinttico
analisador semntico
gerador de cdigo intermedirio
otimizador de cdigo
gerador de cdigo
programa-alvo
Tabela de smbolos
Tabela de palavras e
smbolos reservados
Manipulao
de erros
dados de
entrada
sada
Analise semantica
Funo: verificao do uso adequado
Anlise contextual: declaraes prvias de variveis,
procedimentos, etc.
Checagem de tipos
Outras coisas que vo alm do domnio da sintaxe
Sensitividade ao contexto
Tipos de anlise semntica
Esttica em tempo de compilao: linguagens tipadas, que
exigem declaraes
C, Pascal, etc.
Dinmica em tempo de execuo: linguagens em que as
variveis so determinadas pelo contexto de uso
LISP, PROLOG
Analise semantica
Devido s variaes de especificao semntica
das linguagens de programao, a anlise
semntica:
No to bem formalizada
No existe um mtodo ou modelo padro de
representao do conhecimento
No existe um mapeamento claro da representao para o
algoritmo correspondente
A anlise artesanal e dependente da linguagem
de programao
Analise semantica
Semntica dirigida pela sintaxe
Contedo semntico fortemente relacionado sintaxe do
programa
Maioria das linguagens de programao modernas
Muitas vezes, a semntica de uma linguagem de
programao no claramente especificada
O projetista do compilador tem que analisar e extrair a
semntica
Analise semantica
Em geral, a gramtica de atributos de uma GLC
especifica:
Comportamento semntico das operaes
Checagem de tipos
Manipulao de erros
Traduo do programa
A gramtica de atributos diz quais aes sero
realizadas e quando
Pode ser uma ao de verificao semntica ou de
traduo
1abela de smbolos
Tabela de smbolos: estrutura essencial para a anlise
semntica
Permite saber durante a compilao de um programa o
tipo tipo e endere endere o o de seus elementos, escopo escopo destes,
nmero e tipo dos parmetros parmetros de um procedimento, etc.
Cada categoria de token tem atributos/informaes diferentes
associadas
Cadeia Token Categoria Tipo Endereo ...
i id var integer 1 ...
fat id proc - - ...
...
1abela de smbolos
Exemplo de atributos para identificador de varivel
Nome da varivel, tipo (inteira, real, etc.), escopo (global,
local, etc.), endereo na memria, etc.
Para vetores, ainda seriam necessrios atributos como o
tamanho do vetor, valor e tipo de seus limites, etc.
Exemplo de atributos para identificador de
procedimento
Nome do procedimento, lista de argumentos (nmero,
ordem e tipo), escopo, etc.
1abela de smbolos
Principais operaes na tabela de smbolos
Inserir: armazena na TS informaes fornecidas pelas
declaraes no programa
Busca: recupera da tabela informaes de um elemento
declarado no programa quando esse elemento utilizado
Remover: remove (ou torna inacessvel) da tabela
informaes sobre um elemento declarado que no se
mostra mais necessrio no programa (p.e., fora de escopo)
1abela de smbolos
A tabela acessada pelo compilador sempre que
um elemento mencionado no programa
Verificar ou incluir sua declarao
Verificar seu tipo, seu escopo ou alguma outra informao
Remover um elemento quando este no se faz mais
necessrio ao programa
1abela de smbolos
Questes de projeto
Estrutura da tabela de smbolos: determinada pela
eficincia das operaes de inserir, verificar e remover
Vrias possibilidades
Implementao
Esttica ou Dinmica (Melhor opo)
Estrutura
Listas lineares
rvores de busca
Hashing
Opo mais eficiente
O identificador a chave e a funo hash indica sua posio
na tabela de smbolos
Necessidade de tratamento de colises
1abela de smbolos
Questes de projeto
Tamanho da tabela: tipicamente, de algumas centenas a
mil campos
Dependente da forma de implementao
Na implementao dinmica, no necessrio se preocupar com
isso
Uma nica tabela para todas as declaraes ou vrias
tabelas, sendo uma para cada tipo de declarao
(constantes, variveis, procedimentos e funes)
Diferentes declaraes tm diferentes informaes/atributos
por exemplo, variveis no tm nmero de argumentos, enquanto
procedimentos tm
1abela de smbolos
Representao de escopo de identificadores do
programa
Vrias tabelas ou uma nica tabela com a identificao do
escopo para cada identificador
Tratamento de escopo
Insero de identificadores de mesmo nome, mas em nveis
diferentes
Remoo/bloqueio de identificadores cujos escopos deixaram de
existir
Blocos permitem a criao de escopos globais e locais.
1abela de smbolos
Exemplos de aes realizadas com acesso TS
Insero de elementos na tabela
Verificar se o elemento j no consta na tabela
Busca de informao na tabela
Realizada antes da insero
Busca de informaes para anlise semntica
Remoo de elementos da tabela
Tornar inacessveis dados que no so mais necessrios
Por ex., aps o escopo ter terminado
Linguagens que permitem estruturao em blocos
1abela de smbolos
program id corpo .
programa
inserir(lexema,token=id,cat=nome_prog)
program meu_prog ...
Insero de elementos na tabela
Declarao
Cadeia Token Categoria Tipo Endereo ...
meu_prog id nome_prog - - ...
A medida que novos elementos vo sendo inseridos pos2 (que indica a ltima posio da tabela) vai sendo "deslocado"
2
1abela de smbolos
var id real
declarao
de variveis
inserir(lexema,token=id,cat=var)
a partir de pos2 + 1
Cadeia Token Categoria Tipo Endereo ...
meu_prog id nome_prog - - ...
x id var integer ...
y id var integer ...
,
:
integer
pos1 e pos2 =ltima posio
alocada na tabela
inserir(tipo=real) a partir de
pos1+1 at pos2
inserir(tipo=integer) a partir de
pos1+1 at pos 2
var x, y: integer
pos1
pos
Exemplo
1abela de smbolos


procedure id real
declarao de
procedimentos
,
:
integer
id ( ) corpo
;
inserir(cadeia,token=id,cat=proc)
a partir de pos2 + 1
inserir(cadeia,token=id,cat=par)
a partir de pos2 + 1
inserir(tipo=real) a partir de
pos1+1 at pos2
inserir(tipo=integer) a partir de
pos1+1 at pos2
pos1 e pos2 =ltima posio
alocada na tabela
Lxemplo de procedimento
program id corpo .
programa
inserir(lexema,token=id,cat=nome_prog)
procedimento programa(Seg)
Inicio
se (token=t_program) ento prox_token(lexema,token)
seno ERRO(Seg+{id});
se (token=id) ento
inserir(lexema,id,nome_prog)
prox_token(lexema,token)
seno ERRO(Seg+P(corpo));
corpo(Seg+{.});
se (token=t_ponto) ento prox_token(lexema,token)
seno ERRO(Seg);
fim
1ratamento de escopo
A maioria das linguagens de programao implementa
escopo esttico e, para resolver conflito de nomes,
aplica a regra do contexto envolvente mais prximo
(escopo ancestral mais prximo)
Escopo esttico = escopo lxico
So criados por subprogramas ou blocos
Para vincular uma referncia a uma varivel, deve se encontrar a
declarao dessa varivel no escopo atual ou nos seus escopos
ancestrais
Variveis com o mesmo nome, mas em escopos diferentes,
escondem as variveis definidas no pai esttico
y nesse ponto tem um escopo local diferente do global
1ratamento de escopo
Como diferenciar variveis globais de locais na TS
Tratamento de variveis de mesmo nome, mas de escopos
diferentes
program meu_prog
var x, y: integer
procedure meu_proc(x: integer)
var y: real
begin
read(y);
x:=x+y
end;
begin
read(y);
x:=x*y
end.
y: integer est oculto neste ponto
1abela de smbolos
Possibilidades para tratamento de escopos
Incluso de um campo a mais na tabela de smbolos indicando o
nvel da varivel no programa
Controle do nvel durante a compilao do programa
Quando se chama um procedimento (ou funo), faz-se nvel:=nvel+1
Quando se sai de um procedimento (ou funo), faz-se nvel:=nvel-1
Busca do fim para inicio da TS a fim de encontrar a declarao mais recente
Associao das variveis locais a um procedimento (ou funo)
entrada relativa ao procedimento (ou funo) por meio, por
exemplo, de uma lista encadeada
Ateno: para a checagem de tipos, deve-se saber quantos so e
quais so os parmetros de um procedimento (ou funo) na tabela de
smbolos
Tabelas diferentes para diferentes escopos
1ratamento de
escopo
rvore de smbolos =
uma tabela para cada
escopo
1ratamento de escopo
program meu_prog
var x, y: integer
procedure meu_proc(x: integer)
var y: real
begin
read(y);
read(a);
x:=a+y
end;
begin
read(y);
x:=x*y
end.
global
meu_prog nomeProg
x var integer
y var integer
a var integer
meu_proc nomeProc
meu_proc
x param integer
y var real
1abela de smbolos
Busca de informao
Sempre que um identificador do programa
utilizado
comando e fator
Verifica-se se foi declarado, seu tipo, etc.
1abela de smbolos
id
fator
nmero real
nmero inteiro
( expresso )
busca(lexema,token=id,cat=var)
1abela de smbolos
comando
read
write
( ) id
,
:= id expresso
( ) id
;
busca(lexema,token=id,cat=var)
busca(lexema,token=id,cat=proc)
busca(lexema,token=id,cat=par)
busca(lexema,token=id,cat=var)
1ratamento semantico
Verificao do uso adequado dos elementos do
programa
Declarao de identificadores
Erro: identificador no declarado ou declarado duas vezes
Compatibilidade de tipos em comandos
Checagem de tipos
Concordncia entre parmetros formais e atuais, em
termos de nmero, ordem e tipo
o tipo "menor". O contrrio: sem problemas!
problema na atribuio do tipo "maior" para
1ratamento semantico
Declarao de identificadores
Verificado durante a construo da tabela de smbolos
Compatibilidade de tipos
Atribuio: inteiro:=inteiro, real:=inteiro, string:=cadeia de
caracteres
Normalmente, tem-se erro quando inteiro:=real
Converso implcita (coero) ou explcita dos tipos
Comandos de repetio: while booleano do..., if booleano then...
Expresses e tipos esperados pelos operadores: inteiro+inteiro,
real*real, inteiro+real, inteiro/inteiro, booleano and booleano
Erro: inteiro+booleano
Arrays: vetor[integer] ndice de um vetor um valor inteiro
1ratamento semantico
Concordncia entre parmetros formais e atuais,
em termos de nmero, ordem e tipo
Por exemplo, se declarado:
procedure p(var x: integer; var y: real)
Erros
procedure p(x:integer, y:integer) {erro de tipo}
procedure p(y:real, x:integer) {erro de ordem}
procedure p(x:integer) {erro de nmero}
Tratamento de escopo
Erro: varivel local a um procedimento utilizada no
programa principal
1ratamento semantico
Tipos
Bsicos (ou primitivos): booleano, char, inteiro, real
Estruturados: vetor, registro, ponteiro
Regras de compatibilidade de tipos
As regras de compatibilidade de tipos so geralmente da forma:
se duas expresses so equivalentes,
ento retorne um certo tipo, seno erro
Precisa-se ter uma definio exata de quando duas expresses so
equivalentes
Veriicaao de 1ipos
Atividade de assegurar que os operandos de um operador
possuem tipos compatveis
Entenda-se a atribuio como um operador binrio
Tipo compatvel: um tipo vlido para ser usado por um dado
operador ou um tipo que pode ser convertido implicitamente
em um tipo vlido (coero)
Coero: converso automtica de tipo
Definida no projeto da linguagem e embutida na implementao
Um erro de tipo a aplicao de um operador a um operando
de tipo inadequado
Lquialncia de 1ipos
Tipos primitivos: baseada no conceito de incluso
Tipos definidos pelo usurio: baseada no conceito de
equivalncia
Equivalncia estrutural: duas variveis tm tipos compatveis
se os seus tipos tiverem estruturas idnticas
Equivalncia nominal: duas variveis tm tipos compatveis
somente se estiverem na mesma declarao ou em declaraes
que usam o mesmo nome de tipo
Exemplo:
C usa equivalncia estrutural se os tipos forem primitivos e
nominal se os tipos forem estruturados
Exemplo de uma funo que converte milhas para quilmetros
e
i
Lquialncia de 1ipos
typedef float km;
typedef float mil ;
km mile2km (m le m) {
return (1.6093 * m);
}
main() {
mile s = 200;
km q = mile2km(s);
s = mile2km(q); //OK eq estrutural
}
Lquialncia de 1ipos
typedef struct {
int a;
} tipo1;
typedef struct {
int a;
} tipo2;
int soma(tipo1 x, tipo2 y){
return (x.a + y.a);
}
main(){
tipo1 x;
tipo2 y;
x.a = y.a = 1;
int z = soma(x,y); //OK
z = soma(x,x); //ERRO!
//eq nominal
}
Equivalncia nominal: duas variveis tm tipos compatveis
somente se estiverem na mesma declarao ou em declaraes
que usam o mesmo nome de tipo
1ratamento semantico
Sistema de tipos: coleo de regras que atuam
sobre os tipos bsicos da linguagem ou os
estruturados, definidos ou no pelo usurio
Um verificador de tipos implementa um
sistema de tipos, utilizando informaes sobre a
sintaxe da linguagem, a noo de tipos e as
regras de compatibilidade de tipos
1ratamento semantico
Verificador de tipos
Especificado na gramtica de atributos e
implementado como tal
Especificao do sistema de tipos
Compilao em mais de uma passagem, possivelmente
Comandado pela anlise sinttica
Compilao de uma nica passagem
1ratamento semantico
Exemplo: verificao de tipos na gramtica de
atributos
<exp>
1
::= <exp>
2
div id
se busca(id)=falso
ento ERRO(varivel no declarada)
seno se exp
2
.tipo<>inteiro ou busca(id.tipo)<>inteiro
ento ERRO(tipos invlidos para a operao)
seno
exp
1
.tipo=inteiro
exp
1
.val= exp
2
.val / id.val
div = operador de diviso
1ratamento semantico
Exemplo: verificao de tipos em uma regra sinttica de
atribuio de tipos iguais
procedimento atribuio(Seg)
Inicio
se (token = t_id)
ento prox_token(cadeia,token)
se busca(cadeia,token,cat=var)=FALSE
ento ERRO(varivel no declarada)
seno tipo1:=recupera_tipo(cadeia,token,cat=var);
seno ERRO(Seg+{t_atrib});
se (token = t_atrib)
ento prox_token(cadeia,token)
seno ERRO(Seg+{id});
tipo2 := expressao(Seg+{;});
se tipo1<>tipo2 ento ERRO(tipos incompatveis na atribuio);
se (token=t_ponto-virgula)
ento prox_token(cadeia,token)
seno ERRO(Seg+P(comandos));
fim
atribuio--> id=<expresso>;

Vous aimerez peut-être aussi