CEDIS | Universidade de Brasília (UnB)

Dentro do parser: pilha, decisões, conflitos e recuperação sintática

FGA0003 — Compiladores 1 · Semana 5 · Aula teórica

Prof. Dr. Sergio Antônio Andrade de Freitas
Curso de Engenharia de Software · 2026
símbolo CEDISlogo UnB
símbolo CEDISCEDIS
2/45

Roteiro da aula

  1. 01A ponte entre as aulas 04, 05 prática e 06
  2. 02A sala de controle do parser
  3. 03Deslocar, reduzir, aceitar e errar
  4. 04Conflitos e ambiguidades
  5. 05Precedência e associatividade
  6. 06Erro sintático e recuperação
  7. 07Reduções, ações semânticas e AST
símbolo CEDISCEDIS
3/45

Por que esta aula existe?

  • A aula 04 explicou gramáticas e Bison.
  • A prática 05 exige recuperação e mensagens de erro.
  • A aula 06 usa reduções para construir ASTs e símbolos.
Ponte entre aulas de análise sintática, recuperação e AST
símbolo CEDISCEDIS
4/45

O problema que ainda faltava responder

G

Gramática

Descreve o que pode existir na linguagem.

P

Parser

Decide passo a passo se a entrada cabe na gramática.

!

Erro

Aparece quando nenhuma ação válida resta para o estado atual.

T

AST

Pode ser construída no momento das reduções.

Parte 1

A sala de controle do parser

Pilha, lookahead e estado orientam todas as decisões.

símbolo CEDISCEDIS
6/45
Sala de controle do parser

O parser não recebe caracteres

  • O Flex já transformou caracteres em tokens.
  • O parser observa o token de antecipação.
  • A pilha registra o contexto já reconhecido.
  • O estado define as ações possíveis.
símbolo CEDISCEDIS
7/45

As quatro ações fundamentais

shift

Desloca o próximo token para a pilha.

reduce

Substitui o topo da pilha pelo lado esquerdo de uma produção.

accept

Confirma que a entrada pertence à linguagem.

!

error

Indica que nenhuma ação válida está disponível.

símbolo CEDISCEDIS
8/45

Por que não estudaremos a tabela LR completa?

  • O objetivo da disciplina é construir um compilador funcional.
  • O Bison gera as tabelas automaticamente.
  • Precisamos entender o suficiente para depurar conflitos e erros.
símbolo CEDISCEDIS
9/45

Deslocar versus reduzir

Deslocar

  • Consumir mais um token da entrada.
  • Indica que o parser ainda precisa de contexto.
  • Exemplo: mover NUM para a pilha.

Reduzir

  • Reconhecer uma estrutura já completa.
  • Aplicar uma produção gramatical.
  • Exemplo: NUM vira factor.
símbolo CEDISCEDIS
10/45

Simulação: primeiros passos em 3 + 4 * 2

A simulação mostra que o parser alterna consumo de tokens e reconhecimento de estruturas.

  • Cada redução aproxima a pilha de um símbolo não terminal.
  • A precedência pode aparecer na gramática ou em diretivas do Bison.
Passos de shift e reduce
símbolo CEDISCEDIS
11/45
atividade

Atividade 1 — Próxima ação

Considere: pilha = $ expr PLUS; entrada = NUM $. Qual é a próxima ação mais provável?

  1. Aceitar a entrada
  2. Deslocar NUM
  3. Reduzir expr PLUS
  4. Informar erro léxico
QR Code da atividade
Parte 2

Conflitos: quando há mais de um caminho

Ambiguidade e decisões incompletas aparecem como conflitos no Bison.

símbolo CEDISCEDIS
13/45
Bifurcação de conflito shift reduce

O conflito shift/reduce

  • Reduzir: reconhecer uma estrutura imediatamente.
  • Deslocar: consumir mais um token antes de decidir.
  • Em expressões, isso costuma envolver precedência.
símbolo CEDISCEDIS
14/45

Gramática ambígua para expressões

Regras simples

  • expr → expr PLUS expr
  • expr → expr TIMES expr
  • expr → NUM

Problema

  • 3 + 4 * 2 permite duas árvores.
  • O parser precisa decidir entre reduzir e deslocar.
  • A matemática esperada exige precedência.
símbolo CEDISCEDIS
15/45

Duas árvores possíveis

A

(3 + 4) * 2

A soma vira subexpressão esquerda da multiplicação.

B

3 + (4 * 2)

A multiplicação fica dentro da subexpressão direita da soma.

?

Sem regra adicional

A gramática não escolhe sozinha qual interpretação é desejada.

símbolo CEDISCEDIS
16/45
atividade

Atividade 2 — Ambiguidade

Na gramática expr → expr + expr | expr * expr | NUM, qual é o problema com NUM + NUM * NUM?

  1. O scanner não reconhece NUM
  2. A gramática permite mais de uma árvore
  3. O símbolo inicial está ausente
  4. A linguagem não é livre de contexto
QR Code da atividade
símbolo CEDISCEDIS
17/45

Conflito não é apenas ruído do compilador

  • Pode indicar ambiguidade real.
  • Pode indicar precedência ausente.
  • Pode indicar uma regra redundante.
  • Pode mascarar uma linguagem diferente da pretendida.
símbolo CEDISCEDIS
18/45

Conflito redução/redução

Situação

  • Duas produções parecem reconhecer a mesma sequência.
  • O parser não sabe qual redução aplicar.

Exemplo conceitual

  • item → IDENT
  • valor → IDENT
  • Em determinado contexto, ambas servem.
Parte 3

Precedência e associatividade

Duas ferramentas para tornar a decisão do parser mais determinada.

símbolo CEDISCEDIS
20/45

Precedência

Ideia

  • Alguns operadores agrupam antes de outros.
  • TIMES deve ter precedência maior que PLUS.

No Bison

  • %left PLUS
  • %left TIMES
  • Declarações posteriores têm maior precedência.
símbolo CEDISCEDIS
21/45

Associatividade

À esquerda

  • 10 - 3 - 2
  • Interpreta como (10 - 3) - 2

À direita

  • a = b = c
  • Interpreta como a = (b = c)
símbolo CEDISCEDIS
22/45
atividade

Atividade 3 — Associatividade

Com %left MINUS, como a expressão 10 - 3 - 2 é interpretada?

  1. 10 - (3 - 2)
  2. (10 - 3) - 2
  3. 10 - 3 + 2
  4. A expressão sempre gera conflito
QR Code da atividade
símbolo CEDISCEDIS
23/45

Duas formas de resolver expressões

Diretivas

  • %left PLUS MINUS
  • %left TIMES DIVIDE
  • Útil para gramáticas compactas.

Gramática estruturada

  • expr → expr + term | term
  • term → term * factor | factor
  • Mais explícita para fins didáticos.
símbolo CEDISCEDIS
24/45

Comando útil para investigar conflitos

  • bison -Wall -d -v parser.y
  • O arquivo .output funciona como um microscópio do parser.
  • Use os relatórios para localizar estados, conflitos e ações possíveis.
Parte 4

O momento do erro

Erro sintático surge quando nenhuma ação válida permanece.

símbolo CEDISCEDIS
26/45

Quando o erro é declarado?

Estado atual

  • A pilha indica o contexto.
  • O estado contém as ações possíveis.

Lookahead

  • O próximo token não permite shift.
  • Nenhuma redução ou aceitação é válida.

Exemplo: pilha = $ expr PLUS; lookahead = SEMICOLON.

símbolo CEDISCEDIS
27/45

O erro pode ter começado antes

Entrada

  • (3 + 4 * 2;

Diagnóstico

  • O erro pode aparecer no ponto e vírgula.
  • A causa real é o parêntese não fechado.
símbolo CEDISCEDIS
28/45

Três responsabilidades diferentes

1

Detecção

Perceber que a entrada não cabe no estado atual.

2

Diagnóstico

Explicar o token encontrado, o contexto e a linha.

3

Recuperação

Encontrar ponto seguro para continuar a análise.

símbolo CEDISCEDIS
29/45

Recuperar não é corrigir

  • O parser pode descartar tokens.
  • Pode procurar delimitadores como ponto e vírgula.
  • Não deve inventar silenciosamente o programa desejado.
Linha do tempo da recuperação sintática
símbolo CEDISCEDIS
30/45
atividade

Atividade 4 — Token de sincronização

Em uma linguagem na qual comandos terminam com ;, qual é um bom token inicial de sincronização?

  1. NUM
  2. PLUS
  3. SEMICOLON
  4. IDENTIFICADOR
QR Code da atividade
Parte 5

Recuperação com Bison

O token especial error permite modelar regiões inválidas da entrada.

símbolo CEDISCEDIS
32/45

O token especial error

O que é

  • Símbolo especial do Bison.
  • Não é retornado pelo Flex.
  • Representa uma região inválida.

Exemplo

  • statement: expr SEMICOLON
  • statement: error SEMICOLON
  • yyerrok;
símbolo CEDISCEDIS
33/45

Produção de recuperação por ponto e vírgula

  • statement: expr SEMICOLON
  • | error SEMICOLON { yyerrok; }
  • O ponto e vírgula serve como token de sincronização.
  • A próxima sentença pode ser analisada normalmente.
símbolo CEDISCEDIS
34/45

yyerrok e yyclearin

yyerrok

  • Encerra o estado de recuperação.
  • Permite que novos erros sejam reportados.

yyclearin

  • Descarta o lookahead atual.
  • Só deve ser usado quando esse token não é mais útil.
símbolo CEDISCEDIS
35/45

Estratégias ruins de recuperação

  • Descartar todo o restante do arquivo.
  • Imprimir mensagens genéricas demais.
  • Repetir o mesmo erro várias vezes.
  • Corrigir silenciosamente o código do usuário.
símbolo CEDISCEDIS
36/45

Autópsia de uma entrada com erro

ok

Entrada 1

3 + 4 * 2; → Resultado: 11

!

Entrada 2

5 + ; → erro próximo de ;

ok

Entrada 3

6 * 7; → Resultado: 42

símbolo CEDISCEDIS
37/45
atividade

Atividade 5 — Resposta aberta

Em até 250 caracteres, explique por que recuperar-se de um erro sintático não significa corrigir o programa do usuário.

Resposta aberta · até 250 caracteres
QR Code da atividade
Parte 6

Da redução à AST

Toda redução pode carregar uma ação semântica.

símbolo CEDISCEDIS
39/45
Da redução à construção da AST

Redução, ação semântica e AST

  • A ação ocorre quando a produção é reduzida.
  • $1, $2 e $3 carregam valores dos símbolos da direita.
  • $$ produz o valor semântico do lado esquerdo.
símbolo CEDISCEDIS
40/45

Exemplo de ação semântica no Bison

  • expr: expr PLUS expr { $$ = criar_no_operacao('+', $1, $3); }
  • A redução cria o nó correspondente ao operador.
  • Os filhos do nó vêm dos valores semânticos já reconhecidos.
símbolo CEDISCEDIS
41/45

O que perguntar ao projeto da equipe?

Gramática

  • Há conflitos relatados pelo Bison?
  • A precedência está explícita?
  • A associatividade está definida?

Recuperação e AST

  • Quais tokens sincronizam comandos?
  • Quais reduções criarão nós?
  • Quais mensagens ajudam o usuário?
símbolo CEDISCEDIS
42/45

Repositório oficial da disciplina

símbolo CEDISCEDIS
43/45

Síntese em cinco frases

1

O parser decide usando pilha, estado e lookahead.

2

Deslocar consome; reduzir reconhece.

3

Conflitos indicam decisões não determinadas pela gramática.

4

Recuperar encontra ponto seguro para continuar.

5

Reduções podem construir a AST.

símbolo CEDISCEDIS
44/45

Referências e materiais

  1. GNU Bison Manual. Seções sobre parser states, shift/reduce conflicts, operator precedence e error recovery.
  2. Aho, A. V.; Lam, M. S.; Sethi, R.; Ullman, J. D. Compilers: Principles, Techniques, and Tools. 2. ed. Pearson, 2006.
  3. Wirth, N. Compiler Construction. ETH Zurich, 2005.
  4. Repositório da disciplina: https://github.com/sergioaafreitas/COMP1
símbolo CEDISCEDIS
45/45

Próxima conexão

Na prática, vamos transformar esse entendimento em mensagens de erro e recuperação. Depois, cada redução começará a produzir AST e símbolos.

→ avançar · ← voltar · deslize (touch) · n notas · f tela cheia · p imprimir