Você está na página 1de 30

COMPILADO

RES
ROBERTO TENORIO
FIGUEIREDO
www.osfedera.com
tenorio.petrolina@bol.c
om.br

Anlise
Sinttica
Parte II
ROBERTO TENORIO FIGUEIREDO
www.osfedera.com
tenorio.petrolina@bol.com.br

Analisador Sinttico
Para ajudar a implementao do
analisador sinttico, a literatura
recomenda o uso de duas funes:
FIRST
FOLLOW

FIRST
Seja A uma sequncia de smbolos
da gramtica (V ou ). Ento First (A)
o conjunto de terminais que iniciam
formas sentenciais derivadas a partir
de A.

FIRST
Se A iniciar em x, sendo x ou x =
ento
First (A) = { x}

Se A iniciar em y, sendo y V ento


Deve-se criar as rvores sintticas para verificar
todos os possveis valores de que podem iniciar
a partir de y

FIRST
Exemplo:
S ::= ABS | aA First (S) = ?
A ::= | a
First (A) = ?
B ::= Bb | cd First (B) = ?

FIRST
Exemplo:
S ::= ABS | aA First (S) = {a, c}
A ::= | a
First (A) = { , a}
B ::= Bb | cd First (B) = {c}

FIRST
Exemplo 2:
E TE
T FT
F (E) | id
E +TE |
T*FT |

First (E) = ?
First (T) = ?
First (F) = ?
First (E) = ?
First (T) = ?

FIRST
Exemplo 2:
E TE
T FT
F (E) | id
E +TE |
T*FT |

First (E) = { (, id}


First (T) = { (, id}
First (F) = { (, id}
First (E) = {+, }
First (T) = {*, }

FOLLOW
Sendo A uma varivel, ento Follow
(A) o conjunto de terminais a que
podem aparecer imediatamente
direita de A em alguma forma
sentencial, ou seja, o conjunto de
terminais a, tal que existe uma
derivao na forma:
S ::= zAaz, para z e z quaisquer.

FOLLOW
Definida apenas para smbolos no
terminais (variveis);

Tambm ser necessrio


rvore sinttica;

fazer

FOLLOW
No conjunto follow sempre adicionado um
smbolo para referncia nos seguintes casos:
Se for a varivel inicial;
Nas variveis que puderem ser vazias;
Nas variveis cuja varivel do seu lado direito
puder ser vazia;

Para o smbolo de referncia, usaremos:


$

FOLLOW
Exemplo (sendo S0 = S):
S ::= ABS | aA Follow (S) = ?
A ::= | a
Follow (A) = ?
B ::= Bb | cd Follow (B) = ?

FOLLOW
Exemplo (sendo S0 = S):
First (B)

S ::= ABS | aA Follow (S) = {$}


A ::= | a
Follow (A) = {c, $}
B ::= Bb | cd Follow (B) = {a, b, c}
b U First (S)

FOLLOW
Exemplo 2 (sendo S0 = E):
E TE
T FT
F (E) | id
E +TE |
T*FT |

Follow (E) = ?
Follow (T) = ?
Follow (F) = ?
Follow (E) = ?
Follow (T) = ?

FOLLOW
Exemplo 2 (sendo S0 = E):
E TE
T FT
F (E) | id
E +TE |
T*FT |

Follow (E) = {) , $}
Follow (T) = {+, ) , $}
Follow (F) = {+, *, ) , $}
Follow (E) = {) , $}
Follow (T) = {+, ) , $}

Analisador Sinttico
Como j vimos a anlise sinttica est
intimamente vinculada a gramtica a ela
associada.
Muitos detalhes esto implcitos no Parser.
Analisadores sintticos so determinsticos
se sempre souberem que ao tomar
independentemente da entrada de texto.

Precedncia de Operadores
Como deve ser feita?
Exemplo:
S ::= S A S | (S) | id
A ::= + | - | * | / | **

Precedncia de Operado
Precedncia de Operadores.
Como deve ser feita? ( ** * , / +,
)
prefervel analisador Bottom-UP

Exemplo:
S ::= S A S | (S) | id
A ::= + | - | * | / | **

Como transformar essa


gramtica para que a
precedncia de operadores
seja respeitada?
uma gramtica Ambgua??
Devemos retirar a
ambiguidade.

Precedncia de Operado
Precedncia de Operadores.
S ::= S + A | S A | A
A ::= A * B | A / B | B
B ::= B ** C | C
C ::= id | (S)

Recuperao de Erros
Misso: buscar erros;
O tratador de erros do parser deve:
Mostrar exatamente onde foi detectado
o erro;
Relatar a presena de erros de forma
clara e objetiva
Smbolo invlido (Esperando ( ou id na
linha 5)
5: erro RB04 (falta fecha-parnteses na
linha 5)

Recuperao de Erros
O tratador de erros do parser deve:
Ser especfico e indicador do problema
identificador no declarado (varivel SOMA
no
declarada na funo SOMATRIO)

No ser redundante: No detectar 100 falta


de declaraes da varivel SOMA)
Ser rpido;
No deve retardar a compilao de
programas corretos;

Recuperao de Erros
Os erros podem ser detectados em
dois momentos:
Tempo mais cedo: geralmente quando o
token lido no corresponde ao esperado;
Tempo mais tarde: em operaes sobre
a pilha, geralmente ocorre na
precedncia de operadores;

Recuperao de Erros
Aes possveis de um compilador:
Travar a mquina;
Gerar cdigo executvel com erros;
Abortar a compilao e apresenta um erro;
Detecta erros at o fim e apresenta todos os erros
encontrados;
Repara erros, transformando smbolos com pequenos
erros em smbolos corretos;
Corrige erros tentando prever o objetivo do usurio
de modo a continuar a compilao e gerao de
cdigo para produzir um mdulo executvel correto;

Recuperao de Erros
Alguns compiladores corrigem alguns
erros. Neste caso, temos duas
situaes:
1 Modo Pnico Quando o parser
despreza smbolos de entrada at
encontrar um token de sincronizao
(smbolos terminais de Follow(A), sendo
A o no-terminal onde ocorreu o erro) ;

Recuperao de Erros
Alguns compiladores corrigem alguns
erros. Neste caso, temos duas
situaes:
2 Recuperao local Quando o parser:
o Despesa um token;
o Altera o token de entrada para um smbolo
vlido;
o Remove um smbolo da pilha;

Recuperao de Erros
Erros sintticos:
Erro 2: Smbolo k inesperado. Esperando: x ou
z ou w Linha l Coluna c
If > 0 then
Erro 2: Smbolo > inesperado. Esperando ( ou id ou
numrico Linha 1, coluna 4.

If ((x <> 20) and (y = x) then


Erro 2: Smbolo then inesperado. Esperando ) ou
op_booleano Linha 1, Coluna 27.

Recuperao de Erros
Erros sintticos:
Erro 2: Smbolo k inesperado. Esperando: x ou
z ou w Linha l Coluna c
All y;
Erro 2: Smbolo y inesperado. Esperando (
Linha 1, Coluna 5

x = 10;
Erro 2: Smbolo = inesperado. Esperando :=
Linha 1, Coluna 3

Resultados no Analisador
Sinttico
A anlise sinttica agrupa os tokens em uma
rvore sinttica de acordo com a estrutura
do programa (gramtica da linguagem).
Entrada: sequncia de tokens fornecida pelo
analisador lxico;
Sada: rvore sinttica do programa;
No nosso caso - Sada: linha de cdigo

DVIDAS

Você também pode gostar