Во flex я хочу вернуть несколько токенов для одного совпадения с регулярным выражением. Есть ли способ сделать это?
FLEX: есть ли способ вернуть сразу несколько токенов
Ответы (3)
Я делал это так, чтобы создать очередь токенов, подлежащих возврату, и в начале yylex()
проверить наличие токенов и вернуть их.
person
Zifre
schedule
30.03.2009
Вы имеете в виду все совпадения? Используете ли вы функции регулярных выражений или строковые функции? Используйте глобальный флаг.
Что касается гибкости, я не думаю, что вы можете это сделать. Вы проверяете совпадение с одним шаблоном за раз, так что это, вероятно, выходит за рамки. Зачем тебе это? В качестве оптимизации? Проблемы с определением масштаба?
person
dirkgently
schedule
22.02.2009
Честно говоря, я новичок во флексах и не уверен. Я думал, что использую комбинацию регулярных выражений и сопоставления строк. Вот пример ( { 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
Очаровательный. Я уверен, что в какой-то момент этот ответ имел 10 или более баллов в течение многих лет, но в последние, хммм, шесть месяцев он стал отрицательным без каких-либо указаний, почему.
- person Tim Landscheidt; 11.03.2018