Преобразование синтаксического анализатора attoparsec в синтаксический анализатор, который дает сбой, если количество потребляемых им байтов не имеет определенной длины.

Скажем, у меня есть анализатор attoparsec, x.

Я хочу создать функцию f :: Int -> Parser a -> Parser a, чтобы если y = f n x, то:

  • y терпит неудачу, если x терпит неудачу
  • y завершается ошибкой, если x завершается успешно, а x не потребляет n байт.
  • y в противном случае удается

Как мне это сделать?


person Cameron Martin    schedule 04.08.2016    source источник


Ответы (1)


Вы можете использовать match для реализации:

f n x = do
    (bs, res) <- match x
    guard (BS.length bs >= n)
    return res

Вы должны убедиться, что это взаимодействует с (<|>) приемлемым образом, прежде чем использовать его интенсивно.

person Daniel Wagner    schedule 04.08.2016
comment
В binary эта функция упакована как isolate. Возможно, там это более разумно, так как binary отслеживает количество потребляемых байтов, но мне кажется, что это хорошее дополнение к API attoparsec (с точки зрения токенов, а не байтов, поэтому, например, Text не будет считать байты). - person Thomas M. DuBuisson; 04.08.2016