Vous êtes sur la page 1sur 25

Anlise semntica

Funo, interao com o compilador Tabela de smbolos Anlise semntica

Prof. Thiago A. S. Pardo taspardo@icmc.usp.br

Estrutura geral de um compilador


programa-fonte analisador lxico Tabela de smbolos analisador sinttico analisador semntico Tabela de palavras e smbolos reservados gerador de cdigo intermedirio otimizador de cdigo gerador de cdigo programa-alvo dados de entrada sada
2

Manipulao de erros

Anlise semntica
Funo: verificao do uso adequado
Anlise contextual: declaraes prvias de variveis, procedimentos, etc. Checagem de tipos 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
3

Anlise semntica
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

Anlise artesanal, dependente da linguagem de programao


4

Anlise semntica
Semntica dirigida pela sintaxe
Contedo semntico fortemente relacionado sintaxe do programa Maioria das linguagens de programao modernas

Em geral, a semntica de uma linguagem de programao no especificada


O projetista do compilador tem que analisar e extrair a semntica
5

Formalizao e implementao
Assim como a sintaxe, a semntica precisa ser formalizada/descrita antes de ser implementada
Sintaxe: por exemplo, BNF recursivos procedimentos

Gramtica de atributos o formalismo de descrio da semntica comumente utilizado

Gramtica de atributos
Gramtica de atributos
Mtodo usualmente utilizado Conjunto de atributos e regras semnticas para uma gramtica
Cada regra sinttica/gramatical pode ter regras semnticas associadas

Atributos associados aos smbolos gramaticais


Por exemplo, valor e escopo
x.valor, x.escopo

Regras semnticas que manipulam os atributos


Por exemplo, regra para somar os atributos valores de duas variveis
x:=a+b, cuja regra x.valor:=a.valor+b.valor
7

Gramtica de atributos
Atributos podem ser fixados durante a compilao ou a execuo de um programa
A associao de um valor a um atributo chamada amarrao (ou vinculao) do atributo Acontece em tempo de amarrao
Em tempo de compilao, tem-se a amarrao esttica Em tempo de execuo, tem-se a amarrao dinmica

Gramtica de atributos
Exemplo de gramtica de atributos
exp exp + termo | exp - termo | termo termo termo * fator | termo div fator | fator fator ( exp ) | num
Regras gramaticais exp1 exp2+termo exp1 exp2-termo exp termo termo1 termo2*fator termo1 termo2 div fator termo fator fator (exp) fator num Regras semnticas exp1.val=exp2.val+termo.val exp1.val=exp2.val-termo.val exp.val=termo.val termo1.val=termo2.val*fator.val termo1.val=termo2.val/fator.val termo.val=fator.val fator.val=exp.val fator.val=num.val
9

Gramtica de atributos
Exerccio: escreva a gramtica de atributos para a gramtica abaixo
nmero nmero dgito | dgito dgito 0|1|2|3|4|5|6|7|8|9

10

Gramtica de atributos
Exerccio: escreva a gramtica de atributos para a gramtica abaixo
nmero nmero dgito | dgito dgito 0|1|2|3|4|5|6|7|8|9
Regras gramaticais nmero1 nmero2 dgito nmero dgito dgito 0 dgito 1 ... dgito 9 Regras semnticas nmero1.val=nmero2.val*10 + dgito.val nmero.val=dgito.val dgito.val=0 dgito.val=1 ... dgito.val=9
11

Gramtica de atributos
rvore sinttica com visualizao da computao de atributos
nmero (val=34*10+5=345) nmero (val=3*10+4=34) nmero (val=3) dgito (val=3) 3
12

dgito (val=5) 5

dgito (val=4) 4

Gramtica de atributos
Exerccio: escreva a gramtica de atributos para a gramtica abaixo
decl tipo var-lista tipo int | float var-lista id, var-lista | id

13

Gramtica de atributos
Exerccio: escreva a gramtica de atributos para a gramtica abaixo
decl tipo var-lista tipo int | float var-lista id, var-lista | id
Regras gramaticais decl tipo tipo tipo var-lista int float id, var-lista2 id Regras semnticas var-lista.tipo_dado = tipo.tipo_dado tipo.tipo_dado = integer tipo.tipo_dado = real id.tipo_dado = var-lista1.tipo_dado var-lista2.tipo_dado = var-lista1.tipo_dado id.tipo_dado=var-lista.tipo_dado
14

var-lista1 var-lista

Gramtica de atributos
Exerccio: construa a rvore sinttica com clculo dos atributos para a cadeia float x, y
decl tipo var-lista tipo int | float var-lista id, var-lista | id
Regras gramaticais decl tipo tipo tipo var-lista int float id, var-lista2 id Regras semnticas var-lista.tipo_dado = tipo.tipo_dado tipo.tipo_dado = integer tipo.tipo_dado = real id.tipo_dado = var-lista1.tipo_dado var-lista2.tipo_dado = var-lista1.tipo_dado id.tipo_dado=var-lista.tipo_dado
15

var-lista1 var-lista

Gramtica de atributos
Exerccio: construa a rvore sinttica com clculo dos atributos para a cadeia float x, y
decl tipo (tipo_dado=real) float var-lista (tipo_dado=real) , var-lista (tipo_dado=real) id (tipo_dado=real)

id (tipo_dado=real)

16

Gramtica de atributos
Ateno
Nem todo smbolo gramatical tem atributos Pode haver manipulao de mais de um atributo em uma mesma regra e para um mesmo smbolo Pode no haver regras semnticas para uma regra sinttica

Em geral, a gramtica de atributos de uma gramtica pode especificar


Comportamento semntico das operaes Checagem de tipos Manipulao de erros Traduo do programa

17

Gramtica de atributos
Gramtica para gerao de nmeros binrios ou decimais, indicados pelos sufixos b ou d, respectivamente
nmero num sufixo sufixo b|d num num dgito | dgito dgito 0|1|2|3|4|5|6|7|8|9

18

Gramtica de atributos
Escreva a gramtica de atributos
nmero num sufixo sufixo b|d num num dgito | dgito dgito 0|1|2|3|4|5|6|7|8|9

19

Gramtica de atributos
Regras gramaticais nmero sufixo sufixo num1 b d num2 dgito num sufixo Regras semnticas nmero.val = num.val num.base = sufixo.base sufixo.base = 2 sufixo.base = 10 num1.val = if dgito.val = erro or num2.val=erro then erro else num2.val * num1.base + dgito.val num2.base = num1.base dgito.base = num1.base num.val = dgito.val dgito.base = num.base dgito.val = 0 dgito.val = 1 dgito.val = if dgito.base=2 then erro else 2 ...
20

num dgito dgito dgito ...

dgito 0 1 2

10

Gramtica de atributos
Gramtica para gerao de nmeros binrios ou decimais, indicados pelos sufixos b ou d, respectivamente
nmero num sufixo sufixo b|d num num dgito | dgito dgito 0|1|2|3|4|5|6|7|8|9

A sintaxe permitiria o nmero 02b, mas a semntica no

21

Gramtica de atributos
Exerccio: construa a rvore sinttica com clculo dos atributos para a cadeia 10b

22

11

Gramtica de atributos
10b
num (val=2) (base=2) num (val=1) (base=2) dgito (val=1) (base=2) 1

nmero (val=2)

sufixo (base=2)

b dgito (val=0) (base=2)

23

Gramtica de atributos
Exerccio: construa a rvore sinttica com clculo dos atributos para a cadeia 02b

24

12

Gramtica de atributos
Ateno
Alguns valores sobem (val) Outros descem (base)
num (val=erro) (base=2) num (val=0) (base=2) dgito (val=0) (base=2) 0

nmero (val=erro)

sufixo (base=2) b

dgito (val=erro) (base=2)

Como calcular os atributos de forma consistente?

25

Cmputo de atributos
Com base na rvore sinttica explcita
Grafos de dependncia
Compilador de mais de uma passagem

Ad hoc
Anlise semntica comandada pela anlise sinttica
Compilador de uma nica passagem

26

13

Cmputo de atributos
Grafos de dependncia
Especificam a ordem de cmputo dos atributos de cada regra gramatical em uma rvore sinttica
Portanto, um grafo associado a cada regra gramatical

Para uma cadeia da linguagem, tem-se um grafo composto por todos os subgrafos

27

Cmputo de atributos
Exemplo
nmero nmero dgito | dgito dgito 0|1|2|3|4|5|6|7|8|9

Regras gramaticais nmero1 nmero2 dgito nmero dgito dgito 0 dgito 1 ... dgito 9

Regras semnticas nmero1.val nmero2.val*10 + dgito.val Nmero.val=dgito.val dgito.val=0 dgito.val=1 ... dgito.val=2 nmero1.val nmero2.val dgito.val
28

14

Cmputo de atributos
Cadeia 345
nmero (val=34*10+5=345) nmero (val=3*10+4=34) nmero (val=3) dgito (val=3) 3
29

Grafo de dependncia nmero.val

dgito (val=5) 5

nmero.val

dgito.val

dgito (val=4) 4

nmero.val

dgito.val

dgito.val

Cmputo de atributos
Grafo amarrado rvore sinttica
nmero nmero.val (val=34*10+5=345) nmero nmero.val (val=3*10+4=34) nmero (val=3) dgito (val=3) 3
30

dgito dgito.val (val=5) 5

nmero.val

dgito dgito.val (val=4) 4

dgito.val

15

Cmputo de atributos
Considere a gramtica abaixo e sua gramtica de atributos
decl tipo var-lista tipo int | float var-lista id, var-lista | id
Regras gramaticais decl tipo tipo tipo var-lista int float id, var-lista2 id Regras semnticas var-lista.tipo_dado = tipo.tipo_dado tipo.tipo_dado = integer tipo.tipo_dado = real id.tipo_dado = var-lista1.tipo_dado var-lista2.tipo_dado = var-lista1.tipo_dado id.tipo_dado=var-lista.tipo_dado
31

var-lista1 var-lista

Cmputo de atributos
Para a cadeia float x,y
decl tipo (tipo_dado=real) float var-lista (tipo_dado=real) id (tipo_dado=real) , var-lista (tipo_dado=real) id (tipo_dado=real)

32

16

Cmputo de atributos
Para a cadeia float x,y
decl tipo (tipo_dado=real) float var-lista (tipo_dado=real) id (tipo_dado=real) , var-lista (tipo_dado=real) id (tipo_dado=real)

33

Cmputo de atributos
Exerccio: considere a gramtica abaixo e sua gramtica de atributos
nmero num sufixo sufixo b|d num num dgito | dgito dgito 0|1|2|3|4|5|6|7|8|9

34

17

Cmputo de atributos
Regras gramaticais nmero sufixo sufixo num1 b d num2 dgito num sufixo Regras semnticas nmero.val = num.val num.base = sufixo.base sufixo.base = 2 sufixo.base = 10 num1.val = if dgito.val = erro or num2.val=erro then erro else num2.val * num1.base + dgito.val num2.base = num1.base dgito.base = num1.base num.val = dgito.val dgito.base = num.base dgito.val = 0 dgito.val = 1 dgito.val = if dgito.base=2 then erro else 2 ...
35

num dgito dgito dgito ...

dgito 0 1 2

Cmputo de atributos
Dada a rvore sinttica da cadeia 10b, construa o grafo de dependncia
num (val=2) (base=2) num (val=1) (base=2) dgito (val=1) (base=2) 1

nmero (val=2)

sufixo (base=2) b

dgito (val=0) (base=2)

36

18

Cmputo de atributos
Atributo base
num (val=2) (base=2) num (val=1) (base=2) dgito (val=1) (base=2) 1

nmero (val=2)

sufixo (base=2) b

nmero num1

num sufixo num.base = sufixo.base num2 dgito num2.base = num1.base dgito.base = num1.base dgito dgito.base = num.base

dgito (val=0) (base=2)

num

37

Cmputo de atributos
Atributo base e atributo valor
num (val=2) (base=2) num (val=1) (base=2) dgito (val=1) (base=2) 1

nmero (val=2)

sufixo (base=2) b

nmero num1

num sufixo nmero.val = num.val num2 dgito num1.val = num2.val * num1.base + dgito.val dgito num.val = dgito.val

dgito (val=0) (base=2)

num

38

19

Cmputo de atributos
Atributo base e atributo valor e dependncia do valor em relao base
num (val=2) (base=2) num (val=1) (base=2) num1 num2 dgito num1.val = if dgito.val = erro or num2.val=erro then erro else num2.val * num1.base + dgito.val dgito (val=1) (base=2) 1

nmero (val=2)

sufixo (base=2) b

dgito (val=0) (base=2)

39

Cmputo de atributos
Dois tipos de atributos
Atributos herdados: dependncias de pais para filhos e/ou entre irmos (p.ex., atributo base da gramtica anterior) Atributos sintetizados: dependncias apontam de filhos para pais (p.ex., atributo val da gramtica anterior)
Uma gramtica que s tem atributos sintetizados denominada gramtica S-atribuda
40

20

Cmputo de atributos
Ordem de cmputo dos atributos
Os atributos que no dependem de outros atributos devem ser computados primeiro, logicamente Opes
Ordenao topolgica do grafo de dependncias: mtodo de rvore de anlise sinttica Manualmente, determinado pelo projetista do compilador: mtodo baseado em regras

41

Cmputo de atributos
Ordenao topolgica
Vrias possibilidades e algoritmos num (val=2) (base=2)

nmero (val=2)

10

Em geral, inicia-se pelos atributos independentes dos ns folha Dificuldades do mtodo


Construo completa do grafo de dependncia Grafos acclicos para gramticas de atributos acclicas (um algoritmo para tal verificao exponencial em tempo) 3

sufixo (base=2) 9 b 1

num (val=1) (base=2) dgito (val=1) (base=2) 1

dgito (val=0) (base=2)

0 6

42

21

Cmputo de atributos
Mtodo baseado em regras
Adotado em praticamente todos os compiladores O projetista do compilador analisa a gramtica de atributos e seus grafos de dependncia e determina a ordem de cmputo dos atributos
Em geral, no muito complicado de se fazer

Para cada regra gramatical, definio do percurso realizado no trecho correspondente na rvore sinttica
Possibilidades: percurso em-ordem, pr-ordem, ps-ordem ou arbitrrio

43

Cmputo de atributos
Exemplos de percursos para uma rvore binria (relembrando ALG1)
Percurso em-ordem
Filho esquerdo, raiz (n pai, isto , lado esquerdo da regra em foco), filho direito

Percurso pr-ordem
Raiz, filho esquerdo, filho direito

Percurso ps-ordem
Filho esquerdo, filho direito, raiz

44

22

Cmputo de atributos
Exemplo: sub-rotina para computar o atributo tipo_dado da gramtica abaixo
decl tipo var-lista tipo int | float var-lista id, var-lista | id
Regras gramaticais decl tipo tipo tipo var-lista int float id, var-lista2 id Regras semnticas var-lista.tipo_dado = tipo.tipo_dado tipo.tipo_dado = integer tipo.tipo_dado = real id.tipo_dado = var-lista1.tipo_dado var-lista2.tipo_dado = var-lista1.tipo_dado id.tipo_dado=var-lista.tipo_dado
45

var-lista1 var-lista

Cmputo de atributos
Exemplo: sub-rotina para computar o atributo tipo_dado da gramtica abaixo
procedure AvalTipo(T: n_rvore); begin case n de T of decl: AvalTipo(tipo); var-lista.tipo_dado:=tipo.tipo_dado; AvalTipo(var-lista); tipo: if filho de T=int then T.tipo_dado:=inteiro else T.tipo_dado:=real; var-lista: atribui T.tipo_dado a primeiro filho de T if terceiro filho de T no NIL then atribui T.tipo_dado a terceiro filho; AvalTipo(terceiro filho de T); end; end;

pr-ordem

46

23

Cmputo de atributos
Opcionalmente, valores de atributos podem ser associados a parmetros ou valores de retorno de subrotinas de cmputo de atributos em vez de serem armazenados nos ns de uma rvore sinttica
Interessante para a situao em que muitos atributos so usados apenas temporariamente ou como suporte para cmputo de outros atributos Normalmente, atributos herdados so passados via parmetros e atributos sintetizados via valor de retorno

47

Cmputo de atributos
Exemplo
nmero num sufixo sufixo b|d num num dgito | dgito dgito 0|1|2|3|4|5|6|7|8|9

48

24

Cmputo de atributos
Regras gramaticais nmero sufixo sufixo num1 b d num2 dgito num sufixo Regras semnticas nmero.val = num.val num.base = sufixo.base sufixo.base = 2 sufixo.base = 10 num1.val = if dgito.val = erro or num2.val=erro then erro else num2.val * num1.base + dgito.val num2.base = num1.base dgito.base = num1.base num.val = dgito.val dgito.base = num.base dgito.val = 0 dgito.val = 1 dgito.val = if dgito.base=2 then erro else 2 ...
49

num dgito dgito dgito ...

dgito 0 1 2

function AvalComBase(T: n_rvore; base: inteiro): inteiro; var temp, temp2: inteiro; begin case n de T of nmero: temp:=AvalComBase(filho direita de T,0); return AvalComBase(filho esquerda de T,temp); num: temp:=AvalComBase(filho esquerda de T,base); if filho direita de T no NIL then temp2:=AvalComBase(filho direita de T,base); if temp<>erro and temp2<>erro then return base*temp+temp2 else return erro; else return temp; sufixo: if filho de T=b then return 2 else return 10; dgito: if base=2 and filho de T>1 then return erro else return numval(filho de T); end; end;

50

25

Vous aimerez peut-être aussi