FLEX: Czy istnieje sposób na natychmiastowe zwrócenie wielu znaczników?


7

W flexie chcę zwrócić wiele tokenów za jeden mecz wyrażenia regularnego. Czy jest jakiś sposób na zrobienie tego?

0

Masz na myśli wszystkie mecze? Czy używasz funkcji regularnych lub łańcuchowych? Użyj flagi globalnej.

Jeśli chodzi o flex, nie sądzę, że można to zrobić. Testujesz na mecz z jednym wzorcem na raz, więc prawdopodobnie jest poza zakresem. Dlaczego tego chcesz? Jako optymalizacja? Problemy z określaniem zakresu?

  0

Szczerze mówiąc, jestem dość nowy, aby się wygiąć i nie jestem pewien. Myślałem, że używam kombinacji wyrażeń regularnych i dopasowywania ciągów. Oto przykład "(" \t \t {return L_PAREN;} {INT} {yylval.Int = atoi (yytext); return INT;} Co chcę jest aby móc powrócić dwa żetony na raz . 22 lut. 092009-02-22 09:44:23


2

Sposób, w jaki to robię, polega na utworzeniu kolejki tokenów, które należy zwrócić, a na początku yylex() należy sprawdzić tokeny i je zwrócić.


-1

Zwykle jest to obsługiwane przez analizator składający się na skanerze, który zapewnia znacznie czystszy kod. Możesz naśladować to w pewnym stopniu za pomocą stanów:

%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; 
} 

, ale stanie się to bardzo kłopotliwe, gdy tylko gramatyka stanie się bardziej skomplikowana.