CONJUNTOS FIRST E FOLLOW Compiladores Departamento de Computação UEPB
CONJUNTOS FIRST E FOLLOW
Na análise sintática, em alguns momentos é preciso reconhecer um token, mas a produção da gramática nos dá não-terminais como opção
O que o método descendente recursivo faria? O que o método descendente preditivo recursivo faria?
Como escolher a produção correta?
2
CONJUNTOS FIRST E FOLLOW
Conjunto First
Primeiro não terminal encontrado numa produção
Pode haver mais de uma possibilidade, por isso é um conjunto
Caso uma produção de um não-terminal resulte em vazio, o conjunto primeiro deste não-terminal conterá o conjunto primeiro do não-terminal seguinte
3
CONJUNTOS FIRST E FOLLOW
1) Encontrar o conjunto first de cada não terminal do lado esquerdo das produções da gramática abaixo
S -> A | B A -> aAS | BD B -> bB | fAC | ε C -> cC | BD D -> gD | C | ε 4
CONJUNTOS FIRST E FOLLOW
2) Encontrar o conjunto first de cada não terminal do lado esquerdo das produções da gramática abaixo
S → Abd A → aA | ε B → bB | cA | AC C → cB | ε
5
CONJUNTOS FIRST E FOLLOW
3) Encontrar o conjunto first de cada não terminal do lado esquerdo das produções da gramática abaixo
S → A | BC A → aAS | D B → bB | fAC | ε C → cC D → gD | C | ε 6
CONJUNTOS FIRST E FOLLOW
4) Encontrar o conjunto first de cada não terminal do lado esquerdo das produções da gramática abaixo
S → aA | bB A → aA | BD B → bB | fAC | ε C → cC | Dd D → gD | C | ε
7
CONJUNTOS FIRST E FOLLOW
Conjunto Follow
Conjunto de terminais imediatamente seguintes ao não-terminal analisado
Caso mais simples: A → aBc
Follow(B) = { c }
8
CONJUNTOS FIRST E FOLLOW
Conjunto Follow
Possui um símbolo especial $, utilizado para indicar o fim da árvore de derivação (não há mais derivações possíveis). Lembra EOF Regras para o conjunto follow
Se S é o símbolo inicial da gramática, follow(S ) = { $ } Se há uma produção A → αBβ , então tudo em first(β), exceto por ε, está em follow(B)
Se há uma produção A → αB, ou uma produção A → αBβ onde first(β) contém ε, então follow(A) está contido em follow(B)
9
CONJUNTOS FIRST E FOLLOW
Exemplo: encontrar os conjuntos first e follow dos não-terminais da gramática abaixo
S →E
FIRST
FOLLOW
E → T E’
S
{(, id}
{$}
E’ → + T E’ | ε
E
{( , id}
{ ) , $}
E’
{+, ε}
{ ) , $}
T
{( , id}
{+ , ) , $}
T’ → * F T’ | ε
T’
{*, ε}
{+, ) , $}
F → ( E ) | id
F
{( , id}
{+ , * , ) , $}
T → F T’
10