%{
// --- Sección de Definiciones ---
// Este código en C se copia directamente en el archivo de salida.
#include <stdio.h>
%}
/* Opciones de Flex:
noyywrap -> Indica al compilador que no necesita la función yywrap().
Simplifica la compilación.
*/
%option noyywrap
%%
/* --- Sección de Reglas --- */
/* El orden de las reglas es MUY importante.
Flex aplica la regla que coincida con la cadena más larga.
Si dos reglas coinciden con una cadena de la misma longitud,
se aplica la primera que aparece en el archivo.
Por eso, las palabras reservadas se ponen ANTES de la regla general
para identificadores.
*/
"int" { printf("Palabra Reservada (keyword): %s\n", yytext); }
"float" { printf("Palabra Reservada (keyword): %s\n", yytext); }
"if" { printf("Palabra Reservada (keyword): %s\n", yytext); }
"else" { printf("Palabra Reservada (keyword): %s\n", yytext); }
"while" { printf("Palabra Reservada (keyword): %s\n", yytext); }
"return" { printf("Palabra Reservada (keyword): %s\n", yytext); }
/* Regla para identificadores de C:
- Debe empezar con una letra (a-z, A-Z) o un guion bajo (_). -> [a-zA-Z_]
- Puede ser seguido de cero o más letras, números o guiones bajos. -> [a-zA-Z0-9_]*
*/
[a-zA-Z_][a-zA-Z0-9_]* { printf("Identificador: %s\n", yytext); }
/* Regla para reconocer números enteros */
[0-9]+ { printf("Numero: %s\n", yytext); }
/* Reglas para ignorar espacios, tabulaciones y saltos de línea */
[ \t] { /* Ignorar */ }
\n { /* Ignorar */ }
/* Cualquier otro caracter se considera no reconocido */
. { printf("Simbolo no reconocido: %s\n", yytext); }
%%
/* --- Sección de Código de Usuario --- */
int main() {
printf("Escribe codigo en C y presiona Enter (Ctrl+D para terminar):\n");
// yylex() es la función principal generada por Flex que inicia el análisis.
yylex();
return 0;
}