










Sig: El operador de ``trailing
Sup: Expresiones Regulares en Flex
Ant: La Opción outfile
Err: Si hallas una errata ...
En general, la rutina que hace el análisis léxico,
yylex(), lee su entrada a través de la macro
YY_INPUT. Esta macro es llamada con tres parámetros
YY_INPUT(buf,result,max)
el primero, buf es utilizado para guardar la entrada.
el tercero max indica el número de caracteres que yylex()
pretende leer de la entrada. El segundo result contendrá el número
de caracteres realmente leídos. Para poder leer desde una cadena
(string) basta
con modificar YY_INPUT para que copie los datos de la cadena en
el buffer pasado como parámetro a YY_INPUT.
Sigue un ejemplo:
$ cat string.l
%{
#undef YY_INPUT
#define YY_INPUT(b,r,m) (r = yystringinput(b,m))
#define min(a,b) ((a<b)?(a):(b))
%}
%%
[0-9]+ printf("Num-");
[a-zA-Z][a-zA-Z_0-9]* printf("Id-");
[ \t]+
. printf("%c-",yytext[0]);
%%
extern char string[];
extern char *yyinputptr;
extern char *yyinputlim;
int yystringinput(char *buf, int maxsize) {
int n = min(maxsize, yyinputlim-yyinputptr);
if (n > 0) {
memcpy(buf, yyinputptr, n);
yyinputptr += n;
}
return n;
}
int yywrap() { return 1; }
Este es el fichero conteniendo la función main:
$ cat stringmain.c
char string[] = "one=1;two=2";
char *yyinputptr;
char *yyinputlim;
main() {
yyinputptr = string;
yyinputlim = string + strlen(string);
yylex();
printf("\n");
}
Y esta es la salida:
$ a.out
Id-=-Num-;-Id-=-Num-
La cadena string = "one=1;two=2" definida en la línea 2 ha sido utilizada
como entrada para el análisis léxico.











Sig: El operador de ``trailing
Sup: Expresiones Regulares en Flex
Ant: La Opción outfile
Err: Si hallas una errata ...
Casiano Rodríguez León
2012-05-22