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
- O Flex converte as ERs da seção de Regras em um AFD gigante.
- Quando
yylex()roda, ele simula o AFD sobre a entrada. - Sempre que atinge um estado final, ele executa a Ação correspondente (código C/Java).
- Resolução de Conflitos:
- Se dois padrões casam com a mesma entrada (ex:
ifcasa 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”).
- Se dois padrões casam com a mesma entrada (ex:
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.