next up previous contents index PLPL moodlepserratamodulosperlmonksperldocapuntes LHPgoogleetsiiullpcgull
Sig: El operador de ``trailing Sup: Expresiones Regulares en Flex Ant: La Opción outfile Err: Si hallas una errata ...

Leer desde una Cadena: YY_INPUT

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.


next up previous contents index PLPL moodlepserratamodulosperlmonksperldocapuntes LHPgoogleetsiiullpcgull
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