Как тестировать парсер?

128
26 апреля 2019, 09:40

Нужно написать парсер на основе Lex/Yacc (точнее, Flex/Bison) для небольшого скриптового языка. Сама задача достаточно понятная, но совершенно непонятно, как для этого парсера сделать юнит-тест. На выходе Бизона там возвращается достаточно сложная структура данных, представляющая переменные, типы, и функции на промежуточном языке. Создавать набор эталонных структур для разных входных данных и потом сравнивать - это выйдет как бы не сложнее самого парсера. Может в синтаксических правилах вести какой-то лог разбора для тестирования? Сделать лог просто, непонятно только как потом на его основе что-то протестировать.

Ясно, что задача великовата для юнит-теста, но разбить на части ничего нельзя, а совсем без тестирования тоже не хочется. Может с этим кто-то сталкивался? Как эту задачу решают для взрослых компиляторов?

Answer 1

"cоздавать набор эталонных структур для разных входных данных и потом сравнивать" - вполне нормальный подход. Фишка в том, что расписывать выходные данные вручную не обязательно. Достаточно сериализовать (проверенный) выхлоп парсера и потом сравнивать с ним. Также некоторые тесты можно выполнять на варьирующихся входных данных, проверяя только некоторые свойства выхлопа а не его точное соответствие шаблону.

READ ALSO
Как избавиться от утечки памяти

Как избавиться от утечки памяти

Есть код, при рантайме выдает ошибку сегментации:

128
C++ 14 constexpr std::array

C++ 14 constexpr std::array

Изучаю constexprНе могу понять, почему компилятор не рассматривает одно из выражений как константное, потому что оно подходит под требования

130
CryptEncodeObjectEx segfault при обращении

CryptEncodeObjectEx segfault при обращении

CryptEncodeObjectEx разваливается при обращении, параметры не влияют, как выяснилосьСобираю gcc-tdm, через Code::Blocks, что опробовано:

130
Определение pure virtual function

Определение pure virtual function

Недавно обнаружил, что можно дать определение для pure virtual function вне класса:

133