CEDIS | Universidade de Brasília (UnB)

Continuação do parser e tratamento de erros sintáticos

FGA0003 — Compiladores 1 · Semana 5 · Aula prática

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

Objetivos e produto da aula

01

Revisar

Confirmar que o parser inicial da equipe ainda compila e reconhece entradas válidas.

02

Diagnosticar

Diferenciar erros léxicos, sintáticos e de execução.

03

Recuperar

Adicionar uma produção com o token especial error e um delimitador de sincronização.

04

Testar

Criar testes inválidos e documentar a estratégia no repositório.

símbolo CEDISCEDIS
3/24

Roteiro de laboratório

  1. 01Recuperar o estado da sprint
  2. 02Criar uma linha de base funcional
  3. 03Observar falhas atuais do parser
  4. 04Implementar recuperação por ponto e vírgula
  5. 05Melhorar mensagens de erro
  6. 06Testar múltiplos erros no mesmo arquivo
  7. 07Adaptar, documentar e publicar
Etapa 1

Preparação do laboratório

Antes de alterar o parser, confirme que a versão anterior ainda compila e executa.

símbolo CEDISCEDIS
5/24

Atualize o repositório e confirme a linha de base

Comandos iniciais

  • git pull
  • git status
  • make clean
  • make

Fonte oficial

Não implemente recuperação antes de confirmar que o parser atual ainda funciona.

símbolo CEDISCEDIS
6/24

Teste válido de referência

in

Entrada

3 + 4 * 2;

out

Saída esperada

Resultado: 11

ok

Objetivo

Garantir que a precedência e a compilação básica continuam funcionando.

Etapa 2

Detecção, diagnóstico e recuperação

Três responsabilidades diferentes que costumam aparecer misturadas no código inicial.

símbolo CEDISCEDIS
8/24

Separe as responsabilidades

  • Detecção: o parser percebe que a entrada não cabe na gramática.
  • Diagnóstico: o compilador comunica linha, token e contexto.
  • Recuperação: o parser tenta continuar sem encerrar a análise.
Detecção, diagnóstico e recuperação de erros sintáticos
símbolo CEDISCEDIS
9/24

Classifique as falhas antes de corrigir

L

Erro léxico

Caractere não reconhecido pelo scanner. Exemplo: @.

S

Erro sintático

Sequência de tokens inválida para a gramática. Exemplo: 3 + ;

E

Erro de execução

Ação semântica problemática. Exemplo: 10 / 0;

símbolo CEDISCEDIS
10/24
Recuperação panic mode usando ponto e vírgula

Use panic mode com ponto e vírgula

  • O ponto e vírgula marca o fim de uma instrução simples.
  • Ao falhar, o parser descarta tokens até sincronizar.
  • Depois de sincronizar, a análise pode continuar.
Etapa 3

Implementação no Bison

Inclua o token especial error em uma produção segura e pequena.

símbolo CEDISCEDIS
12/24

Produção de recuperação

  • Use SEMICOLON de forma consistente no parser e no scanner.
  • %empty deixa a produção vazia explícita.
  • yyerrok encerra o estado de recuperação.
  • Use yyclearin apenas quando for necessário descartar o lookahead.
Produção de Bison com error, SEMICOLON e yyerrok
símbolo CEDISCEDIS
13/24

Melhore yyerror

Versão mínima

  • void yyerror(const char *mensagem) {
  • fprintf(stderr, "[ERRO SINTÁTICO] %s\n", mensagem);
  • }

Versão com linha

  • Use %option yylineno no scanner.
  • Declare extern int yylineno; no parser, se necessário.
  • Inclua a linha na mensagem.

A mensagem deve ajudar a equipe a localizar e reproduzir o erro.

símbolo CEDISCEDIS
14/24
Scanner Flex com parser.tab.h, yylineno e SEMICOLON

Corrija o scanner.l

  • Inclua parser.tab.h corretamente.
  • Retorne SEMICOLON, não SEMI se o parser usa SEMICOLON.
  • Evite aspas escapadas indevidamente nas regras Flex.
  • Use stderr para mensagens de erro léxico.
símbolo CEDISCEDIS
15/24

Compile novamente

1

Bison

bison -d src/parser.y

2

Flex

flex src/scanner.l

3

GCC

gcc -Wall -Wextra -o parser parser.tab.c lex.yy.c -lfl

4

Executar

./parser < tests/invalidos/multiplos-erros.txt

Etapa 4

Testes de recuperação

O objetivo não é evitar todo erro, mas continuar depois de erros esperados.

símbolo CEDISCEDIS
17/24

Entradas para observar o comportamento atual

1

Sintático

3 + ;

2

Parênteses

(3 + 2;

3

Excesso

3 + 4));

4

Léxico

3 + @ 2;

5

Execução

10 / 0;

símbolo CEDISCEDIS
18/24

Teste com múltiplos erros no mesmo arquivo

txt

Arquivo

3 + 4; 5 + ; 6 * 7; (8 + 2; 9 - 1;

ok

Critério

Após recuperar de um erro, o parser deve processar entradas seguintes.

doc

Evidência

Guarde o arquivo em tests/invalidos e registre a saída no README.

símbolo CEDISCEDIS
19/24

Adapte ao projeto da equipe

Tokens de sincronização possíveis

  • ; ao final de comandos
  • } ao final de blocos
  • ) ao final de expressões agrupadas
  • palavras-chave que iniciam novas declarações

Evite

  • descartar todo o arquivo após o primeiro erro
  • mensagens genéricas demais
  • duplicar mensagens em excesso
  • misturar erro léxico com sintático

A estratégia precisa fazer sentido para a linguagem escolhida pela equipe.

símbolo CEDISCEDIS
20/24

Trabalhe em ciclos curtos

  • Implemente uma produção de recuperação por vez.
  • Teste um erro por vez antes de testar muitos erros.
  • Registre limitações no README.
  • Publique commits pequenos e verificáveis.
Ciclo implementar, testar, ajustar, documentar e versionar
símbolo CEDISCEDIS
21/24

Documente e versione

1

README

Explique erros reconhecidos, sincronizadores, exemplos e limitações.

2

Testes

Versione tests/validos e tests/invalidos.

3

Commit

git add . · git commit -m "Adiciona recuperação e testes de erros sintáticos"

4

Push

git push

símbolo CEDISCEDIS
22/24

Checklist de conclusão

Linha de base

Parser compila e entrada válida funciona.

Recuperação

Produção com error e token de sincronização implementada.

Diagnóstico

Mensagens diferenciam erro léxico, sintático e execução.

Repositório

Testes e README atualizados no GitHub.

símbolo CEDISCEDIS
23/24

Referências e recursos da aula

  1. Material da Semana 5: Continuação do parser e tratamento de erros sintáticos, FGA0003 — Compiladores 1, Universidade de Brasília.
  2. Repositório da disciplina e códigos das aulas práticas: https://github.com/sergioaafreitas/COMP1
  3. GNU Project. Bison Manual: Error Recovery.
  4. GNU Project. Flex Manual.
  5. Aho, Lam, Sethi e Ullman. Compilers: Principles, Techniques, and Tools.
símbolo CEDISCEDIS
24/24

Entrega da aula: parser mais robusto

Conclua com recuperação por token de sincronização, mensagens melhores, testes inválidos documentados e commits publicados. Códigos da disciplina: https://github.com/sergioaafreitas/COMP1

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