Você está na página 1de 52

COMPILADO

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

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

Analisador Sinttico

Programa
fonte

Scanner

toke
n

parser

getNextToken(
)

tabela de
smbolos

type
checker

Sintaxe de uma linguagem


Define as strings estruturalmente
vlidas de uma linguagem
Fez parsing corretamente = A
sintaxe est correta
Note: O programa pode ainda...
no passar na checagem de tipos
ou (de forma mais geral) conter erros

Especificao da sintaxe
Dever ser precisa e fcil de entender
Precisa: no ambgua
Fcil de entender: deixa evidente a sintaxe
da linguagem

Historicamente, gramticas livre de


contexto (BNFs) um formalismo
adequado
Fcil de especificar/manter/entender

Exemplo: S g aABe

A g Abc | b
Bgd

Exerccio. Qual das strings a


seguir faz parte da linguagem
definida pela BNF abaixo?
1) abcba
2) acca
3) aba
4) abcbcba

S aXa
X | bY
Y | cXc

Derivao e parsing
Gramtica G
S g aABe
A g Abc | b
Bgd

Derivao de string em G
S g aABe g aAbcBe
g aAbcbcBe g
abbcbcBe g
abbcbcde
S

rvore sinttica
para abbcbcde

a A

B e

A b c

A b c
b

Diferenas: Derivao e
Parsing
Derivao: Dada uma gramtica G,
produz uma string s que faz parte de
L(G).
Parsing: Dada uma string s em L(G),
produz uma rvore sinttica que
demonstra como se obter uma
derivao de s.

Exerccio. Qual das seguintes


derivaes vlida de acordo
com a gramtica ao lado?
1) S
aXa
aa
2) S
aXa
abYa
acXca
acca

3) S
aXa
abYa
abcXcda
abccda
4) S
aXa
abYa
abcXca
abcbYca
abcbdca

S aXa
X | bY
Y | cXc | d

Top-down e Bottom-up
Considerando a ordem de criao
da rvore sinttica, top-down
constri o n raiz primeiro e depois
os internos em direo aos ns
folha. bottom-up faz o contrrio.

Top-down parser
Procura sequncia de derivaes
mais a esquerda para se obter uma
string de entrada
O parse da string abbcbcde
caracterizado pela sequncia de
S g aABe abaixo.
S g aABe g aAbcBe
derivaes
A g Abc | b
Bgd

g aAbcbcBe g
abbcbcBe g
abbcbcde

Top-down parser
Procura sequncia de derivaes
mais a esquerda para se obter uma
string de entrada
O parse da string abbcbcde
caracterizado pela sequncia de
S g aABe abaixo.
S g aABe g aAbcBe
derivaes
A g Abc | b
Bgd

g aAbcbcBe g
abbcbcBe g
abbcbcde
Note a preferncia da
produo mais
esquerda

O mtodo Top-down
Inicie com smbolo raiz
Consuma tokens da esquerda para
direita
Decida
que produo
aplicar
S g aABe
a b b c b c d e
S
A g Abc | b
Bgd

O mtodo
Inicie com smbolo raiz
Consuma tokens da esquerda para
direita
Decida
que produo
aplicar
S g aABe
a b b c b c d e
aABe
A g Abc | b
Bgd

O mtodo
Inicie com smbolo raiz
Consuma tokens da esquerda para
direita
Decida
que produo
aplicar
S g aABe
a b b c b c d e
aAB
A g Abc | b
Bgd
escolha!

Vamos escolher a segunda derivao

O mtodo
Inicie com smbolo raiz
Consuma tokens da esquerda para
direita
Decida
que produo
aplicar
S g aABe
a b b c b c d e
abB
A g Abc | b
Bgd

O mtodo
Inicie com smbolo raiz
Consuma tokens da esquerda para
direita
Decida
que produo
aplicar
S g aABe
a b b c b c d e
abde
A g Abc | b
Bgd

O que preciso fazer?

erro.
Backtrack!

O mtodo
Inicie com smbolo raiz
Consuma tokens da esquerda para
direita
Decida
que produo
aplicar
S g aABe
a b b c b c d e
aAB
A g Abc | b
Bgd

Restaura
estado
anterior a
ltima escolha

e
Faz outra
escolha!

O mtodo
Inicie com smbolo raiz
Consuma tokens da esquerda para
direita
Decida
que produo
aplicar
S g aABe
a b b c b c d e
aAbc
A g Abc | b
Bgd

Be

O mtodo
Inicie com smbolo raiz
Consuma tokens da esquerda para
direita
Decida
que produo
aplicar
S g aABe
a b b c b c d e
aAbcB
A g Abc | b
Bgd
escolha
novament
e!

e
Smbolo A
novament
e na
posio
mais
esquerda

O mtodo
Inicie com smbolo raiz
Consuma tokens da esquerda para
direita
Decida
que produo
aplicar
S g aABe
a b b c b c d e
abbc
A g Abc | b
Bgd
Outra
escolha!

Be

O mtodo
Inicie com smbolo raiz
Consuma tokens da esquerda para
direita
Decida
que produo
aplicar
S g aABe
a b b c b c d e
abbcB
A g Abc | b
Bgd

O mtodo
Inicie com smbolo raiz
Consuma tokens da esquerda para
direita
Decida
que produo
aplicar
S g aABe
a b b c b c d e
abbcBe
A g Abc | b
Bgd

erro. Backtrack!

O mtodo
Inicie com smbolo raiz
Consuma tokens da esquerda para
direita
Decida
que produo
aplicar
S g aABe
a b b c b c d e
aAbcB
A g Abc | b
Bgd

Restaura
estado anterior
a ltima
escolha

O mtodo
Inicie com smbolo raiz
Consuma tokens da esquerda para
direita
Decida
que produo
aplicar
S g aABe
a b b c b c d e
aAbcbc
A g Abc | b
Bgd

Be
Faz outra
escolha!

O mtodo
Inicie com smbolo raiz
Consuma tokens da esquerda para
direita
Decida
que produo
aplicar
S g aABe
a b b c b c d e
abbcbc
A g Abc | b
Bgd

Be

O mtodo
Inicie com smbolo raiz
Consuma tokens da esquerda para
direita
Decida
que produo
aplicar
S g aABe
a b b c b c d e
abbcbc
A g Abc | b
Bgd

Be

O mtodo
Inicie com smbolo raiz
Consuma tokens da esquerda para
direita
Decida
que produo
aplicar
S g aABe
a b b c b c d e
abbcbc
A g Abc | b
Bgd

de

O mtodo
Inicie com smbolo raiz
Consuma tokens da esquerda para
direita
Decida
que produo
aplicar
S g aABe
a b b c b c d e
A g Abc | b
Bgd

O mtodo
Inicie com smbolo raiz
Consuma tokens da esquerda para
direita
Decida
que produo
aplicar
S g aABe
a b b c b c d e
A g Abc | b
Bgd
derivao
correspondent
e!

S g aABe g aAbcBe
g aAbcbcBe g
abbcbcBe g
abbcbcde

Top-down
parsers
operam desta
forma!

Exerccio. Construa a rvore sinttica associada


a derivao (mais esquerda) abaixo

Gramtica

String de entrada

S g aABe
A g Abc | b
Bgd

a b b c b c d e

Derivao mais esquerda

S g aABe g aAbcBe
g aAbcbcBe g
abbcbcBe g
abbcbcde

Recurso esquerda
Recurso esquerda: dificuldade em
saber quando parar de aplicar uma
produo
S g aABe
A g Abc | b
Bgd

aABe g aAbcBe g
aAbcbcBe g
aAbcbcbcBe g
aAbcbcbcbcBe g
complicador

Tamanho das produes

Ambiguidade
Ambiguidade: Existe mais de uma
forma de se derivar a string em uma
gramtica ambgua
Mais de uma parse tree (rvore
sinttica)

Ex: Quais das seguintes


gramticas so ambguas?

S
E
S
E
E

SS | a | b
E + E | id
Sa | Sb | a
E | E + E
-E | id | (E)

Parser Preditivo
um parser top-down
um parser que no requer backtracking
Simples de construir manualmente
Mas, requer modificao na gramtica para
tratar recurso esquerda e ambigidade

Eliminao de recurso esquerda


(fatorao):
S g aABe
A g Abc | b
Bgd

S g aABe
A g bK
K g bcK |
Bgd

Ex: Escolha a gramtica que elimina


recurso esquerda corretamente da
seguinte gramtica:

EE+T|T
T id | (E)
1) E id + E | E + T | T
T id | (E)
2) E E + id | E + (E)|
id | (E)

3) E E + T
|T
E id | (E)
T id | (E)
4) E TE
E +TE |

T id | (E)

Parser Tabular (Shift-reduce)


um parser top-down
um parser que no recursivo.
Uso de pilha ao invs de recurso;
Uso de uma Tabela de Anlise (tabela
sinttica);
A linha de cdigo a ser analisada escrita em
uma fita;

Parser Tabular (Shift-reduce)


Possveis aes
Shift (push): coloca tokens na pilha
Reduce: determina uma produo
Accept: finaliza. Reconhece string.
Error: Nenhuma ao possvel

Parser Tabular

Converso da gramtica em
tabela

Gramtica:

E TE
T FT
F (E) | id
E +TE |
T*FT |
Construir a rvore sinttica: id + id * id;

Parser Tabular
Gramtica:
E TE
T FT
F (E) | id
E +TE |
T*FT |
V

|
E

ID

FT

FT

id

TE
+TE

T
F

TE

E
T

*FT
(E)

Parser
Tabular

Resultad
o na
pilha

PILHA

ENTRADA

SADA

ZE

Id + id * id;

ZET

Id + id * id;

E TE

ZETF

Id + id * id;

T FT

ZETid

Id + id * id;

F id

ZET

+ id * id;

ZE

+ id * id;

ZET+

+ id * id;

E +TE

ZET

id * id;

ZETF

id * id;

T FT

ZETid

id * id;

F id

ZET

* id;

ZETF*

* id;

ZETF

id;

ZETid

id;

ZET

ZE

T *FT

F id

Parser Bottom-Up
Procura sequncia de derivaes mais a
direita para se obter uma string de entrada
(funo handle)
O parse da string abbcbcde caracterizado
pela sequncia de derivaes abaixo.
S g aABe
A g Abc | b
Bgd
Animao

S g aABe g aAde g
aAbcde g aAbcbcde g
abbcbcde

http://www.cs.wm.edu/~noonan/animations/rde
rive.html

O mtodo
Encontre padres que casam com
lado direito da produo e substitua
pelo lado esquerdo
S g aABe
A g Abc | b
Bgd

a b b c b c d e

O mtodo
Encontre padres que casam com
lado direito da produo e substitua
pelo lado esquerdo
S g aABe
A g Abc | b
Bgd

a b b c b c d e
A

O mtodo
Encontre padres que casam com
lado direito da produo e substitua
pelo lado esquerdo
S g aABe
A g Abc | b
Bgd

a b b c b c d e
A

O mtodo
Encontre padres que casam com
lado direito da produo e substitua
pelo lado esquerdo
S g aABe
A g Abc | b
Bgd

a b b c b c d e
A

O mtodo
Encontre padres que casam com
lado direito da produo e substitua
pelo lado esquerdo
S g aABe
A g Abc | b
Bgd
Derivao
reversa
correspondent
e!

a b b c b c d e
S

Abbcbcde aAbcbcde g
aAbcde g aAde g aABe g
S

O mtodo
Encontre padres que casam com
lado direito da produo e substitua
pelo lado esquerdo
S g aABe
A g Abc | b
Bgd

Derivao
correspondent
e!

a b b c b c d e
S

S g aABe g aAde g aAbcde


g aAbcbcde g abbcbcde

Comparao Top-down e Bottom-up


Em geral, bottom-up mais poderoso
pois coloca menos restries na
gramtica, porm, bem mais
trabalhoso de se escrever.

DVIDAS