Você está na página 1de 41

Construo de Compiladores

Tipos de Analisadores Sintticos

Gramticas
descrevendo linguagens
Gramticas livres de contexto so
utilizadas para descrever linguagens
de programao

Produes
Smbolos terminais
Smbolos no-terminais
Smbolo inicial

Exemplo
SS;S
S id := E
S print (L)
E id
E num
EE+E
E (S , E)
LE
LL,E

Terminais: id print , + ; := ( )
No terminas: S E L
Smbolo inicial: S
utilizado na notao de
produes
A cadeia seguinte pertence
gramtica?
a := 7;
b := c + (d := 5 + 6, d)

Derivaes
Para determinar se uma cadeia pertence gramtica
pode ser utilizado o processo de Derivao:
S
S ; S
S ; id :=
id := E ;
id := num
id := num
id := num
id := num
id := num
id := num
id := num
id := num
id := num

E
id := E
; id :=
; id :=
; id :=
; id :=
; id :=
; id :=
; id :=
; id :=
; id :=

E
E + E
E + (S, E)
id + (S, E)
id + (id :=
id + (id :=
id + (id :=
id + (id :=
id + (id :=

E, E)
E + E, E)
E + E, id)
num + E, id)
num + num, id)

Parse tree
S
S
id

:=

S
E

;
id

num

A Parse Tree construda


conectando cada derivao a
sua origem.
Na prtica no
implementada pelos
compiladores.

:=
+

E
S

id
id

:=
E
num

E )

,
id

E
num

Gramticas ambguas

Uma gramtica ambgua se a partir dela


uma sentena pode dar origem a duas
arvores de parsing diferentes
Indeterminismo problemtico para a
compilao
Eliminao de ambigidade quase
sempre possvel

Refatorao da gramtica

Gramticas ambguas
x := 1 + 2 + 3;
S
id

S
E

:=
E
E

num

+
E
num

id
E
num

:=
E
num

+
E

num

E
+

E
num

Gramtica refatorada
SS;S
S id := E
S print (L)
E id
E num
EE+E
E (S , E)
LE
LL,E

SS;S
S id := E
S print (L)
E id
E num
EE+T
ET
E (S , E)
LE
LL,E

Tipos de Analisadores Sintticos

Descendente (top-down)

Ex: Analisador Sinttico LL

um analisador pode iniciar com o smbolo inicial e


tentar transform-lo na entrada de dados.
Intuitivamente, o analisador inicia dos maiores
elementos e os quebra em elementos menores.

LL: Left to Right / Leftmost Derivation

Tipos de Analisadores Sintticos

Ascendente (bottom-up)

Exemplo: Analisador Sinttico LR

um analisador pode iniciar com um entrada de dados e


tentar reescrev-la at o smbolo inicial. Intuitivamente,
o analisador tentar localizar os elementos mais
bsicos, e ento elementos maiores que contm os
elementos mais bsicos, e assim por diante.

LR: Left to Right / Rightmost derivation

Tipos de Analisadores Sintticos

Classes LL

A rvore construda da raiz para as folhas

- Em cada vrtice (com um smbolo no terminal A):


- selecionar uma produo com A esquerda e construir os vrtices filhos de A
com os smbolos direita nessa produo;
- selecionar o vrtice onde continuar.
- Termina quando todas as folhas so smbolos terminais.
- A aceitao d-se se a sequncia for esgotada.
- As decises so tomadas por observao de , chamado smbolo
lookahead.

Analisadores Descendentes

Dada uma frase , a anlise descendente pode ser vista


como uma tentativa de se,
- encontrar uma derivao mais esquerda para ,
- construir uma rvore gramatical para a partir da raiz,
criando os ns em prordem.

Desta forma,
- a frase percorrida da esquerda para a direita,
- vo-se identificando derivaes esquerdas,
- enquanto a rvore de sintaxe vai sendo construda.

Analisadores Descendentes
n

Algoritmo baseado em previses

Tambm conhecido como Predictive Parsing

Funes mutuamente recursivas

Simples implementao

Uma funo para cada no-terminal

Uma clusula para cada produo

Verifica o primeiro smbolo terminal para


decidir qual funo usar

Analisadores Descendentes
n

Desenvolvendo um recursive descent


parser
n

Cada no terminal 'X' dar origem a um


mtodo/funo parseX();

Produes do tipo 'A | B' daro origem a


clusulas cases

Analisadores Descendentes

A ::= aBcC

parseA() {
accept(a);
parseB();
accept(c);
parseC();
}

parseB() {
case (d):
parseC();
parseB();
case (c):
accept(c);
parseC();
}

B ::= CB | cC
C ::= da
parseC() {
accept(d);
accept(a);
}

Analisadores Descendentes

Na prtica constri uma tabela de


produes indexadas por no-terminais
e terminais
a
A

A ::= aBcC
B ::= CB | CA
C ::= da

A::= aBcC

B::= CB
B::= CA

C::= da

Analisadores Descendentes
Vantagens

n
n

Fcil de implementar

Fcil de entender

Desvantagens

n
n

Performance deficiente

Gramtica reconhecida possui restries


n

Sem recurso esquerda

Deve estar fatorada

Recursiva Descendente
A ::= aBcC

A ::= aBcC

B ::= CX

B ::= CB | CA

Gramtica
LL(1)

X ::= B | A

C ::= da

C ::= da
a
A

A::= aBcC

B::= CX

C::= da

X::=A

X::=B

Analisadores Descendentes
n

Gramticas SEM entradas duplicadas na tabela so conhecidas


como LL(1)

LL(1) - Left-to-right, leftmost-derivation, 1-symbol


lookahead

Left-to-right direo na qual os smbolos sero examinados

Leftmost-derivation ordem pela qual os smbolos noterminais sero expandidos

1-symbol lookahead no mais que um smbolo ser


avaliado por vez

Existem LL(2), LL(3),...

Toda LL(1) LL(2), toda LL(2) LL(3),... LL(k)

Analisadores Descendentes
O parser tem uma pilha e a entrada.

Os primeiros k tokens da entrada formam o lookahead

Dois tipos de aes:

SHIFT: move o primeiro token para o topo da pilha

REDUCE:

escolhe uma produo X A B C;

desempilha C, B, e A;

empilha X

Analisadores Descendentes

Como o parser sabe quando fazer um shift ou


um reduce?
Usando um DFA aplicado a pilha!
As arestas so nomeadas com os smbolos
que podem aparecer na pilha

Analisadores Descendentes

Anlise sinttica descendente com retrocesso (backtracking)


O reconhecimento feito por expanso de regras sintticas,
substituindo smbolos no-terminais do lado esquerdo de
produes pelo lado direito das produes.
Depois, a expanso das regras sintticas confirmada por
emparelhamento dos smbolos da frase de entrada () com os
smbolos terminais das regras sintcticas: se

no emparelhar, ento ter que haver retrocesso no processo


(backtracking).

O retrocesso (backtrack) resultado da existncia de vrias


produes com o mesmo smbolo no lado esquerdo.

LL(1) na prtica - Applet


http://ag-kastens.uni-paderborn.de/lehre/material/uebi/parsdemo/LL1Parser.html

Recurso esquerda
Gramticas LL(1) so vulnerveis s entradas
duplicadas. Por exemplo, o fragmento a seguir:
EE+T
ET
O fato de E aparecer no incio do lado direito da produo
a causa do problema. Isso conhecido como Recurso
Esquerda. Para corrigir isso, vamos refatorar a
gramtica, com Recurso Direita:
E T E
E +T E
E

Tipos de Analisadores Sintticos

Classes LR

- A rvore construda das folhas para a raiz.


- Os smbolos de so associados at se
reconhecer o lado direito de uma produo.
- A aceitao d-se se, esgotada a sequncia
, o smbolo inicial estiver na raiz da rvore.

LR Parsing

O ponto fraco da tcnica LL(k) precisar prever


que produo usar
Com base nos primeiros k tokens do lado direito
da produo
LR(k) posterga a deciso at ter visto todo o lado
direito de uma produo, mais o k prximos tokens
da entrada
Left-to-right parse, rightmost-derivation, k-token,
lookahead

Analisadores Ascendentes

Princpios gerais
O objetivo da anlise sinttica ascendente a construo da
rvore de derivao, a partir das folhas, em direco raiz.
A rvore de derivao construda percorrendo a sequncia
de smbolos de entrada (frase) da esquerda para a direita (e
armazenada numa string ): esta operao designada por
deslocamento (shift) da posio do analisador sinttico.
Quando detectada uma sequncia de smbolos gramaticais
idntica ao lado direito de uma produo, esses smbolos so
substitudos pelo smbolo no-terminal do lado esquerdo da
produo: esta operao designada por reduo (reduce).

Arquitetura do Analisador Sinttico

Analisadores Ascendentes
n

As fraquezas de LL(k) so superadas pela tcnica


LR(k)

LR(1) - Left-to-right, rightmost-derivation, 1symbol lookahead

Uso de uma pilha para armazenar smbolos de forma


temporria

Possui duas operaes, shift e reduce

shift: Move o primeiro smbolo para o topo da pilha

reduce: escolhe uma regra da gramtica do tipo XA


B C. push X da pilha e pop C B A.

Analisadores Ascendentes
LR(0)

Olham apenas para a pilha

SLR

Melhoramento sobre o LR(0)

LR(1)

n
n

Lookahead de 1 smbolo

Consegue descrever a maioria das linguagens de programao

LALR(1)

Melhoramento sobre o LR(1)

n
n

Diminu o tamanho da tabela de parsing

Analisadores Ascendentes

A construo das tabelas pode ser efetuada utilizando trs


metodologias distintas :
1. SLR (Simple LR) o mtodo mais simples, mas
tambm o menos poderoso, porque no possvel construir
as tabelas para algumas gramticas.
2. LR cannico o mtodo mais poderoso e, em
simultneo, o mais complexo, sendo aquele que mais
memria necessita para armazenar a tabela.
3. LALR (LookAhead LR) este mtodo um compromisso
entre os mtodos SLR e LR cannico, e funciona para a maior
parte das linguagens de programao.

shift-reduce na prtica Applet


http://ag-kastens.uni-paderborn.de/lehre/material/uebi/parsdemo/SRParser.html

Analisadores Ascendentes

Os analisadores sintticos LR apresentam diversas vantagens:

- Reconhecem praticamente todos os construtores de linguagens de programao

estruturadas em blocos, expressas em gramticas independentes do contexto.

- So mais gerais que outros analisadores sintcticos e revelam o mesmo grau de

eficincia.

- Podem detectar cedo erros sintticos, quando tal possvel, ao pesquisar a

entrada da esquerda para a direita.

Maior inconveniente destes analisadores:

- a complexidade da sua implementao.

No entanto, a existncia de ferramentas que geram automaticamente


analisadores
sintticos (tal como o YACC) eliminou este problema

Analisadores Ascendentes

O analisador sinttico LR:


Left-scan, leitura da frase da esquerda para a
direita,
Rightmost derivation, derivao da direita para a
esquerda,
- pesquisa os elementos da frase da esquerda para
a direita (tal como os analisadores descendentes) e
- constri uma derivao direita, invertida.

Analisadores Ascendentes
n

Gramticas ambguas ocasionam


conflitos em parsers LR
Shift-reduce conflict

n
n

O parser no consegue decidir se empilha o


prximo smbolo da entrada, ou se reduz para uma
regra j disponvel

Reduce-reduce conflict

n
n

O parser pode realizar uma reduo para duas


regras distintas

Gramticas no-ambguas
LL(k)

LR(k)

LL(1)

LR(1)
LALR(1)
SLR

LL(0)

LR(0)

Gramticas
ambguas

Sintaxe Abstrata
n

Apenas reconhecer se uma sentena pertence


ou no a linguagem especificada por uma
gramtica no o suficiente

necessrio produzir uma estrutura que sirva


de base para a prxima fase do processo de
compilao
n

Parse trees nunca so montadas na prtica

AST Abstract Syntax Tree


n

Capturam a essncia da estrutura de uma


gramtica abstraindo no-terminais
Representao possvel

n
n

Java: Classes que possam se relacionar a fim de


montar uma rvore

Pode ser produzida atravs da insero de


aes semnticas no parser

AST Abstract Syntax Tree

IfThenElse ::= 'if' expr 'then' comm1 'else' comm2

IfThenElse
expr : Expression
comm1 : Command
comm2 : Command

return new IfThenElse(expr, comm1, comm2);

Referncias
n

Anlises lxica e sinttica, Mauro LaSalette C. L. de Arajo

Modern Compiler implementation in


Java, Andrew W. Appel

Tipos de Analisadores Sintticos

Exerccios

1 Em relao aos analisadores LL e LR, faa uma


pesquisa e descreva todos os seus sub-tipos,
explicando suas diferenas.

Procure detalhar como funcionam cada um deles,


de forma a compreender estas categorias.

Você também pode gostar