Aula 06: Ferramentas: Flex

Objetivos

  • Utilizar o Flex para gerar scanners automaticamente.
  • Integrar ações semânticas em C/Java.

Conteúdo

Escrever autômatos manualmente (ceio de switch-case ou tabelas de transição) é tedioso e propenso a erros. O Flex (Fast Lexical Analyzer Generator) resolve isso.

Estrutura do Arquivo .l

O arquivo Flex é dividido em três seções separadas por %%.

/* PARTE 1: DEFINIÇÕES */
%{
    // Código C/Java copiado verbatim para o início do arquivo gerado
    #include <stdio.h>
    int line_num = 1;
%}

/* Apelidos para ERs comuns */
DIGIT   [0-9]
ID      [a-zA-Z][a-zA-Z0-9]*

%%
/* PARTE 2: REGRAS */
/* Padrão       Ação */

{DIGIT}+        { printf("Achei um numero: %s", yytext); return NUMBER; }
{ID}            { printf("Achei um ID: %s", yytext); return ID; }
[ \t]           { /* ignorar espacos */ }
\n              { line_num++; }
.               { printf("Erro lexico na linha %d", line_num); }

%%
/* PARTE 3: CÓDIGO DO USUÁRIO */
int main() {
    yylex(); // Inicia o scanner
}

Como o Flex Funciona

  1. O Flex converte as ERs da seção de Regras em um AFD gigante.
  2. Quando yylex() roda, ele simula o AFD sobre a entrada.
  3. Sempre que atinge um estado final, ele executa a Ação correspondente (código C/Java).
  4. Resolução de Conflitos:
    • Se dois padrões casam com a mesma entrada (ex: if casa com a regra de Keyword e de ID), o Flex prefere a regra listada primeiro. (Por isso Keywords vêm antes de IDs).
    • Se dois padrões casam com tamanhos diferentes, o Flex prefere o mais longo (Regra do “Max Munch”).

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