Это классическая проблема с парсером.
По сути, ваш BNF:
Trade = whatever whatever*
whatever = "DATE" | "TIME" | anything
anything = a-z a-z*
Но это неоднозначно.Строка «DATE» может быть принята по какому-либо правилу как «DATE» и как угодно.
Так что если у вас есть
<TRADE>
<TIME>12:12</TIME>
<DATE>25-10-2011</DATE>
<DATE>25-12-2011</DATE>
</TRADE>
, неясно, следует ли это принимать или нет.
Он может быть интерпретирован как один из
"TIME", "DATE", anything
anything, anything, "DATE"
anything, anything, anything
"TIME", "DATE", anything
"TIME", "DATE", "DATE"
etc.
Все сводится к следующему: если у вас есть подстановочный знак в сочетании со случайной последовательностью, вы не можете осмысленно решить, какой токен соответствует какому правилу.
Особенно не имеет смысла иметь необязательные элементы вместе с вилкой.
У вас есть два варианта:
- использовать xs: sequence вместо xs: all
- не используйте подстановочный знак
Насколько я понимаю, оба варианта находятся в конфликте с вашими желаниями.
Возможно, вы можете создать подстановочный знак, который соответствует всему кроме ДАТА, ВРЕМЯ и т. д.