Aula 4
Aula 4
Aula 4
Revisão: gramáticas
Compiladores 2
Definições
Compiladores 3
Definições
|123094|=6
|λ|=0
Compiladores 4
Definições
Compiladores 5
Definições
Compiladores 6
Gramáticas
2) Leis de Formação
Através de um conjunto de leis de formação das
cadeias (ao conjunto de leis de formação dá-se o
nome de Gramática)
dada uma cadeia de símbolos, só é possível afirmar que tal
cadeia pertence à linguagem se for possível, aplicando-se as
leis de formação que compõem a gramática da linguagem,
derivar (sintetizar) a cadeia em questão.
Ao processo de obtenção de uma sentença a partir da
gramática dá-se o nome de derivação da sentença.
Compiladores 7
Gramáticas
Gramáticas
Formalmente as gramáticas, são caracterizadas como
quádruplas ordenadas
G = ( Vn, Vt, P, S)
onde:
Vn representa o vocabulário não terminal (variáveis) da
gramática. Este vocabulário corresponde ao conjunto de todos os
símbolos dos quais a gramática se vale para definir as leis de
formação das sentenças da linguagem.
Compiladores 8
Gramáticas
Gramáticas
Formalmente as gramáticas, são caracterizadas como
quádruplas ordenadas
G = ( Vn, Vt, P, S)
onde:
Vt é o vocabulário terminal, contendo os símbolos que
constituem as sentenças da linguagem. Dá-se o nome de
terminais aos elementos de Vt.
Compiladores 9
Gramáticas
Gramáticas
Formalmente as gramáticas, são caracterizadas como quádruplas
ordenadas
G = ( Vn, Vt, P, S)
onde:
P são as regras de produção, que definem o conjunto de todas as leis
de formação utilizadas pela gramática para definir a linguagem. Para
tanto, cada construção parcial, representada por um não-terminal, é
definida como um conjunto de regras de formação relativas à definição do
não-terminal a ela referente. A cada uma destas regras de formação que
compõem o conjunto P dá-se o nome de produção da gramática
Compiladores 10
Gramáticas
Compiladores 11
Gramáticas
Árvore de derivação
a raiz tem como rótulo o símbolo inicial S da
gramática.
a cada nó rotulado por um não-terminal A
corresponde uma regra de A. Se a regra for A
X1X2 ... Xm, os filhos do nó são rotulados, da
esquerda para a direita, por X1, X2, ..., Xm. (cada
um dos Xi pode ser um terminal ou um não-
terminal.)
um nó rotulado por um terminal é sempre uma
folha da árvore, e não tem filhos.
Compiladores 13
Gramáticas
Compiladores 14
Gramáticas
G: S AB
É ambígua permite
A AA | B | a
derivação mais à direita
B Bcd | A e mais à esquerda
– Verifique se x= aaacd é ambígua.
Compiladores 15
Classes Gramaticais
Compiladores 16
Classes Gramaticais
Produções da forma
α β
Onde: α ∈ (Vn ∪ Vt)+ G = ( Vn, Vt, P, S)
β ∈ (Vn ∪ Vt)*
Compiladores 17
Classes Gramaticais
Compiladores 18
Classes Gramaticais
Compiladores 19
Classes Gramaticais
Compiladores 20
Classes Gramaticais
Compiladores 21
Classes Gramaticais
Compiladores 22
Classes Gramaticais
G = ({S,A,B},{a,b},P,S)
P: S AB
A aA | a
B bB | b
L(G)={anbm| n, m ≥ 1}
Compiladores 23
Classes Gramaticais
Compiladores 24
Classes Gramaticais
Compiladores 25
Na aula de hoje...
Revisão: gramáticas
Compiladores 26
Relações em uma Gramática
Analisador léxico
retornou o token if Partes das regras em EBNF
<comando condicional 1> ::=
Trecho de código
if <expressão> then <comando>
... [else <comando>]
if (a<1) then <comando repetitivo 1> ::=
a:=12 while <expressão> do <comando>
...
Compiladores 27
Cabeça
Compiladores 28
Cabeça
Cabeça (α) = β
Compiladores 29
Último
Compiladores 30
Último
Compiladores 31
Primeiro (First)
Compiladores 32
Primeiro (First)
conjunto PRIMEIRO de x
4. Se XY1Y2...Yk é uma produção, então todo i tal que todos Y1...Yi-1 são não-
Compiladores 33
Primeiro (First)
Exemplo
Compiladores 34
Primeiro (First)
Exemplo
F deriva em ε?
R: Não, então primeiro(T) = primeiro(F) = {(, id}
Se F derivasse em ε era preciso incluir o
primeiro(T’) em primeiro(T)
Compiladores 35
Primeiro (First)
Exemplo 2
E → TE’
E’ → +TE’ | ε Primeiro (H) = {?}
T → FT’
H → E’T
T’ → *FT’ | ε
F → (E) | id
Compiladores 36
Primeiro (First)
Exemplo 2
E → TE’
E’ → +TE’ | ε Primeiro (H) = Primeiro(E’)∪Primeiro(T)
T → FT’ = {+, (, id }
H → E’T
T’ → *FT’ | ε
F → (E) | id
E’ deriva em ε?
R: Sim, então incluir o primeiro(T) em primeiro(H).
Regra 4 Se primeiro(T) e primeiro(E’) contem ε então incluir
slide 33 ε em primeiro(H), caso contrário remover ε do
primeiro(H)
Compiladores 37
Seguinte (Follow)
Compiladores 38
Seguinte (Follow)
1. Colocar
Seguinte(E) = {), $}
1. Colocar em Seguinte(S)
$ em Seguinte(S) se
se S
S éé o
o símbolo
símbolo de
de
Seguinte(E’) = Seguinte(E) = {), $}
partida - é o marcador de fim de entrada
partida Seguinte(T) = Primeiro(E’) = {+} U
2. Se existe uma produção A→ αBβ e β é diferente
2. Se existe uma produção A→ αBβ e β é diferente Seguinte(E) U Seguinte(E’) = {+, ), $}
de ε então tudo que estiver em PRIMEIRO(β),
de ε então tudo que estiver em PRIMEIRO(β), Seguinte(T’) = Seguinte(T)= {+, ), $}
exceto ε, deve ser adicionado em Seguinte(B) Seguinte(F) = primeiro(T') = {*} U
exceto ε, deve ser adicionado em Seguinte(B)
3.
3.
Se existe uma produção A→ αB ou A→ αBβ
Se existe uma produção A→ αB ou A→ αBβ Seguinte(T) U Seguinte(T’) = {*,+,), $}
onde PRIMEIRO(β) contêm ε (β ε), então tudo
onde PRIMEIRO(β) contêm ε (β ε), então tudo
que está em Seguinte(A) está em Seguinte(B)
que está em Seguinte(A) está em Seguinte(B)
Compiladores 40
Seguinte (Follow)
Seguinte(A)=x para a regra SαAβ e primeiro(β)=x
Compiladores 41
Seguinte (Follow)
Seguinte(A)=x para a regra SαAβ e primeiro(β)=x
Compiladores 42
Seguinte (Follow)
Seguinte(A)=x para a regra SαAβ e primeiro(β)=x
Compiladores 43
Seguinte (Follow)
Seguinte(A)=x para a regra SαAβ e primeiro(β)=x
Compiladores 44
Exercícios
Encontre os conjuntos Primeiro(First) para as gramáticas
abaixo
a) S → A | B
A → aAS | BD
B → bB | fAC | ε
C → cC | BD
D → gD | C | ε
b) S → ABd
A → aA | ε
B → bB | cA | AC
C → cB | ε
Primeiro(B)
gera ε,
então
Primeiro(D)
entra em
Primeiro(C)
Primeiro(B)
gera ε,
então
Primeiro(D)
entra em
Primeiro(C)
Compiladores 51
Exercícios
Encontre os conjuntos Primeiro(First) para as gramáticas
abaixo
Primeiro(S)= {}
Primeiro(A)= {}
Primeiro(B)= {}
Primeiro(C)= {}
b) S → ABd
A → aA | ε
B → bB | cA | AC
C → cB | ε
Compiladores 52
Exercícios
Encontre os conjuntos Primeiro(First) para as gramáticas
abaixo
Primeiro(S)= {}
Primeiro(A)= {}
Primeiro(B)= {}
Primeiro(C)= {c, ε}
b) S → ABd
A → aA | ε
B → bB | cA | AC
C → cB | ε
Compiladores 53
Exercícios
Encontre os conjuntos Primeiro(First) para as gramáticas
abaixo
Primeiro(S)= {}
Primeiro(A)= {}
Primeiro(B)= {b, c, U Primeiro(A)}
Primeiro(C)= {c, ε}
b) S → ABd
A → aA | ε
B → bB | cA | AC
C → cB | ε
Compiladores 54
Exercícios
Encontre os conjuntos Primeiro(First) para as gramáticas
abaixo
Primeiro(S)= {}
Primeiro(A)= {a, ε}
Primeiro(B)= {b, c, U Primeiro(A)}
Primeiro(C)= {c, ε}
b) S → ABd
A → aA | ε
B → bB | cA | AC
C → cB | ε
Compiladores 55
Exercícios
Encontre os conjuntos Primeiro(First) para as gramáticas
abaixo
Primeiro(S)= {}
Primeiro(A)= {a, ε}
Primeiro(B)= {b, c, U Primeiro(A)} = {b, c, a, ε}
Primeiro(C)= {c, ε}
b) S → ABd
A → aA | ε
B → bB | cA | AC
C → cB | ε
Compiladores 56
Exercícios
Encontre os conjuntos Primeiro(First) para as gramáticas
abaixo
Primeiro(A)
gera ε,
Primeiro(S)= {Primeiro(A) U Primeiro(B) U d}
então
Primeiro(A)= {a, ε}
Primeiro(B)
Primeiro(B)= {b, c, U Primeiro(A)} = {b, c, a, ε}
entra em
Primeiro(C)= {c, ε}
b) S → ABd Primeiro(S)
A → aA | ε e
B → bB | cA | AC Primeiro(B)
C → cB | ε gera ε,
então d
também
Quando tem uma regra do tipo A BCD, o ε só
entra em
entra no Primeiro(A) se ele puder ser gerado por Primeiro(S)
B, C e D também.
Compiladores 57
Exercícios
Encontre os conjuntos Primeiro(First) para as gramáticas
abaixo
Primeiro(S)= {a, b, c, d}
Primeiro(A)= {a, ε}
Primeiro(B)= {b, c, a, ε }
Primeiro(C)= {c, ε}
b) S → ABd
A → aA | ε
B → bB | cA | AC
C → cB | ε
Compiladores 58
Exercícios
Encontre os conjuntos Primeiro(First) para as gramáticas
abaixo
Primeiro(S)= {}
Primeiro(A)= {}
c) S → A | BC Primeiro(B)= {}
A → aAS | D Primeiro(C)= {}
B → bB | fAC | ε Primeiro(D)= {}
C → cC
D → gD | C | ε
Compiladores 59
Exercícios
Encontre os conjuntos Primeiro(First) para as gramáticas
abaixo
Primeiro(S)= {a, g, c, b, f, ε}
Primeiro(A)= {a, g, c, ε}
c) S → A | BC Primeiro(B)= {b, f, ε}
A → aAS | D Primeiro(C)= {c}
B → bB | fAC | ε Primeiro(D)= {g, c, ε}
C → cC
D → gD | C | ε
Compiladores 60
Exercícios
Encontre os conjuntos Primeiro(First) para as gramáticas
abaixo
Primeiro(S)= {}
Primeiro(A)= {}
d) S → aA | bB Primeiro(B)= {}
A → aAS | BD Primeiro(C)= {}
B → bB | fAC | ε Primeiro(D)= {}
C → cC | Dd
D → gD | C | ε
Compiladores 61
Exercícios
Encontre os conjuntos Primeiro(First) para as gramáticas
abaixo
Primeiro(S)= {a,b}
Primeiro(A)= {a, b, f, g, c, d, ε}
d) S → aA | bB Primeiro(B)= {b, f, ε}
A → aAS | BD Primeiro(C)= {g, c, d, ε}
B → bB | fAC | ε Primeiro(D)= {c, g, d, ε }
C → cC | Dd
D → gD | C | ε
Compiladores 62
Exercícios
Encontre os conjuntos Seguinte(Follow) para as gramáticas
abaixo
a) S → A | B
A → aAS | BD
B → bB | fAC | ε
C → cC | BD
D → gD | C | ε
b) S → ABd
A → aA | ε
B → bB | cA | AC
C → cB | ε
c) S → A | BC
A → aAS | D
B → bB | fAC | ε
C → cC
D → gD | C | ε
d) S → aA | bB
A → aAS | BD
B → bB | fAC | ε
C → cC | Dd
D → gD | C | ε
Compiladores 63
Exercícios
Encontre os conjuntos Seguinte(Follow) para as gramáticas
abaixo
a) S → A | B Seguinte(S)= Seguinte(A) = {a, b, f, g, c, $}
A → aAS | BD Seguinte(A)= Primeiro(S) U Primeiro(C) = {a, b, f, g, c, $}
B → bB | fAC | ε Seguinte(B)= Primeiro(D) U Seguinte(S) = {g, c, b, f, a, $}
C → cC | BD Seguinte(C)= Seguinte(B) U Seguinte(D) = {g, c, b, f, a, $}
D → gD | C | ε Seguinte (D)= Seguinte(C) U Seguinte(A) = {a, b, f, g, c, $}
a) Primeiro(S)= {Primeiro(A) U Primeiro(B)} = {a, b, f, g, c, ε}
Primeiro(A)= {a U Primeiro(B) U ε U Primeiro(D)} = {a, b, f, g, c, ε}
Primeiro(B)= {b,f, ε}
Primeiro(C)= {c U Primeiro(B) U ε} = {c, b, f, g, ε}
Primeiro(D)= {g U Primeiro(C) U ε} = {g,c,b,f, ε}
Se A é um não-terminal, Seguinte(A) é o conjunto de terminais que podem figurar imediatamente à
Compiladores 68