O que você vai aprender
Ler e escrever produções de uma GLC.
Construir derivações e árvores sintáticas.
Reconhecer e resolver ambiguidade com precedência e associatividade.
Traduzir entre BNF e EBNF.
Por que regex não basta
A análise léxica nos deu tokens. Mas como descrever que "( ( ) )" é válido e "( ) )" não é? Aninhamento arbitrário foge das expressões regulares — precisamos de uma ferramenta mais forte.
As gramáticas livres de contexto (tipo 2 de Chomsky) são essa ferramenta. Elas descrevem a estrutura sintática das linguagens de programação.
O que veremos nesta aula
- A definição formal de uma GLC.
- Como gerar cadeias e registrar sua estrutura.
- O problema da ambiguidade e como resolvê-lo.
- As notações padrão de gramáticas.
Gramática livre de contexto
Os não-terminais são variáveis sintáticas (como E para "expressão"); os terminais são os tokens; as produções dizem como reescrever cada não-terminal; S é o ponto de partida.
A gramática de expressões
O exemplo clássico, que usaremos o curso inteiro, é o das expressões aritméticas:
Há três níveis: E (expressão, soma), T (termo, produto) e F (fator). Essa estratificação não é casual — ela codifica a precedência dos operadores, como veremos.
Derivação e árvore sintática
Árvore sintática. Estrutura em árvore que registra como a cadeia foi derivada, com S na raiz e os terminais nas folhas.
Para "id + id", uma derivação é: E ⇒ E + T ⇒ T + T ⇒ F + T ⇒ id + T ⇒ id + F ⇒ id + id.
Passo a passo: derivando "id * id"
Gramática ambígua
Ambiguidade é um defeito: o compilador não saberia qual interpretação adotar.
O perigo da ambiguidade
A gramática estratificada (E, T, F) elimina esse problema: ela só produz uma árvore para cada cadeia, com o agrupamento correto id+(id*id).
A frase ambígua
BNF × EBNF
A EBNF acrescenta açúcares sintáticos à BNF, deixando as gramáticas mais compactas:
| Em BNF | Em EBNF | Significado |
|---|---|---|
| L → a L | a | L → a { a } | repetição |
| S → if E then S | if E then S else S | S → if E then S [ else S ] | opcional |
Em EBNF: chaves { } repetem (zero ou mais), colchetes [ ] tornam opcional, parênteses ( ) agrupam.
Da gramática à árvore
A gramática gera; a árvore registra. O parser, que veremos na próxima aula, faz o caminho inverso: recebe a cadeia e reconstrói a árvore.
Precedência e associatividade
A estrutura da gramática codifica dois conceitos:
- Precedência: operadores que ligam mais forte ficam em níveis mais profundos. Como * está abaixo de + (no nível T), ele agrupa primeiro.
- Associatividade: a recursão à esquerda (E → E + T) torna o operador associativo à esquerda, então a - b - c é lido como (a - b) - c.
Verifique você mesmo: ambígua?
A gramática E → E + E | id é ambígua para a cadeia id + id + id?
O problema do else pendente
O clássico "dangling else": em if E then if E then S else S, a quem pertence o else? Ao if interno ou ao externo?
Enganos ao escrever GLC
Projetando boas gramáticas
Reflita: ambiguidade é decidível?
Existe um algoritmo que decide se qualquer GLC é ambígua?
Termos-chave da aula
Onde isto se encaixa no curso
Esta é a aula-base da análise sintática:
- Vem da aula 2: GLC é o tipo 2 (livre de contexto) de Chomsky.
- Continua na aula 6: o parser descendente percorre a gramática para reconstruir a árvore.
- Prepara a aula 7: FIRST/FOLLOW e LL(1) dependem de a gramática estar bem formada (sem ambiguidade).
Resumo visual
Atividade em grupo · Caça à ambiguidade
Em duplas, mostrem que uma gramática é ambígua exibindo duas árvores.
Roteiro
- Dada E → E + E | E * E | ( E ) | id, derivem id + id * id de duas formas.
- Desenhem as duas árvores sintáticas distintas.
- Reescrevam a gramática em níveis (E, T, F) para eliminar a ambiguidade.
- Verifiquem que agora só há uma árvore.
Mini-quiz · Aula 5
20 questões sobre esta aula. Escolha e veja a explicação na hora.
📌 Resumo — leve isto para a prova
- GLC = (N, T, P, S); derivações geram cadeias; árvores registram a estrutura.
- Ambiguidade (duas árvores) muda o significado e deve ser eliminada.
- Estratificar a gramática codifica precedência; a recursão define a associatividade.
- O dangling else liga-se, por convenção, ao if mais próximo.
- BNF/EBNF são as notações padrão de gramáticas.