KF Cadernos interativos
Compiladores
Exercícios Projeto de Compiladores · pré-Prova 1 · 16/09/2026

Lista oficial pré-P1 — com gabarito comentado

Os quatro blocos abaixo vêm da folha fornecida pelo professor. Tente resolver sem abrir o gabarito.

1. Complete as lacunas

O front end começa pela análise léxica, que lê a entrada e produz ________. A análise sintática obedece à gramática e produz uma ________. Em seguida fazemos a análise ________, incluindo a verificação de variáveis.

Gabarito
sequência de tokens; árvore de sintaxe abstrata (AST); semântica.

2. Resultado da análise léxica

  1. 4+9
  2. 2+8+1.0+1
  3. 5+-
  4. 5$
  5. (3+2)*2
Gabarito comentado

a) INT MAIS INT.

b) INT MAIS INT MAIS FLOAT MAIS INT.

c) INT MAIS MENOS. Não há erro léxico: os três tokens são reconhecidos. O problema aparecerá na análise sintática.

d) INT e então erro léxico em $, pois o caractere não pertence aos tokens definidos.

e) PAREN_ESQ INT MAIS INT PAREN_DIR VEZES INT.

3. AST dos itens (a), (b) e (e); por que (c) e (d) não produzem árvore?

Gabarito comentado

(a) 4+9: raiz +, folhas 4 e 9.

(b) 2+8+1.0+1: pela recursão à esquerda da gramática, a estrutura é associativa à esquerda: (((2+8)+1.0)+1). Cada + é nó interno.

(e) (3+2)*2: raiz *; filho esquerdo é a subárvore 3+2; filho direito é 2.

(c) 5+-: o lexer produz tokens, mas a sequência não pode ser derivada pela gramática porque faltam operandos. É erro sintático; portanto o parser não conclui a AST.

(d) 5$: falha antes, no lexer, pois $ não é token válido. Sem sequência lexical completa, não há AST.

4. Tabela de símbolos após cada linha

x = 3+9 y = 2+2 x = x - y y = 3 + x x = 5*z
Gabarito passo a passo

1) x=12 → ST={x:12}

2) y=4 → ST={x:12, y:4}

3) x=x-y=12-4=8 → ST={x:8, y:4}

4) y=3+x=11 → ST={x:8, y:11}

5) z não existe. Ocorre erro semântico e a atribuição não deve atualizar x. ST permanece {x:8, y:11}.

Checklist P1 · fontes anexadas

Mapa de revisão

Você precisa saberConseguir fazer
Etapas do compiladorOrdenar fonte → tokens → AST → semântica/IR → assembly e separar assembler/linker.
LinguagensDefinir Σ, símbolo, palavra, ε, Σ*, linguagem e reconhecimento; relacionar regular ↔ lexer e livre de contexto ↔ parser.
LexerAplicar regex/tokens e diferenciar erro léxico de sequência apenas sintaticamente inválida.
GLC/parserLer G=(V,Σ,R,S), derivar strings e decidir se sequência de tokens respeita a gramática.
PrecedênciaLer os “andares” expr/termo/fator e prever a AST.
Derivação × ASTDesenhar ambas e explicar o que é removido na abstração.
AvaliaçãoAvaliar AST das folhas até a raiz; explicar NoNum e NoOperacao.
ParêntesesUsar fator → (expr) para mudar agrupamento.
Variáveis/STAtualizar tabela de símbolos e detectar identificador inexistente.
Novos nósDistinguir NoAtribuicao de NoVar e explicar por que avalia() recebe ST.
Aula 05: nenhum arquivo dessa aula foi fornecido. O caderno usa apenas o estado consolidado mostrado na Aula 06 e não inventa um conteúdo específico para a aula ausente.
Treino extra criado a partir das Aulas 01–03

Questões extras — compilação, lexer e parser

1. O compilador recebe C e gera diretamente o executável final?
No recorte técnico da Aula 01, não. O compilador gera assembly; assembler transforma assembly em código objeto e linker produz o executável.
2. Por que regex aparece naturalmente na análise léxica?
Porque os padrões de tokens são descritos por expressões regulares. O material relaciona essa etapa ao reconhecimento de linguagens regulares.
3. Qual é a diferença entre aceitar lexicamente “2++” e aceitar sintaticamente?
Lexicamente, INT SOMA SOMA pode ser uma sequência de tokens válida. Sintaticamente, a gramática de expressões não permite dois operadores binários consecutivos sem operando.
4. Em G=(V,Σ,R,S), o que representa cada componente?
V: variáveis/não terminais; Σ: terminais; R: regras de produção; S: símbolo inicial.
5. O parser trabalha sobre caracteres brutos ou sobre tokens?
Sobre a sequência de tokens produzida pela análise léxica. As regras podem usar os próprios tokens como alfabeto terminal.
Treino extra criado a partir das Aulas 04, 06, 07 e 08

Questões extras — gramática, precedência e AST

6. Por que criar a variável “termo” ajuda a multiplicação a ter prioridade sobre a soma?
Porque soma/subtração ficam no nível de expr e multiplicação/divisão ficam dentro de termo. Assim, a subestrutura multiplicativa é formada abaixo da soma e é avaliada primeiro.
7. Em 4+7*3+8, qual operação é a primeira avaliada e por quê?
7*3, porque a multiplicação aparece em uma subárvore mais profunda e a avaliação começa pelas folhas/subárvores inferiores.
8. Qual a diferença essencial entre árvore de derivação e AST nesta disciplina?
A derivação mostra os não terminais e todas as regras aplicadas; a AST abstrai esse processo e mantém a estrutura hierárquica operacional necessária para representar e avaliar a expressão.
9. O que muda estruturalmente entre 2+3*4 e (2+3)*4?
Na primeira, + é raiz e * fica abaixo; na segunda, * é raiz e + vira subárvore esquerda por causa do agrupamento dos parênteses.
10. O que fazem NoNum e NoOperacao?
NoNum é folha e retorna o número armazenado. NoOperacao é nó interno binário, avalia os filhos e aplica o operador.
Treino extra criado a partir das Aulas 09–10

Questões extras — semântica, variáveis e ST

11. Por que variáveis exigem que o interpretador mantenha estado entre linhas?
Porque uma linha pode usar um identificador criado ou alterado em uma linha anterior. A ST preserva essas associações ao longo da sequência.
12. Qual é a função de NoAtribuicao?
Representar um statement ID=expr, avaliar a expressão e associar o resultado ao identificador na tabela de símbolos.
13. Qual é a função de NoVar?
Representar o uso de uma variável dentro de uma expressão e consultar seu valor na ST durante a avaliação.
14. x=5*z pode passar pelo lexer e parser e ainda falhar? Explique.
Sim. Os tokens são reconhecíveis e a estrutura ID=expr é válida. Se z não existir na ST, a falha é semântica.
15. Por que o método avalia() passa a receber a tabela de símbolos?
Porque nós que leem ou escrevem variáveis precisam acessar o estado compartilhado. Sem a ST, NoVar não saberia obter o valor e NoAtribuicao não teria onde armazená-lo.