FLEX: есть ли способ вернуть несколько токенов одновременно? - PullRequest
7 голосов
/ 22 февраля 2009

В flex я хочу вернуть несколько токенов для одного совпадения регулярного выражения. Есть ли способ сделать это?

Ответы [ 3 ]

3 голосов
/ 30 марта 2009

То, как я это делал, создавало очередь возвращаемых токенов, а в начале yylex() проверяйте токены и возвращайте их.

0 голосов
/ 04 марта 2012

Обычно это обрабатывается синтаксическим анализатором в верхней части сканера, который дает вам намного более чистый код. Вы можете эмулировать это до некоторой степени состояниями:

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

но это станет очень грязным, как только ваша грамматика станет более сложной.

0 голосов
/ 22 февраля 2009

Вы имеете в виду все совпадения? Вы используете функции регулярных выражений или строковые функции? Используйте глобальный флаг.

Что касается гибкости, я не думаю, что вы можете сделать это. Вы проверяете соответствие одному шаблону за раз, так что это, вероятно, выходит за рамки. Зачем тебе это? Как оптимизация? Вопросы объема?

...