Upload
antonio-fagotto
View
51
Download
0
Embed Size (px)
DESCRIPTION
oioio
Citation preview
Compiladores II
Prof. Dr. Leandro B. S. Marques
email: [email protected]
Sumrio
Anlise Sinttica Ascendente
Definio de handles
Algoritmo Shift-Reduce
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
B d
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 Shift-
Reduce 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 shift-reduce:
LR(0)
SLR(1)
LR(1)
LALR(1)
Fases de um Compilador
Anlise
Sntese
Esqueleto do Programa Fonte
Pr-Processador
Programa Fonte
Compilador
Programa objeto em linguagem objeto
Montador
Cdigo de Mquina Realocvel
Carregador
Cdigo de mquina absoluto
Contexto de um Compilador
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 - *
Instrues MEPA:
CRVL 38
CRCT 3
SOMA
CRVL 52
CRCT 10
SUBT
MULT ID Endereo Valor
A 38 10
B 16 2
C 52 20
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;
...
end.
INPP
...
AMEM 2
...
DMEM 2
PARA
Traduo para
instrues MEPA
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.
INPP
...
DSVS incio
P: NADA
...
RTPR
incio NADA
...
CHPR p
...
PARA
Traduo para
instrues MEPA
Exerccios
Exerccio4: traduzir para MEPA o
programa ao lado.
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.
ID Endereo Valor
numero 10 10
percentual 20 2
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.
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.
ID Endereo Valor
a 38 10
num 20 2
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;
var
a,b : integer;
function Soma(x1,x2:integer): integer;
begin
Soma := x1+x2;
end;
begin
write(Entre com dois numeros: );
readln(a,b);
write(Soma(a,b));
end.
Instrues MEPA:
INPP
AMEM 2
DSVS L1
Soma: NADA
ENPR 2
AMEM 2
CRVL 10
CRVL 20
SOMA
ARMZ 1000
IMPR
DMEM 2
RTPR Soma,2
L1: NADA
IMPC
LEIT
ARMZ 38
LEIT
ARMZ 16
AMEM 1
CHPR Soma, 2
CRVL 1000
IMPR
DMEM 2
PARA
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:
Varivel
Simples
Identificador Categoria Nvel Tipo Deslocamento
Atributos Parmetros
Parmetros:
Parmetro
Formal
Identificador Categoria Nvel Tipo Deslocamento Passagem
Atributos Procedimentos
Procedimentos
Procedimentos N T1,P1 ... Tn,Pn
Identificador Categoria Nvel Rtulo Parmetros Tipo/Mecan ... Tipo/Mecan
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
THEN
ELSE
...
DSVF L1
...
DSVS L2
L1 NADA
...
L2 NADA
IF
THEN
...
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