Aula 04: Análise Léxica: Conceitos e Autômatos
Objetivos
- Aprofundar na teoria da Análise Léxica.
- Tratamento de buffers e erros léxicos.
Conteúdo
A primeira fase da compilação lida diretamente com o texto bruto. Parece simples, mas requer eficiência extrema, pois é a única fase que toca cada caractere do arquivo fonte.
Lexema, Token e Padrão
É vital distinguir estes três termos: 1. Padrão (Pattern): A regra abstrata que define uma categoria. Geralmente descrita por uma Expressão Regular. - Ex: “Dígito seguido de zero ou mais dígitos”. 2. Lexema: A sequência específica de caracteres encontrada no código que “casa” com o padrão. - Ex: 42, 1024, 0. 3. Token: A estrutura de dados (par) devolvida ao parser, contendo a Categoria (Tipo) e, opcionalmente, o Valor (Atributo). - Ex: <NUMBER, 42>, <NUMBER, 1024>.
Nota: Tokens fixos (keywords como if, operadores como +) geralmente não precisam carregar valor, pois o tipo já diz tudo. Tokens variáveis (IDs, Números, Strings) precisam carregar o lexema ou um ponteiro para a tabela de símbolos.
Desafios de Implementação
- Lookahead: O Scanner muitas vezes precisa “espiar” o próximo caractere para decidir.
- Ex: Ao ler
<, o scanner não sabe se é “menor que” (<), “menor ou igual” (<=) ou “diferente” (<>) sem ler o próximo.
- Ex: Ao ler
- Bufferização: Para evitar milhares de chamadas de sistema (
read()) caractere por caractere, carregamos blocos grandes (4KB) em um Buffer duplo. - Sentinelas: Usamos caracteres especiais (
EOF) no fim do buffer para evitar checar o tamanho do buffer a cada incremento de ponteiro.
Referências
- Aho, A. V., Lam, M. S., Sethi, R., & Ullman, J. D. (2006). Compilers: Principles, Techniques, and Tools.
- Cooper, K., & Torczon, L. (2011). Engineering a Compiler.