Flex объединить 3 разные буквы - PullRequest
0 голосов
/ 08 февраля 2020

Я хочу сопоставить 3 разных буквы из диапазона [AE] на гибком языке, не повторяя ни одну из них.

Например, AB C, CDE, EAB,

Но не AAB или DEE.

Я пытался [A | B | C | D | E] {3}, [A? B? C? D? E?] {3}, [A {0,1} - E {0,1}] {3}, но не сработало ... Пожалуйста, помогите!

1 Ответ

0 голосов
/ 08 февраля 2020

Один из способов сопоставления трех разных букв - это прописать все допустимые комбинации:

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.

...