FLEX: есть ли способ вернуть сразу несколько токенов

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


person Eburetto    schedule 22.02.2009    source источник


Ответы (3)


Я делал это так, чтобы создать очередь токенов, подлежащих возврату, и в начале yylex() проверить наличие токенов и вернуть их.

person Zifre    schedule 30.03.2009

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

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

person dirkgently    schedule 22.02.2009
comment
Честно говоря, я новичок во флексах и не уверен. Я думал, что использую комбинацию регулярных выражений и сопоставления строк. Вот пример ( { return L_PAREN; } {INT} { yylval.Int = atoi(yytext); return INT; } Я хочу иметь возможность возвращать сразу два токена. - person Eburetto; 22.02.2009

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

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

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

person Tim Landscheidt    schedule 04.03.2012
comment
Очаровательный. Я уверен, что в какой-то момент этот ответ имел 10 или более баллов в течение многих лет, но в последние, хммм, шесть месяцев он стал отрицательным без каких-либо указаний, почему. - person Tim Landscheidt; 11.03.2018