Эта проблема очень странная.Когда вы вызываете |
и обе стороны являются сбоями, выбирается сторона, где произошел сбой последний , связывает предпочтение левой стороне.
Когда вы пытаетесь выполнить синтаксический анализ непосредственно с giverRole
, это дает ожидаемый результат.Однако если вы добавите успешное совпадение до сбоя, оно даст результат, который вы видите.
Причина довольно тонкая - я узнал об этом только путем разбрасывания операторов log
на все парсеры.Чтобы понять это, вы должны понять, как RegexParser
пропустить пробелы .В частности, пробелы пропускаются на accept
.Поскольку failure
не вызывает accept
, он не пропускает пробелы.
В то время как сбой kwIs
происходит на b
, так как пропущенный пробел, сбой failure
происходит на пробел после If
.Здесь:
If bla blablaa
^ kwIs fails here
^ failure fails here
Следовательно, сообщение об ошибке на kwIs
имеет приоритет по правилу, которое я упомянул.
Вы можете обойти эту проблему, заставив парсер пропускать пробелы, не сопоставляя ничего,Важно, чтобы этот шаблон всегда совпадал, иначе вы получите еще более запутанное сообщение об ошибке.Вот предложение, которое, я думаю, работает:
"\\b|$".r ~ failure("is expected")
Другое решение заключается в использовании acceptIf
или acceptMatch
вместо использования неявного регулярного выражения accept, в этом случае вы можете предоставить специальное сообщение об ошибке.