Предотвращение дублирования символов в 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 алфавита, кодирующему, какой из символов уже видели.