CEDIS | Universidade de Brasília (UnB)

Implementação inicial do parser

FGA0003 — Compiladores 1 · Semana 4 · 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/21

Objetivos e entrega esperada

01

Integrar

Conectar o scanner Flex ao parser Bison por meio de parser.tab.h.

02

Reconhecer

Aceitar expressões aritméticas com precedência e parênteses.

03

Testar

Executar entradas válidas, inválidas e casos de divisão por zero.

04

Documentar

Atualizar README, testes e repositório da equipe.

símbolo CEDISCEDIS
3/21

Roteiro de laboratório

  1. 01Atualizar o repositório e organizar os arquivos
  2. 02Criar parser.y e declarar tokens e tipos
  3. 03Implementar regras e ações semânticas
  4. 04Adaptar scanner.l para retornar tokens do Bison
  5. 05Gerar, compilar e executar
  6. 06Testar, corrigir, documentar e publicar
Etapa 1

Preparação do projeto

Recupere o scanner da fase léxica e organize os arquivos antes de iniciar o parser.

símbolo CEDISCEDIS
5/21

Atualize o código-base e confirme a estrutura

Repositório oficial

Estrutura recomendada

  • src/scanner.l
  • src/parser.y
  • tests/valido.txt
  • tests/invalido.txt
  • README.md

Execute git pull antes de editar e preserve o cabeçalho institucional nos arquivos.

símbolo CEDISCEDIS
6/21

Entenda o contrato entre Flex e Bison

1

Flex lê

scanner.l reconhece lexemas e atribui valores a yylval.

2

Flex retorna

O scanner devolve tokens declarados pelo parser.

3

Bison reconhece

parser.y verifica a sequência conforme a gramática.

4

Ação executa

A regra aceita calcula ou registra a estrutura reconhecida.

Etapa 2

Construção do parser.y

Implemente primeiro uma gramática pequena, gere o parser e só depois amplie.

símbolo CEDISCEDIS
8/21

Organize as três partes do parser.y

1

Declarações

Prólogo C, %union, %token, %type e precedência.

2

Gramática

Produções e ações semânticas entre os dois separadores %%.

3

Código auxiliar

main, yyerror e funções adicionais após o segundo %%.

símbolo CEDISCEDIS
9/21

Declare valores, tokens e precedência

  • NUM carrega intValue.
  • expr usa o mesmo campo do %union.
  • TIMES e DIVIDE têm precedência maior.
  • Os nomes precisam coincidir com scanner.l.
Código Bison com union, tokens, tipos e precedência
símbolo CEDISCEDIS
10/21
Regras Bison para expressões aritméticas

Implemente entrada, linhas e expressões

  • A regra line imprime o resultado.
  • error EOL permite continuar após uma linha inválida.
  • As ações usam $1, $3 e $$ para calcular valores.
símbolo CEDISCEDIS
11/21

Complete o código auxiliar

Função principal

  • int main(void) {
  • return yyparse();
  • }

Mensagem de erro

  • void yyerror(const char *mensagem) {
  • fprintf(stderr, "Erro sintático: %s\n", mensagem);
  • }

Mantenha as mensagens curtas, objetivas e úteis para diagnosticar a entrada.

Etapa 3

Integração com o scanner

Adapte o scanner para incluir o cabeçalho gerado e retornar os tokens declarados no parser.

símbolo CEDISCEDIS
13/21

Adapte o scanner.l

  • Inclua parser.tab.h.
  • Atribua yylval.intValue antes de retornar NUM.
  • Retorne EOL ao encontrar quebra de linha.
  • Mantenha uma regra final para erros léxicos.
Código Flex integrado ao Bison
símbolo CEDISCEDIS
14/21
Comandos Bison, Flex, GCC e execução

Gere, compile e execute

  • Execute os comandos na ordem mostrada.
  • Corrija erros antes de avançar.
  • Não ignore conflitos ou avisos sem entender a causa.
símbolo CEDISCEDIS
15/21

Trabalhe em ciclos curtos

1

Editar

Altere uma pequena parte de parser.y ou scanner.l.

2

Gerar

Execute Bison e Flex novamente.

3

Compilar

Use GCC com -Wall e -Wextra.

4

Testar

Execute um caso que valide a alteração.

Etapa 4

Testes e diagnóstico

Valide a precedência, os parênteses e a distinção entre erros léxicos e sintáticos.

símbolo CEDISCEDIS
17/21

Execute testes válidos

A

Soma

3 + 4 → Resultado: 7

B

Precedência

3 + 4 * 2 → Resultado: 11

C

Parênteses

(3 + 4) * 2 → Resultado: 14

D

Composição

20 / 5 - 1 → Resultado: 3

símbolo CEDISCEDIS
18/21

Classifique os erros antes de corrigir

  • Teste: a + 34.
  • Teste: 3 +.
  • Teste: (4 * 2.
  • Teste: 10 / 0.
Comparação entre erro léxico, sintático e de execução
símbolo CEDISCEDIS
19/21

Documente, versione e demonstre

1

README

Registre dependências, comandos, gramática, testes e limitações.

2

Revisar

Execute git status e remova artefatos gerados que não devam ser versionados.

3

Publicar

git add . · git commit -m "Implementa parser inicial com Bison" · git push

4

Demonstrar

Mostre uma entrada válida, uma inválida e a precedência funcionando.

símbolo CEDISCEDIS
20/21

Referências e recursos da aula

  1. Material da Semana 4: Implementação inicial do parser, 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.
  4. GNU Project. Flex Manual.
  5. Aho, Lam, Sethi e Ullman. Compilers: Principles, Techniques, and Tools.
símbolo CEDISCEDIS
21/21

Entrega da aula: parser inicial funcional

Conclua com Flex e Bison integrados, expressões válidas reconhecidas, erros diagnosticados, testes reproduzíveis e README atualizado. Códigos da disciplina: https://github.com/sergioaafreitas/COMP1

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