O que você vai aprender
Calcular FIRST e FOLLOW de uma gramática.
Montar e usar a tabela preditiva LL(1).
Diagnosticar conflitos e por que uma gramática não é LL(1).
Consolidar os conceitos para a Avaliação 1.
Como o parser decide sem errar?
No parser descendente, ao expandir um não-terminal com várias produções, qual escolher? Olhar o próximo token e adivinhar dá errado se a escolha for ruim. Precisamos de um critério seguro.
Os conjuntos FIRST e FOLLOW dão exatamente isso: ao ver o próximo token, o parser sabe qual produção aplicar — sem retroceder. É a base do parsing preditivo LL(1).
O que veremos nesta aula
- O conjunto FIRST e como calculá-lo.
- O conjunto FOLLOW e seu papel com ε.
- A construção da tabela preditiva e o que é uma gramática LL(1).
- Consolidação das semanas 1 a 6.
FIRST e FOLLOW
FOLLOW(A). Conjunto de terminais que podem aparecer imediatamente após o não-terminal A em alguma derivação.
Calculando FIRST
Regras para FIRST(X):
- Se X é terminal, FIRST(X) = { X }.
- Se X → ε é produção, adicione ε a FIRST(X).
- Se X → Y1 Y2 ... Yk, adicione FIRST(Y1) (sem ε). Se Y1 pode derivar ε, inclua também FIRST(Y2), e assim por diante.
FIRST e FOLLOW da gramática de expressões
Para E → T E', E' → + T E' | ε, T → F T', T' → * F T' | ε, F → ( E ) | id:
| Não-terminal | FIRST | FOLLOW |
|---|---|---|
| E | ( id | ) $ |
| E' | + ε | ) $ |
| T | ( id | + ) $ |
| T' | * ε | + ) $ |
| F | ( id | + * ) $ |
O símbolo $ marca o fim da entrada.
Passo a passo: FOLLOW(T)
Gramática LL(1)
Montando a tabela preditiva
Para cada produção A → α, preenche-se a tabela (linha A, coluna terminal):
- Coloque A → α em cada coluna t de FIRST(α).
- Se ε ∈ FIRST(α), coloque A → α também em cada coluna t de FOLLOW(A).
O mapa de decisões
FIRST × FOLLOW
| FIRST(α) | FOLLOW(A) | |
|---|---|---|
| O que descreve | O que pode começar α | O que pode vir depois de A |
| Aplica-se a | Qualquer cadeia α | Não-terminais A |
| Pode conter ε? | Sim | Não (mas contém $) |
| Uso na tabela | Colunas onde a produção entra | Colunas extras quando α deriva ε |
Do cálculo à decisão
A construção do parser preditivo segue uma cadeia bem definida:
Quando NÃO é LL(1)
Por isso as transformações da aula 6 (eliminar recursão à esquerda, fatorar) são pré-requisitos: sem elas, a tabela quase certamente terá conflitos.
Verifique você mesmo: onde entra ε?
Para a produção E' → + T E' | ε, em quais colunas entra a produção E' → ε na tabela?
Geradores de parser LL
Ferramentas como ANTLL e bibliotecas de parser combinators usam a teoria LL. Geradores LL(1) clássicos constroem a tabela automaticamente a partir da gramática.
Enganos com FIRST/FOLLOW
Calculando com segurança
Reflita: LL(1) é o limite?
Toda linguagem livre de contexto tem uma gramática LL(1)?
Termos-chave da aula
O quadro geral das semanas 1 a 6
Esta semana fecha o primeiro bloco. Veja como tudo se conecta:
- Aulas 1-2: o panorama e as linguagens formais (Chomsky).
- Aulas 3-4: léxico — tokens, ER, autômatos (tipo 3).
- Aulas 5-6: sintaxe — GLC, ambiguidade, parsing descendente (tipo 2).
- Aula 7: FIRST/FOLLOW e LL(1) coroam o parsing preditivo. A Prova 1 cobre tudo isso.
Resumo visual
Calcule FIRST/FOLLOW automaticamente
O simulador abaixo recebe uma gramática e mostra FIRST e FOLLOW de cada não-terminal. Use a gramática de expressões já carregada como ponto de partida e experimente alterá-la.
Tente: o que acontece com os conjuntos se você adicionar uma produção com ε? E se introduzir recursão à esquerda? Observe como os conjuntos mudam.
Atividade em grupo · Mutirão de revisão (Prova 1)
Em grupos, montem um mapa de revisão das semanas 1–6.
Roteiro
- Cada integrante fica responsável por um tema: léxico, ER/autômatos, GLC, parsing descendente.
- Montem um mapa mental conectando os temas (uma página).
- Criem 2 questões originais por tema e troquem com outro grupo.
- Resolvam as questões recebidas e discutam.
Mini-quiz · Aula 7
20 questões sobre esta aula. Escolha e veja a explicação na hora.
📌 Resumo — leve isto para a prova
- FIRST = terminais iniciais (pode conter ε); FOLLOW = terminais seguintes (contém $, nunca ε).
- LL(1) = leitura da esquerda para a direita, derivação mais à esquerda, 1 lookahead.
- A tabela preditiva sem conflitos significa gramática LL(1).
- Conflitos vêm de ambiguidade, recursão à esquerda ou falta de fatoração.
- Nem toda linguagem livre de contexto admite gramática LL(1).