Parsers.commit
преобразует сбой в ошибку.Таким образом, первым шагом будет
commit(p ^?(condition, message))
Однако это даст ошибку, если p выдаст ошибку, что, я полагаю, не то, что вам нужно, вы хотите получить ошибку только тогда, когда p успешен, а затем проверка не пройдена.Поэтому вам лучше сделать
p into {result => commit(success(result) ^? (condition,message))}
Это может показаться довольно надуманным, вы можете также реализовать напрямую, просто скопируйте реализацию ^?заменить сбой с ошибкой.
Наконец, вам, вероятно, следует сделать то, что предложил Дилан, и добавить оператор.Если вы хотите сделать это вне вашей грамматики (Parsers
), я думаю, вам понадобится миксин:
trait PimpedParsers { self: Parsers =>
implicit def ...
}
В противном случае вы не можете легко обратиться к (одиночному) Parser
.