Я недавно написал небольшой язык программирования и закончил писать его парсер. Я хочу написать автоматический тест для парсера (результат - абстрактное синтаксическое дерево), но я не уверен, какой способ лучше.
Первое, что я попробовал, - это просто сериализовать AST в текст S-выражения и сравните его с ожидаемым выводом текста, который я написал вручную, но у него есть некоторые проблемы:
Есть тривиальные бессмысленные различия между сериализованным текстом и ожидаемым выводом, например, пробелами. Например, нет разницы между:
(сериализованный) и:
(атрибут (символ str)
(длина символа))
(написано мной от руки) в их значениях, но сравнение строк, конечно, их различает. Хорошо, я мог бы решить эту проблему с помощью нормализации.
Когда тест терпит неудачу, он не показывает в краткой форме разницу между реальным деревом и ожидаемым деревом. Я хочу показать только узел различия, а не все дерево.
Во-вторых, я попытался написать парсер S-выражения и сравнить AST, который парсер (для тестирования) генерирует, с AST, который парсер S-выражения (который я только что реализовал ) создается из рукописного ожидаемого вывода. Однако я понял, что S-выражение тоже должно быть проверено, и это может быть действительно ерундой.
Интересно, какой типичный и простой способ проверить парсер.
PS. Я использую Java и не хочу никаких зависимостей от сторонних библиотек.