Académique Documents
Professionnel Documents
Culture Documents
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
:=
+
E
S
id
id
:=
E
num
E )
,
id
E
num
Gramticas ambguas
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
Descendente (top-down)
Ascendente (bottom-up)
Classes LL
Analisadores Descendentes
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
Simples implementao
Analisadores Descendentes
n
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
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
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
Analisadores Descendentes
O parser tem uma pilha e a entrada.
REDUCE:
desempilha C, B, e A;
empilha X
Analisadores Descendentes
Analisadores Descendentes
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
Classes LR
LR Parsing
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).
Analisadores Ascendentes
n
Analisadores Ascendentes
LR(0)
SLR
LR(1)
n
n
Lookahead de 1 smbolo
LALR(1)
n
n
Analisadores Ascendentes
Analisadores Ascendentes
eficincia.
Analisadores Ascendentes
Analisadores Ascendentes
n
n
n
Reduce-reduce conflict
n
n
Gramticas no-ambguas
LL(k)
LR(k)
LL(1)
LR(1)
LALR(1)
SLR
LL(0)
LR(0)
Gramticas
ambguas
Sintaxe Abstrata
n
n
n
IfThenElse
expr : Expression
comm1 : Command
comm2 : Command
Referncias
n
Exerccios