2014-10-15 11 views
0

Я хотел бы написать парсерный парсер, который будет анализировать последовательность чисел, возвращая отсортированный список, но не получив встречного дубликата (ошибка должна указывать на позицию дубликата) , Для отсортированных частей я могу просто использовать:Как вызвать ошибку во время анализатора manyAccum

manySorted = manyAccum insert 

Но как я могу вызвать ошибку парсек, если номер уже есть в списке. Это не похоже на то, что manyAccum позволяет это, и я не мог понять, как сделать свой собственный клон manyAccum, который (реализация использует unParser, который, похоже, не отображается вне библиотеки Parsec).

+1

Вы уверены, что это работа для парсера? Обычно этот тип поведения идет в другой части процесса. –

+0

Попробуйте сначала разобрать все цифры, а затем проверить все необходимые условия. Таким образом, вы можете легко создать исключение или вернуть «Left», например. – Mark

+1

Вот что я делаю сейчас, но было бы неплохо получить местоположение дубликата в сообщении об ошибке. Я предполагаю, что парсер чисел может получить местоположение из состояния парсера и вернуть его вместе с результатом, чтобы его можно было использовать позже для ошибки. Это правильный шаблон для использования в таком случае? – kruipen

ответ

1

Вы могли бы попытаться получить позицию текущего парсера по

sourcePos :: Monad m => ParsecT s u m SourcePos 
sourcePos = statePos `liftM` getParserState 

Затем аккумулировать позиции вместе с разбираемых значений, так что вы может сообщить о позиции оригинала.

0

Если вы уверены, что хотите использовать парсер , вы можете использовать метод fail с сообщением об ошибке, чтобы выйти из анализатора. (В комплекте с места ошибки и пробовать другие <|> возможности, и так далее.)

 Смежные вопросы

  • Нет связанных вопросов^_^