🚀 Capítulo 10: Análise Léxica (Tema: Sherlock Holmes)
NOTE
Este capítulo utiliza a temática de Sherlock Holmes para explicar a Análise Léxica. Investigue o código caractere por caractere e divida-o em pistas menores chamadas Tokens!
1. 🎯 Objetivo da Aula
Compreender a primeira fase de um compilador, a Análise Léxica (ou Scanner), entendendo como o código-fonte em texto é quebrado em pequenos pedaços significativos chamados Tokens.
2. 🏢 O Cenário Prático (Seu Desafio)
O detetive Sherlock Holmes chega a uma cena de crime. Ele não tenta adivinhar o culpado logo de cara. Primeiro, ele pega sua lupa e procura por pequenas pistas isoladas:
- Um fio de cabelo no chão.
- Uma pegada na lama.
- Cinzas de um charuto específico.
Ele quebra o cenário complexo em pequenos pedaços de evidência. O compilador faz exatamente a mesma coisa na sua primeira fase! Ele recebe o seu código (que é apenas um arquivo de texto gigante) e, usando uma “lupa”, o lê caractere por caractere para identificar as pequenas pistas da linguagem, que chamamos de Tokens. Seu desafio é ser o detetive do código!
🧠 Fundamentos: A Teoria Traduzida
A Análise Léxica é o processo de converter uma sequência de caracteres (o código que você digitou) em uma sequência de Tokens.
🔍 O que é um Token?
É a menor unidade com significado para o compilador. Pense nele como as palavras de uma frase.
Se você escrever este código em C++:
int idade = 25;
O Analisador Léxico vai quebrá-lo nas seguintes pistas (Tokens):
intPalavra Reservada (Tipo de dado).idadeIdentificador (Nome que você deu para a variável).=Operador de Atribuição.25Valor Numérico Inteiro.;Caractere Especial (Fim de linha).
❌ Erro Léxico:
Acontece quando o analisador encontra um caractere que não pertence ao alfabeto da linguagem.
- Exemplo: Se você usar o símbolo
@no meio de um nome de variável em C++ (int id@de = 25;), o analisador léxico vai parar e dizer: “Não conheço essa pista!“.
4. 📖 Exemplo Guiado: O Espaço em Branco
O analisador léxico é muito inteligente: ele geralmente ignora os espaços em branco e as quebras de linha que nós usamos para deixar o código bonito. Para o compilador, estes dois códigos são exatamente iguais:
- Código A:
x=5; - Código B:
x = 5 ;Ambos geram a mesma sequência de 4 tokens: [Identificador] [Operador] [Número] [PontoEVírgula].
5. 🛠️ Prática Obrigatória 1: Quebrando em Tokens
Diga quantos tokens existem na linha de código abaixo e classifique o primeiro e o último:
if (nota >= 7)
6. 🛠️ Prática Obrigatória 2: O Detetive de Erros
Diga se as situações abaixo geram um Erro Léxico (caractere inválido que a linguagem não conhece) ou não:
- Em Python, você escreveu
media = 10(Tudo certo). - Em C++, você escreveu
float valor = 10.5$;(com o símbolo de cifrão no final). - Você escreveu um comentário gigante no código:
// Isso é um comentário.
7. 📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)
- Faça o Commit: No GitHub Desktop, digite a mensagem (ex:
Finaliza Capítulo 10 Hardware) e clique em Commit to main. - Envie para a Nuvem (Push): Clique em Push origin.
8. 📂 Estrutura de Pastas
mod_14_hardware_e_compiladores/
├── capitulos/
│ ├── capitulo_10_lexica.md
│ └── codigos/
│ └── cap10/
│ └── scanner_output.txt💡 Checkpoint de Lógica
A Análise Léxica não tenta entender se a frase faz sentido (isso é trabalho das próximas fases). Ela apenas garante que todas as palavras usadas pertencem ao dicionário da linguagem!
10. 🔥 Desafio de Fixação
Pesquise o que significa o termo Regex (Expressões Regulares) e como os criadores de compiladores usam Regex para definir o que é um Token válido.
🔑 Gabarito de Código/Fórmulas
Gabarito da Prática 1: Existem 6 tokens:
if(Palavra reservada).((Símbolo especial).nota(Identificador).>=(Operador relacional).7(Número).)(Símbolo especial). Gabarito da Prática 2:- Não (Tudo válido).
- Sim (O símbolo
$não é um operador válido em C++ e causará um erro léxico). - Não (O analisador léxico ignora comentários, pois eles servem apenas para humanos).