7

flexでは、正規表現の1つの一致に対して複数のトークンを返したいと思います。これを行う方法はありますか?

4

3 に答える 3

0

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

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

于 2009-02-22T09:26:29.507 に答える
-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;
}

しかし、文法がより複雑になるとすぐに、これは非常に厄介になります。

于 2012-03-04T17:25:17.573 に答える