Я не уверен, как именно циклы помогут вам решить эту проблему. (F) lex уже зацикливается, многократно находя токен, пока не вернется какое-либо действие (или не будет достигнут EOF, и не вернется действие EOF по умолчанию).
Чтобы определить ключевые слова, просто запишите ключевые слова в виде шаблонов:
%{
int keywords = 0;
%}
%option noyywrap
%%
/* List of keywords taken from http://port70.net/~nsz/c/c11/n1570.html#6.4.1 */
auto { ++keywords; }
break { ++keywords; }
case { ++keywords; }
char { ++keywords; }
const { ++keywords; }
continue { ++keywords; }
default { ++keywords; }
do { ++keywords; }
/* Etc. */
[[:alpha:]_][[:alnum:]_]* ; /* Ignore other identifiers */
\.?[[:digit:]]([[:alnum:].]|[EePp][+-])* ; /* And pp-numbers */
/* The next one matches too much; it will cause keywords inside comments
* and quoted strings to be accepted. So you still have some work to do. */
[^[:alnum:]]+ ; /* And everything else */
%%
int main(void) {
yylex();
printf("%d keywords found.\n", keywords);
return 0;
}
Если вам необходимо различать ключевые слова, вам нужно сделать что-то более сложное. Но хороший текстовый редактор должен позволять вам преобразовывать список ключевых слов в любое простое повторяющееся действие, например
auto { return TOKEN_auto; }