LRM Prof. Mantovani ← Aulas da disciplina
Semana 3 · Aula 3 de 14

Análise léxica I — tokens e expressões regulares

A primeira fase do compilador: agrupar a torrente de caracteres do código-fonte em unidades com significado, os tokens. Estudamos a tríade lexema, token e padrão, a especificação de padrões por expressões regulares e o funcionamento de um analisador léxico real.

📚 Compiladores🧪 1 simulador(es)📝 mini-quiz ao final
Objetivos da aula

O que você vai aprender

1

Definir com precisão token, lexema e padrão e distingui-los.

2

Escrever expressões regulares para as principais classes léxicas.

3

Aplicar a regra do maior casamento e tratar palavras reservadas.

4

Simular um analisador léxico sobre um trecho de código.

1 · Motivação

Por onde começa a tradução?

O código-fonte chega ao compilador como um fluxo de caracteres: letras, dígitos, espaços, símbolos. O primeiro trabalho é dar sentido a essa torrente, agrupando os caracteres em "palavras" da linguagem.

Essa fase, a análise léxica, é a fundação. Se ela errar, todas as fases seguintes recebem lixo. Por isso começamos por aqui.

🔑
Análise léxica = transformar caracteres soltos em uma sequência limpa de tokens, descartando o que não importa (espaços, comentários).
2 · Mapa

O que veremos nesta aula

TokensLexema × padrãoExpressões regularesScanner ao vivo
  • O que o scanner produz e descarta.
  • A tríade token/lexema/padrão.
  • Expressões regulares como linguagem de especificação.
  • O simulador léxico em ação.
3 · Definição

Token, lexema e padrão

Token. Par <nome, atributo> que representa uma unidade léxica (ex.: <ID, "soma">).
Lexema. A sequência concreta de caracteres do código (soma).
Padrão. A regra que descreve os lexemas de um token (ex.: "letra seguida de letras/dígitos").
4 · Aprofundamento

Por que três conceitos diferentes?

A distinção parece sutil, mas é essencial. O padrão é a especificação (a regra). O lexema é uma ocorrência concreta no texto. O token é a categoria com a qual essa ocorrência é classificada.

Um mesmo token (digamos, ID) pode ter infinitos lexemas (x, soma, contador), todos casando com o mesmo padrão.

💡
O atributo do token (o segundo componente do par) carrega informação extra: o lexema em si, ou um índice na tabela de símbolos, ou o valor numérico no caso de um literal.
5 · Exemplo

Tokenizando uma linha

Considere a linha de código a seguir e sua tokenização:

// fonte preco = 10 * qtd;
LexemaToken
preco<ID, "preco">
=<ATRIB>
10<NUM, 10>
*<OP, "*">
qtd<ID, "qtd">
;<PVIRG>
6 · Interativo

Passo a passo: o scanner em ação

Passo 1
Lê 'x': é letra, inicia um possível identificador. Continua lendo enquanto vier letra ou dígito.
Passo 2
Lê '1' e '2': ainda identificador. Lê ' ': fim do lexema. Emite <ID, "x12">.
Passo 3
Pula o espaço (descartado). Lê '=': emite <ATRIB>.
Passo 4
Pula espaço. Lê '5': é dígito, inicia número. Fim da entrada: emite <NUM, 5>.
7 · Definição

Expressões regulares

Expressão regular. Notação para descrever conjuntos de cadeias (linguagens regulares), usando operadores de união, concatenação e repetição.

Operadores básicos: união (|), concatenação (justaposição), fecho de Kleene (*, zero ou mais), fecho positivo (+, um ou mais) e opcional (?, zero ou um).

8 · Aprofundamento

Especificando classes léxicas

Cada token de uma linguagem é especificado por uma expressão regular sobre o seu padrão:

Classe léxicaExpressão regular
Identificadorletra (letra | dígito)*
Inteirodígito+
Número realdígito+ ( . dígito+ )?
Espaço em branco( espaço | tab | nl )+
9 · Analogia

Moeda, categoria e descrição

🔧 Analogia
O lexema é a moeda física que você pega na mão; o token é a categoria "moeda de R$1"; o padrão é a descrição oficial que permite reconhecer qualquer moeda de R$1, mesmo as que você nunca viu. O scanner é o caixa que olha cada moeda e diz a categoria.
10 · Comparação

Os operadores de ER

OperadorSignificadoExemplo
|União (ou)a | b casa "a" ou "b"
concatenaçãoseguido deab casa "ab"
*zero ou maisa* casa "", "a", "aa"...
+um ou maisa+ casa "a", "aa"...
?opcionala? casa "" ou "a"
11 · Fluxo

O lugar do scanner

O analisador léxico fica entre o arquivo-fonte e o analisador sintático, alimentando-o com tokens sob demanda:

CaracteresScanner
(léxico)
TokensParser
(sintático)

O parser pede "o próximo token" e o scanner o entrega, escondendo os espaços e comentários.

12 · Aprofundamento

A regra do maior casamento

Quando vários padrões casam, o scanner adota duas regras de desempate:

  • Maior casamento (longest match): escolhe o lexema mais longo possível. Diante de "ABC", reconhece um identificador "ABC", não três identificadores de uma letra.
  • Prioridade de regra: entre padrões de mesmo comprimento, vence o listado primeiro (por isso palavras-chave costumam vir antes de identificadores).
💡
É a regra do maior casamento que faz ">=" ser lido como um único token, e não como ">" seguido de "=".
13 · Verifique

Verifique você mesmo: tokens

Quantos tokens há em "x>=3" (sem contar fim de arquivo)?

A regra do maior casamento une ">" e "=" no operador ">=". Logo: <ID,"x">, <OP,">="> e <NUM,3> — três tokens.
14 · Caso prático

Palavras reservadas

Palavras como if e while casam exatamente com o padrão de identificador. Como distingui-las?

A técnica usual: o scanner reconhece o lexema como identificador e, em seguida, consulta uma tabela de palavras-chave. Se o lexema estiver lá, reclassifica o token (de ID para WHILE, IF etc.). Simples e eficiente.
15 · Erros comuns

Armadilhas léxicas

⚠️
Cuidado. Comentários e strings exigem atenção: "// até o fim da linha" e aspas que podem conter qualquer caractere fogem dos padrões simples. Um símbolo como '@' fora de uma string costuma gerar erro léxico ("caractere inesperado").

Outro erro comum: esquecer que o ponto sozinho em "3." (real sem parte decimal) não casa com dígito+ ( . dígito+ )?, porque o "?" exige dígito após o ponto.

16 · Boas práticas

Especificando o léxico

Dica. Liste primeiro os padrões mais específicos (palavras-chave, operadores compostos) e depois os genéricos (identificadores). Assim, a prioridade de regra trabalha a seu favor e você evita conflitos.
17 · Revelar

Reflita: por que separar léxico da sintaxe?

Por que não deixar o parser ler caractere por caractere e dispensar o scanner?
Por modularidade e eficiência. Separar deixa o parser trabalhar com tokens (unidades de mais alto nível), simplificando suas regras. Além disso, tarefas como ignorar espaços e comentários, reconhecer números e tratar a regra do maior casamento ficam concentradas num só lugar, otimizado com autômatos finitos. É a aplicação prática da hierarquia de Chomsky: o léxico (regular) é mais simples que a sintaxe (livre de contexto).
18 · Flashcards

Termos-chave da aula

Tokenvirar
Par <nome, atributo> que representa uma categoria léxica.
Lexemavirar
A sequência concreta de caracteres reconhecida no código.
Padrãovirar
A regra (expressão regular) que descreve os lexemas de um token.
Maior casamentovirar
Regra de desempate: escolhe o lexema mais longo possível.
19 · Conexões

Onde isto se encaixa no curso

A análise léxica é a porta de entrada do front-end:

  • Vem da aula 2: tokens correspondem ao tipo 3 (regular) de Chomsky.
  • Continua na aula 4: como as ER viram autômatos e código de scanner.
  • Alimenta a aula 5 em diante: o parser consome a sequência de tokens produzida aqui.
20 · Síntese

Resumo visual

🔑
Token (categoria) ≠ lexema (caracteres) ≠ padrão (regra). Especificamos padrões com expressões regulares. O scanner usa maior casamento e prioridade de regra, descarta espaços e comentários, e reclassifica palavras-chave via tabela.
21 · Simulador

Veja o scanner funcionando

O simulador abaixo é um analisador léxico real, em JavaScript. Digite código e observe a sequência de tokens — cor por categoria. Experimente comentários //, strings, operadores compostos como ">=" e símbolos inválidos para ver os erros léxicos.

Use-o para testar suas próprias expressões regulares mentais: o que você espera que vire um token só? E dois?

Mão na massa · colaborativo

Atividade em grupo · Projetando uma linguagem mínima

Em trios, especifiquem o léxico de uma minilinguagem de calculadora.

⏱️ 25 min👥 trios🧩 design

Roteiro

  1. Listem os tokens necessários: números, operadores, parênteses, identificadores.
  2. Escrevam a expressão regular de cada token.
  3. Testem mentalmente com a entrada x = (3 + 4) * 2 e listem os tokens esperados.
  4. Validem digitando no simulador da aula.
Especificadorescreve as ERs
Testadorgera casos de teste
Relatorcompara com o simulador
📤 Entrega: Tabela token→ER + a tokenização esperada da entrada de teste.
Teste seu conhecimento

Mini-quiz · Aula 3

20 questões sobre esta aula. Escolha e veja a explicação na hora.

0/20

📌 Resumo — leve isto para a prova