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.
  • 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.
Back to top