FLEX: ¿Hay alguna manera de devolver tokens mutiple a la vez?


7

In flex, quiero devolver varios tokens para una coincidencia de una expresión regular. ¿Hay alguna forma de hacer esto?

0

¿Te refieres a todos los partidos? ¿Estás usando funciones regex o funciones de cuerda? Usa la bandera global.

En cuanto a flex, no creo que puedas hacer eso. Usted prueba una coincidencia con un patrón a la vez, por lo que probablemente esté fuera del alcance. ¿Por qué querías eso? Como una optimización? Problemas de alcance?

  0

Para ser sincero, soy bastante nuevo en flex y no estoy seguro. Pensé que estaba usando una combinación de expresiones regulares y coincidencia de cadenas. Aquí es un ejemplo "(" \t \t {return L_PAREN;} {INT} {yylval.Int = atoi (yytext); INT retorno;} Lo que yo quiero es ser capaz de devolver dos fichas a la vez . 22 feb. 092009-02-22 09:44:23


2

La forma en que he estado haciendo esto es crear una cola de tokens que se devolverán, y al comienzo de yylex(), buscar los tokens y devolverlos.


-1

Por lo general, esto es manejado por un analizador en la parte superior del escáner que le da un código mucho más limpio. Puede emular que hasta cierto punto con los estados:

%option noyywrap 

%top { 
#define TOKEN_LEFT_PAREN 4711 
#define TOKEN_RIGHT_PAREN 4712 
#define TOKEN_NUMBER  4713 
} 

%x PAREN_STATE 
%% 
"("   BEGIN(PAREN_STATE); return TOKEN_LEFT_PAREN; 
<PAREN_STATE>{ 
    [0-9]+ return TOKEN_NUMBER; 
    ")"  BEGIN(INITIAL); return TOKEN_RIGHT_PAREN; 
    .|\n  /* maybe signal syntax error here */ 
} 
%% 
int main (int argc, char *argv []) 
{ 
    int i; 

    while ((i = yylex())) 
    printf ("%d\n", i); 

    return 0; 
} 

pero esto va a ser muy complicado en cuanto su gramática se vuelve más complejo.