In flex, voglio restituire più token per una corrispondenza di un'espressione regolare. C'è un modo per fare questo?FLEX: C'è un modo per restituire token mutiple in una sola volta
7
A
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?
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.
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