Você está na página 1de 41

INF25 Compiladores

Anlise Semntica

Etapas da Compilao
Anlise Lxica

Anlise Sinttica

Analise Semntica Gerao de Cdigo Intermedirio Gerao de Cdigo Final


2

Sumrio da Aula

Conceitos Bsicos Regras de Escopo Tabela de Smbolos Verificao de Tipos

Conceitos Bsicos

Esttico X Dinmico

Esttico

quando acontece durante a compilao

Dinmico

quando acontece durante a execuo

Esttico X Dinmico

Esttico

Alocao/desalocao de variveis locais Descoberta de tipos em expresses numricas

Dinmico

Alocao na heap com malloc (em C) Verificao de cast de classes (em Java) Verificao de limites de arrays (em Java)
6

Anlise Semntica

Faz verificaes estticas sobre o cdigo fonte

Exemplo: Se as variveis usadas foram declaradas

Prepara para etapas posteriores

Exemplo: Para cada nome de varivel usado, descobre se ele local ou global, qual o tipo, etc.
7

Semntica X Anlise Semntica

Semntica da Linguagem

Parte conceitual da linguagem Envolve tudo que diz respeito ao significado de um programa

Envolve caractersticas estticas e dinmicas Interfere no desenvolvimento de todas as fases posteriores anlise sinttica

Anlise Semntica

Parte do compilador Verifica apenas algumas das regras da semntica da linguagem Outro nome usado (mais adequado) "Anlise Contextual"
8

Anlise Semntica

Dois principais aspectos tratados pela anlise semntica

Regras de escopo Regras de tipo (verificao de tipos)

Regras de Escopo

Regras de Escopo

Escopo partes do cdigo onde um nome vlido

Variveis, classes, procedimentos, tipos abstratos

Regras de escopo

Dizem em que pontos do programa um nome vlido Dizem como cada ocorrncia de um nome deve ser ligada sua definio

11

Tipos de Escopo

Existem dois tipos de escopo

Esttico

Dinmico

12

Escopo Esttico

O escopo de um nome est implicitamente definido pelo lugar onde foi declarado o tipo mais conhecido

13

Escopo Esttico

Em escopo esttico, pode haver uma estrutura hierrquica de escopos

Exemplo: blocos aninhados

Variveis de um escopo mais interno acessam variveis do escopo externo, mas no o contrrio Nome escondido

Quando definido um nome igual a outro de um escopo mais externo


14

Escopo Esttico

Blocos aninhados (C ou Java)


int a = 1; int b = 10; { int a = 2; b += a; } b += a;

Qual o valor de b ?
15

Escopo Esttico e OO

Classes introduzem um novo escopo para os seus membros

Acesso interno normal

Porm, esses membros podem ser acessados por escopos externos

Sintaxe em Java: <obj>.<membro>

Modificadores permitem controle sobre o acesso externo aos nomes


16

Escopo Dinmico

Um nome local em um procedimento s ser associado a alguma declarao quando o procedimento for chamado Muito pouco usado Pode ser simulado com macros em C...

17

Escopo Dinmico

A varivel inc na macro INC() tratada parecido com o que acontece em escopo dinmico
#define INC(x) (x + inc) int main() { int inc = 1; printf("%d\n", INC(1)); } void func() { int inc = 10; printf("%d\n", INC(1)); }
18

Anlise Semntica

Percorre o cdigo fonte identificando usos de nomes e associando-os s suas declaraes respectivas

Levando em considerao o tipo de escopo

Exemplos de uso de nomes...

19

Anlise Semntica

Como manter as informaes sobre as declaraes?

20

Tabela de Smbolos

Tabela de Smbolos

Guarda informaes importantes relacionadas a cada nome (identificador) Operaes bsicas

get ou lookup recebe um nome e retorna as informaes put recebe um nome e a informao relacionada ele e guarda esse par
22

Tabela de Smbolos

A informao a ser guardada depende da necessidade Exemplos

Associa uma varivel com o lugar onde foi declarado Associa uma classe com outra tabela de smbolos (para sua lista de membros) Associa um procedimento com o seu tipo de retorno e sua lista de parmetros
23

Tabela de Smbolos

Implementao

Lista

Ineficiente

Hash table

Eficiente, mas difcil de implementar Java oferece as classes Hashtable e HashMap C++ oferece o template "map"
24

Tabela de Smbolos

Implementao de escopos aninhados

Cada escopo ter uma (sub)tabela prpria A tabela geral ser uma pilha dessas tabelas de escopos A cada incio de um novo bloco, cria uma nova tabela para o escopo e empilha Ao fim do bloco, desempilha
25

Tabela de Smbolos

Implementao de escopos aninhados (cont.)

Uma operao put ir adicionar na tabela que est no topo da pilha Uma operao de get dever procurar, primeiramente, na tabela do topo; se no encontrar, continua a busca na tabela imediatamente abaixo
26

Verificao de Tipos

Verificao de Tipos

O analisador semntico pode realizar diversas verificaes relacionadas aos tipos de dados Veremos a seguir...

28

Verificao de Tipos

Testa se as operaes recebem operandos dos tipos vlidos Infere tipos de expresses Exemplo: O projeto

O operador "&&" s pode ser aplicada a dois operandos inteiros O resultado inteiro
29

Verificao de Tipos

Cria converses automticas, onde for aplicvel

So chamadas coeres

Exemplo: C ou Java

Em uma multiplicao "1 * 3.13" (entre um inteiro e um float), o operando 1 convertido internamente para o valor float 1.0
30

Verificao de Tipos

Decide qual a verdadeira operao a ser executada em caso de overloading de operadores Exemplo: Java

O operador "+" usado para soma de valores numricos e concatenao de strings A escolha da operao certa depende dos operandos
31

Verificao de Tipos

Verifica parmetros em chamadas de procedimentos

Se a quantidade de parmetros est correta Se o tipo de cada parmetro real corresponde ao tipo do respectivo parmetro formal
32

Parmetros Formais e Reais

Parmetros formais so especificados na definio da funo

No exemplo: a e b

Parmetros reais so passados na chamada funo

No exemplo: 2*x e 10

void func(int a, char b) ... int main() { func(2 * x, 10); }


33

Verificao de Tipos

Verifica se o lado esquerdo de uma atribuio pode guardar valor Correto


int array[10]; array[0] = 3; *(array + 1) = 3;

Incorreto

(1020) = 3;

34

Anlise Semntica

Como vimos, no decorrer de toda a anlise semntica o compilador obtm mais informaes sobre cada trecho de cdigo

Tipos de cada expresso, associao entre os nomes e suas declaraes, etc. til para as etapas posteriores da compilao

Se esta etapa for realizada sobre a rvore sinttica, muitas dessas informaes podem ser acrescentadas na rvore

A sada seria uma rvore sinttica anotada


35

Anlise Semntica

Objetivos

Verifica estaticamente a consistncia da rvore sinttica por meio da aplicao de regras da linguagem Acrescenta arvore informaes sobre a estrutura lgica cdigo

Entrada/Sada

Entrada: rvore sinttica Sada: rvore sinttica anotada


36

Exerccios
A seguir sero mostrados alguns exemplos de compiladores simples que podem ser construdos com os conceitos vistos na disciplina de compiladores. Obs.: Grupos de no mximo 2 pessoas.

Gerador de Compiladores

Dada uma linguagem para definir gramticas livres de contexto, implemente um processador que produza uma tabela LL(1) necessria para implementao de um reconhecedor dessa gramtica.
Entrada Sada

X X Y Y

a X b Y c d Y

X Y

a aX error

b c d bY error error error c dY

38

Menus

Defina uma linguagem para representao de menus de uma interface grfica e um gerador de cdigo que produza uma implementao para menus a partir dessa descrio.
Traduo class M { MenuBar main; SubMenu m1, m2; M() { main = new MenuBar(); m1 = new SubMenu(File); m1.add(Open); m1.add(Exit); m2 = new SubMenu(Edit); m2.add(Copy); m2.add(Paste); main.add(m1);main.add(m2); } }

Cdigo Fonte menu M { submenu File { Item Open Item Exit } submenu Edit { Item Copy Item Cut Item Paste } }

39

Gerador de rvores Sintticas

Dada uma linguagem para definio de rvores sintticas, produza um gerador que automaticamente implemente a rvore sinttica reconhecida
Cdigo Compilado class Exp { } class ConstNum extends Exp { int n1; } class Soma extends Exp { Exp n1,n2; } class Cmd { } class If extends Cmd { Exp n1; Cmd n2; Cmd n3; } class Skip extends Cmd { }

Entrada Tree Exp = ConstNum(int) | Soma(Exp,Exp). Tree Cmd = If (Exp, Cmd, Cmd) | Skip.

40

Validador XML

De forma simplificada, a linguagem XML formada por textos e marcaes (<tag> Texto XML </tag>) . Construa um processador que reconhea um arquivo XML e faa as seguintes verificaes:

Se o nome da marcao que encerra uma seo do documento o mesmo que inicia uma seo (Identificar documentos com erros da forma: <HTML> Texto </TITLE>) Construa uma funo que automaticamente substitua um tag por um documento XML (de <A> oi </A> para <BOLD> <ITALICO> oi </ITALICO> </BOLD>)
41

Você também pode gostar