Один из способов сопоставления трех разных букв - это прописать все допустимые комбинации:
ABC|ABD|ABE|ACB|ACD|... printf("Found one: %s\n", yytext);
Мы можем несколько сократить это, используя класс символов для третьей буквы:
AB[C-E]|AC[BCD]|AD[BCE]|... printf("Found one: %s\n", yytext);
Учитывая, что диапазон только AE, это несколько выполнимо, но, конечно, не очень.
Альтернативой может быть сопоставление большего, чем разрешено, и затем отклонение недопустимых комбинаций в связанном действии. Это может выглядеть так:
[A-E]{3} {
if (yytext[0] == yytext[1] || yytext[0] == yytext[2] || yytext[1] == yytext[2]) {
REJECT;
} else {
printf("Found one: %s\n", yytext);
}
}
REJECT
сделает так, как если бы шаблон никогда не совпадал, поэтому он будет вести себя так же, как и предыдущие решения.
Обратите внимание, что ничего не будет не допускайте, чтобы какое-либо из этих решений совпадало с шаблоном более одного раза - так все-таки работают лексеры. Таким образом, ввод, такой как ABCBCD
, будет производить следующий вывод:
Found one: abc
Found one: bcd
Поскольку вы сказали в комментарии, что это не то, что вам нужно, вам понадобится дополнительное правило, которое будет соответствовать abcbcd
как одному токен, а затем выдайте сообщение об ошибке. Если вы действительно хотите разрешить ввод только из трех символов, вы можете использовать .*
в качестве шаблона, чтобы соответствовать всему, что не является 3 неповторяющимися символами АЕ. Это похоже на очень странное использование flex.