Предотвращение дублирования символов в ABNF

Я хочу создать правило ABNF, которое содержит символы "imsxeADSUXju". Каждый символ не является обязательным. Порядок не имеет значения, но персонаж может появляться не более одного раза.

Например: оно должно совпадать

"i" "im" "mi" "" "uUsejXx" "imsxeADSUXju"

Но не совпадают

"iim" "UmUu" "imsss"

Я создал следующее правило, но оно не препятствует появлению персонажа более одного раза:

options = 0*12( "i" / "m" / "s" / "x" / "e" / "A" / "D" / "S" / "U" / "X" / "j" / "u" )

В этом правиле порядок имеет значение:

options = [ "i" ] [ "m" ] [ "s" ] [ "x" ] [ "e" ] [ "A" ] [ "D" ] [ "S" ] [ "U" ] [ "X" ] [ "j" ] [ "u" ]

Как я могу написать правило, которое игнорирует порядок, но также предотвращает удвоения?

1 ответ

Решение

Вы должны выписать все альтернативы, к сожалению. Игнорируя, что ABNF нечувствителен к регистру, это должно быть

  S        = "i" after-i /
             "m" after-m /
             ...
  after-i  = "m" after-im /
             "s" after-is /
             ...
  after-im = "s" after-ims /
             ...

Язык здесь обычный, и если учесть, как должен выглядеть минимальный DFA для языка, он должен иметь 2^12 состояний, и каждое состояние будет соответствовать элементу powerset алфавита, кодирующему, какой из символов уже видели.

Другие вопросы по тегам