Você está na página 1de 50

Compiladores II

Prof. Dr. Leandro B. S. Marques


email: profleandromarques@yahoo.com.br

Sumrio
Anlise Sinttica
Ascendente
Definio de handles
Algoritmo ShiftReduce
Conflitos

MEPA

Arquitetura
Expresses
Armazenamento
Desvios

Entrada e Sada (E/S)


Programa e Alocao
de Memria
Procedimentos
Parmetros por valor

Funes

Tabela de Smbolos
Anlise Semntica
Procedimentos para
anlise semntica

Exerccios

Introduo
A anlise sinttica ascendente (Bottom-Up),
tambm denominada de anlise redutiva (ou
ainda Shift-Reduce), analisa uma sentena de
entrada e tenta construir uma rvore de
derivao, comeando pelas folhas e
prosseguindo para a raiz, produzindo uma
derivao mais direita, na ordem inversa.
Podemos pensar na anlise ascendente como o
processo de reduzir uma sentena de entrada a
para o smbolo inicial S da gramtica.

Exemplo
Podemos pensar na anlise ascendente como o
processo de reduzir uma sentena de entrada a
para o smbolo inicial S da gramtica.
Seja a sentena abbcde e a gramtica a seguir:
S aABe
A Abc | b
Bd

Handles
Handles so sequncias de smbolos que so
lados direitos de produo, tais que suas
redues levam, no final, reduo para o
smbolo inicial da gramtica, atravs do reverso
de uma derivao mais direita.
Se uma gramtica G no-ambgua, ento toda
forma sentencial gerada por G tem um handle.

Analisador Sinttico ShiftReduce


A anlise Bottom-Up vai necessitar:
De uma pilha para guardar os smbolos
De um buffer de entrada para a sentena w a ser reconhecida.

Operaes:
empilha (shift):
coloca no topo da pilha o smbolo que est sendo lido e avana o
cabeote de leitura na string

reduz (reduce):
substitui o handle no topo da pilha pelo no terminal
correspondente

aceita:
reconhece que a sentena foi gerada pela gramtica

erro:
ocorrendo erro de sintaxe, chama uma subrotina de recuperao de
erros

Exemplo
Dada gramtica
E E+E | E*E | (E) | id

E a entrada id1+id2* id3, tem-se a sequncia de


redues apresentada na Tabela:

Exerccios
Exerccio1: Para a gramtica S SS+| SS* | a,
simule o funcionamento do analisador sinttico
ascendente para as entradas:
SSS+a*+

Conflitos
Existem gramtica livres de contexto onde
o analisador sinttico shift-reduce
conhecendo todo o contedo da pilha e o
prximo smbolo da entrada, no capaz
de decidir se empilha e avana ou reduz
(conflito shift-reduce).
Ou, no consegue decidir qual das vrias
redues possveis dever ser aplicada
(conflito reduce/reduce).

Algoritmos Shift-Reduce
Algoritmos que implementam o shiftreduce:
LR(0)
SLR(1)
LR(1)
LALR(1)

Fases de um Compilador

Anlise

Sntese

Contexto de um Compilador
Esqueleto do Programa Fonte
Pr-Processador
Programa Fonte
Compilador
Programa objeto em linguagem objeto
Montador
Cdigo de Mquina Realocvel
Carregador

Cdigo de mquina absoluto

Introduo
Cada construo do Pascal Simplificado
traduzida em uma ou mais instrues de
linguagem assembly.
Ao invs de traduzirmos os programas em
Pascal Simplificado para linguagem de
uma mquina real, definiremos uma
MQUINA HIPOTTICA e geraremos
cdigo na linguagem de montagem desta
mquina.

MEPA
MEPA Mquina de Execuo Para
Pascal/C
uma mquina virtual para execuo dos
programas escritos em Pascal Simplificado
(ou C).
Esta mesma sigla ser utilizada para denotar
a linguagem de montagem desta mquina.

Arquitetura

OBS: A pilha M ser acessada em qualquer ponto


e no apenas no topo.

Instrues MEPA p/ Operaes

Exemplo
Traduzir para MEPA
a seguinte expresso:
(A+3)*(C-10)

Notao ps-fixa:
A 3 + C 10 - *
ID

Endereo

Valor

38

10

16

52

20

Instrues MEPA:
CRVL 38
CRCT 3
SOMA
CRVL 52
CRCT 10
SUBT
MULT

Comando de Atribuio
O prximo passo atribuir o valor
resultante de um expresso (no topo da
pilha) para alguma varivel do programa.
Atribuio em Pascal :=
Instruo MEPA para atribuio:

Exemplo
Exemplo: a = a + b * c Instrues MEPA:
CRVL a
CRVL b
CRVL c
MULT
SOMA
ARMZ a

Desvios
Comandos Condicionais/Iterativos

Utilizaremos rtulos simblicos em lugar de


endereos de programa (interpretador da
MEPA aceita rtulos)

Desvios
if E then C1 else C2:
. . . (E)
DSVF L1
. . . (C1)
DSVS L2
L1: NADA
. . . (C2)
L2: NADA

while E do C:
L1: NADA
. . . (E)
DSVF L2
. . . (C)
DSVS L1
L2: NADA

Exerccios
Exerccio2: traduzir para MEPA as seguintes
expresses
1) if c < 5 then a := 1 else a := 2;
2) for b := 1 to 10 do c := c+1;

Comandos de Entrada e de Sada

Exemplos:
READ(a, b, ..., n)
LEIT
ARMZ a
LEIT
ARMZ b
...
LEIT
ARMZ n

Exemplos:
WRITE(a,b,c)
CRVL 38
IMPR
CRVL 16
IMPR
CRVL 52
IMPR

Exemplo
Considere o seguinte
comando em Pascal:
write(A+B,A*3,C)

Instrues MEPA
CRVL 38
CRVL 16
SOMA
IMPR
CRVL 38
CRCT 3
MULT
IMPR
CRVL 52
IMPR

Programas
Faltam ainda algumas informaes para que
possamos traduzir um programa simples: alocar
e liberar variveis, iniciar mquina virtual e
terminar mquina virtual. Estas instrues esto
listadas abaixo:

Programas
program
...
var x, y: integer;
...
Traduo para
instrues MEPA
end.

INPP
...
AMEM 2
...
DMEM 2
PARA

Exerccio
Exerccio3: traduzir para MEPA o
programa abaixo.
program ex02;
var a, b : integer;
c : integer;
begin
read (a, b);
if a > b then
c := a
else
c := b;
write (c);
end.

Procedimentos sem Parmetros


Ao trmino de execuo de um procedimento
necessrio retornar e executar o comando que
segue a chamada ao procedimento. Para tanto
deve-se armazenar o endereo de tal instruo.
Este endereo armazenado no topo da pilha
M e recuperado quando terminar a execuo do
procedimento.

Procedimentos sem Parmetros


program
...
procedure p;
...
end;
begin
...
p;
...
end.

Traduo para
instrues MEPA

INPP
...
DSVS incio
P: NADA
...
RTPR
incio NADA
...
CHPR p
...
PARA

Exerccios
Exerccio4: traduzir
para MEPA o
programa ao lado.

ID

Endereo

Valor

numero

10

10

percentual

20

program ex04;
var
numero, percentual: integer;
procedure calcula_percentual();
begin
percentual := numero*0.2;
end;
begin
writeln('Digite o nmero');
readln(numero);
calcula_percentual();
writeln(percentual);
end.

Parmetros por Valor


Parmetros formais passados por valor
comportam-se como variveis locais cujos
valores so inicializados com valores dos
parmetros efetivos.

Parmetros por Valor

Observe como a execuo do modelo acima:


1. Dentro do programa principal, empilha-se o parmetro (CRCT 2).
2. Chama-se o procedimento
3. Na sada, a instruo RTPR deve desalojar os N parmetros.

Exerccios
Exerccio5: traduzir
para MEPA o
programa ao lado.

ID

Endereo

Valor

38

10

num

20

program ex05;
var
a: integer;
procedure dobro(num: integer);
begin
num := num*2;
writeln(num);
end;
begin
writeln('Digite o nmero');
readln(a);
dobro(a);
end.

Funes (retorno de valores)


A traduo de funes semelhante
chamada de procedimentos. O nome da
funo tratado como uma varivel local
cujo valor final deve estar no topo da
pilha, como no caso de expresses.

Funes (retorno de valores)

Exemplo
program funcao;
Instrues MEPA:
var
INPP
L1: NADA
a,b : integer;
IMPC
AMEM 2
LEIT
function Soma(x1,x2:integer): integer;
DSVS L1
ARMZ 38
begin
Soma: NADA
LEIT
Soma := x1+x2;
ENPR 2
ARMZ 16
end;
AMEM 2
AMEM 1
begin
CHPR Soma, 2
CRVL 10
CRVL 1000
write(Entre com dois numeros: );
CRVL 20
IMPR
readln(a,b);
SOMA
DMEM 2
write(Soma(a,b));
ARMZ 1000
PARA
end.
IMPR
DMEM 2
RTPR Soma,2

Tabela de Smbolos
Uma vez extrados do texto-fonte pelo
analisador lxico, os identificadores so
armazenados em uma tabela.
A cada ocorrncia de um identificador no texto
do programa fonte, a tabela de smbolos
consultada ou alterada.
Quando um objeto da linguagem est sendo
declarado, o identificador a ele associado
inserido na tabela de smbolos, caso este ainda
no tenha sido. (se ele j existir mostre o
ERRO: duplicao de identificador).

Tabela de Smbolos
Encontrados em outros contextos, os
identificadores so interpretados como
referncias aos objetos previamente
definidos.
feita uma consulta a seus atributos.
H linguagens que no necessitam de
pr-declarao de objetos.

Tabela de Smbolos
As tabelas de smbolos so, em geral,
organizadas de um modo tal que reflitam a
estrutura do programa fonte, guardando
informaes sobre o escopo em que os
identificadores so definidos.

Atributos
Para cada referncia a um identificador, o
compilador ter que conhecer seus
atributos. Estas informaes so
normalmente associadas com o
identificador quando processada a
declarao.

Atributos Varivel
Varivel simples:
Identificador Categoria
Varivel
Simples

Nvel

Tipo

Deslocamento

Atributos Parmetros
Parmetros:
Identificador Categoria
Parmetro
Formal

Nvel

Tipo

DeslocamentoPassagem

Atributos Procedimentos
Procedimentos
Identificador Categoria
Procedimentos

Nvel Rtulo Parmetros Tipo/Mecan ... Tipo/Mecan


N

T1,P1

...

Tn,Pn

Organizao
A cada referncia a um identificador, os
atributos correspondentes podero ser
obtidos na tabela, iniciando-se a busca
deste identificador pelo topo da pilha.
Desta maneira, fica resolvido
automaticamente o problema da
declarao mltipla de um mesmo
identificador.

Procedimentos para Anlise


Semntica
GERA(rtulo, cdigo, par1, par2[, par3]):
gera a instruo da MEPA que
corresponde ao cdigo passado como
parmetro, armazenando-a num arquivo.
BUSCA(tomo, var k): busca o
identificador na tabela de smbolos.
Retorna em k a sua posio caso encontre,
caso contrrio k=0.

Procedimentos para Anlise


Semntica
INSERE(tomo, atributos): insere na
tabela de smbolos o identificador
armazenado em tomo. Os atributos
correspondentes a cada identificador
tambm so armazenados.
ELIMINA(n): elimina n identificadores da
tabela de smbolos.

Procedimentos para Anlise


Semntica
PROXIMO_ROTULO(var L): calcula um
novo rtulo e o armazena em
L.procedimento.

Comando Condicional
IF <expresso>
THEN <comando>
ELSE <comando>

...
DSVF L1
...
DSVS L2
L1 NADA
...
L2 NADA

IF <expresso>
THEN <comando>
...
DSVF L1
...
L1 NADA

Comando Condicional
procedimento COMANDO_CONDICIONAL;
declare L1, L2;
incio
ANALEX; // j foi verificada a presena do IF
PROXIMO_ROTULO(L1);
EXPRESSAO(t); // se t booleano ento ERRO;
GERA(,DSVF,L1,,);
se smbolo cdigo_then ento ERRO;
ANALEX;
COMANDO_SEM_ROTULO;
...

Comando Condicional
...
caso smbolo
cdigo_else:
{PROXIMO_ROTULO(L2);
GERA(,DSVS,L2,,);
GERA(L1,NADA,,,);
ANALEX;
COMANDO_SEM_ROTULO;
GERA(L2,NADA,,,);}
outros: GERA(L1,NADA,,,);
fim do caso
fim do procedimento