Escolar Documentos
Profissional Documentos
Cultura Documentos
Anlise Semntica
Etapas da Compilao
Anlise Lxica
Anlise Sinttica
Sumrio da Aula
Conceitos Bsicos
Esttico X Dinmico
Esttico
Dinmico
Esttico X Dinmico
Esttico
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
Exemplo: Para cada nome de varivel usado, descobre se ele local ou global, qual o tipo, etc.
7
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
Regras de Escopo
Regras de Escopo
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
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
Variveis de um escopo mais interno acessam variveis do escopo externo, mas no o contrrio Nome escondido
Escopo Esttico
Qual o valor de b ?
15
Escopo Esttico e OO
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
19
Anlise Semntica
20
Tabela de Smbolos
Tabela de Smbolos
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
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
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
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
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
Se a quantidade de parmetros est correta Se o tipo de cada parmetro real corresponde ao tipo do respectivo parmetro formal
32
No exemplo: a e b
No exemplo: 2*x e 10
Verificao de Tipos
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
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
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
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
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