2009-02-22 6 views

risposta

0

Intendi tutte le partite? Stai usando le funzioni regex o le funzioni stringa? Usa la bandiera globale.

Per quanto riguarda il flex, non penso che tu possa farlo. Esegui un test per una partita con un modello alla volta, quindi probabilmente è fuori portata. Perché lo vuoi? Come ottimizzazione? Problemi di scoping?

+0

Per essere onesti, sono abbastanza nuovo per il flex e non ne sono sicuro. Pensavo di usare una combinazione di espressioni regolari e corrispondenza delle stringhe. Ecco un esempio "(" \t \t {return L_PAREN;} {INT} {yylval.Int = atoi (yytext); return INT;} Quello che voglio è quello di essere in grado di tornare due gettoni in una sola volta . – Eburetto

2

Il modo in cui lo sto facendo è creare una coda di token da restituire e all'inizio di yylex(), controllare i token e restituirli.

-1

Di solito, questo viene gestito da un parser sulla parte superiore dello scanner che offre un codice molto più pulito. È possibile emulare che in una certa misura con gli stati:

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

ma questo sarà possibile ottenere molto disordinato, non appena la grammatica diventa più complesso.