Правила грамматики точно отражают последовательность форм, которую вы хотите, независимо от выбранного вами механизма синтаксического анализа (например, PEG, LALR, LL (k), ...).
Единственный способ выразить, что вы хотите, чтобы все возможные последовательности чего-то просто использовали правила BNF, - это предложенное вами большое уродливое правило.
Стандартное решение состоит в том, чтобы просто определить:
rule <- (A | B | C)*
(или любой другой синтаксис, который ваш генератор синтаксического анализа принимает для списков) и семантически считают, что предоставлены только 3 формы, и они уникальны.
Часто люди, строящие генераторы синтаксического анализатора, добавляют специальные нотации "расширенного BNF", чтобы позволить им описывать особые обстоятельства; Вы привели пример использования {3} в качестве специального синтаксиса, подразумевающего, что вы хотели только «3 из» в предположении, что генератор синтаксического анализатора принимает эту нотацию и выполняет соответствующее применение. Можно представить расширение обозначения {уникальное} , которое позволит вам описать вашу ситуацию. Я никогда не видел генератора парсеров, который бы реализовал эту идею.