FLEX: Gibt es eine Möglichkeit, multiple Token auf einmal


7

zurückzugeben. Im Flex möchte ich mehrere Token für eine Übereinstimmung eines regulären Ausdrucks zurückgeben. Gibt es eine Möglichkeit, dies zu tun?

0

Meinst du alle Übereinstimmungen? Verwenden Sie Regex-Funktionen oder String-Funktionen? Verwenden Sie die globale Flagge.

Wie für Flex, ich glaube nicht, dass Sie das tun können. Sie testen für eine Übereinstimmung mit einem Muster zu einer Zeit, so dass es wahrscheinlich außerhalb des Umfangs ist. Warum wolltest du das? Als Optimierung? Scoping-Probleme?

  0

Um ehrlich zu sein, ich bin ziemlich neu zu flex und ich bin mir nicht sicher. Ich dachte, ich würde eine Kombination aus regulären Ausdrücken und String-Matching verwenden. Hier ist ein Beispiel "(" \t \t {return L_PAREN;} {INT} {yylval.Int = atoi (yytext); return INT;} Was ich will, auf einmal zurück zwei Token zu können, ist . 22 feb. 092009-02-22 09:44:23


2

Die Art, wie ich das getan habe, ist eine Warteschlange von zurückzugebenden Tokens zu erstellen, und am Anfang von yylex(), nach Token suchen und sie zurückgeben.


-1

Normalerweise wird dies von einem Parser oben auf dem Scanner gehandhabt, der Ihnen viel saubereren Code gibt. Sie können, dass mit den Staaten zu einem gewissen Grad emulieren:

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

aber das wird sehr chaotisch, sobald Ihre Grammatik komplexer wird.