FLEX: Y at-il un moyen de renvoyer plusieurs jetons à la fois?


7

En flex, je souhaite renvoyer plusieurs jetons pour une correspondance d'une expression régulière. Y a-t-il un moyen de faire cela?

0

Voulez-vous dire toutes les correspondances? Utilisez-vous des fonctions regex ou des fonctions de chaîne? Utilisez le drapeau global. En ce qui concerne flex, je ne pense pas que vous pouvez le faire. Vous testez une correspondance avec un motif à la fois, ce qui est probablement hors de portée. Pourquoi tu veux ça? Comme une optimisation? Problèmes de portée

  0

Pour être honnête, je suis assez nouveau pour fléchir et je ne suis pas sûr. Je pensais utiliser une combinaison d'expressions régulières et de correspondance de chaînes. Voici un exemple "(" \t \t {return L_PAREN;} { INT} {yylval.Int = atoi (yytext); return INT;} Ce que je veux est d'être en mesure de retourner deux jetons à la fois . 22 févr.. 092009-02-22 09:44:23


2

La façon dont j'ai fait cela est de créer une file d'attente de jetons à retourner, et au début de yylex(), vérifiez les jetons et renvoyez-les.


-1

Habituellement, cela est géré par un analyseur sur le dessus du scanner qui vous donne un code beaucoup plus propre. Vous pouvez émuler que dans une certaine mesure avec les États:

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

mais cela devenir très salissante dès que votre grammaire est plus complexe.