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


7

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

0

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

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

  0

Если честно, я довольно новичок в сгибании, и я не уверен. Я думал, что использую комбинацию регулярных выражений и соответствия строк. Вот пример "(" \t \t {вернуться L_PAREN;} {INT} {yylval.Int = atoi (yytext), возвращение INT} То, что я хочу, чтобы иметь возможность вернуть два элемента сразу , 22 фев. 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; 
} 

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