FLEX:一度に複数のトークンを返す方法はありますか?


7

フレックスでは、正規表現の1つの一致に対して複数のトークンを返す必要があります。これを行う方法はありますか?

0

すべて一致しますか?正規表現関数または文字列関数を使用していますか?グローバルフラグを使用します。

フレックスに関しては、私はあなたがそれを行うことはできないと思います。一度に1つのパターンで一致するかどうかをテストして、おそらく範囲外です。なぜそれが欲しいのですか?最適化として?スコープの問題?

  0

正直言って、私はかなりフレックスしていて、わかりません。私は正規表現と文字列のマッチングを組み合わせて使用​​していると思っていました。 {INT} {yylval.Int = ATOI(yytext); INTを返す;}私が欲しいもの 一度に2つのトークンを返すことができるようになる。ここで は "(" \t \t {L_PARENを返す}例 あります。 22 2月. 092009-02-22 09:44:23


2

返されるトークンのキューを作成し、yylex()の冒頭にトークンをチェックして戻します。


-1

通常、これはスキャナの上にあるパーサによって処理されます。これにより、よりクリーンなコードが提供されます。

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

これをある程度までエミュレートすることができますが、文法が複雑になると非常に乱雑になります。