У меня есть некоторые константы, определенные в заголовочном файле, которые содержат максимальную длину определенных строк, которые должны быть проанализированы анализатором файлов, написанным на flex / bison.Я хочу переместить код для проверки длины строк из кода c в мои регулярные выражения, чтобы сделать вещи немного более краткими.
Сейчас у меня есть правила, которые выглядят следующим образом:
[[:alnum:]]+ { yylval.sval = (char*) strdup(yytext); return STRING; }
Где проверка длины происходит в правилах бизонов.
Я хочу изменить это так, чтобы он проверялдля совпадения не более MAX_STR_LEN, которое определено в заголовке constants.h.Если значение MAX_STR_LEN равно 32, я бы хотел получить такой же эффект, как:
[[:alnum:]]{1,32}
Можно ли как-то это сделать, не выполняя мой flex-файл через дополнительный этап предварительной обработки?
EDIT:
Следующее правило не будет выполнено, поскольку MAX_STR_LEN не является литеральным числом, оно рассматривается как строка, поэтому flex считает, что для одного правила определено 2 действия.
[[:alnum:]]{1,MAX_STR_LEN} { do_something(); }
Кроме того, если кто-то пытается определить макрос в части объявлений гибкого файла, он также не работает как таковой.
max_len 32 /* Also fails if 32 is replaces with MAX_STR_LEN */
%%
[[:alnum:]]{1,max_len} { do_something(); }