Тестирование парсеров Parsec путем генерации входных данных с помощью QuickCheck

Я хотел бы написать тесты для набора парсеров Parsec. Вот простой пример парсера, который я хочу протестировать с помощью QuickCheck:

identifier = do
  c <- letter
  cs <- many (alphaNum <|> oneOf identSymbols)
  skipSpaces
  return $ Ident $ c:cs

Итак, в идеале я бы хотел, чтобы QuickCheck генерировал действительные идентификаторы и гарантировал, что я получаю правильные результаты, а также генерировал недопустимые идентификаторы и удостоверялся, что они возвращают ParseError. Есть ли какие-нибудь утилиты, которые упростили бы подобные вещи? Есть ли способ, которым я могу, так сказать, «запустить свой синтаксический анализатор в обратном порядке», чтобы генерировать такие входные данные?

В общем, как должен выглядеть хороший набор тестов QuickCheck для этого парсера? В какой-то степени кажется, что мне придется дублировать логику парсера в QuickCheck, чтобы провести тщательный тест. Это действительно хорошая идея, или, возможно, это ситуация, когда более традиционный инструмент, такой как HUnit, больше подходит, чем QuickCheck?


person Derek Thurn    schedule 12.06.2012    source источник


Ответы (1)


В общем, обратная сторона синтаксического анализатора — это красивый принтер, а обратная сторона случайного ввода в синтаксический анализатор — случайная красивая печать AST.

Итак, следуйте обычному подходу и определите Произвольный экземпляр для вашего AST, который управляет случайными правильными фрагментами синтаксиса. Смешайте несколько ошибочных символов в качестве оболочки для проверки обработки ошибок.

Смотрите также:

person Don Stewart    schedule 12.06.2012
comment
Особое свойство, которое мне нравится использовать, заключается в том, что parse = parse. симпатичный . разобрать. Это служит достойным способом моделирования разделения информации синтаксическим анализатором, есть хорошее дополнение для управления им с теоретической точки зрения, и оно фиксирует тот факт, что довольно . parse является идемпотентом, если не функцией тождества. (Обычно при синтаксическом анализе часть информации отбрасывается) - person Edward KMETT; 13.06.2012
comment
последние две ссылки мертвы - person Alex Hirzel; 30.12.2013