Лучший способ (автоматически) тестировать парсер?

Я недавно написал небольшой язык программирования и закончил писать его парсер. Я хочу написать автоматический тест для парсера (результат - абстрактное синтаксическое дерево), но я не уверен, какой способ лучше.

Первое, что я попробовал, - это просто сериализовать AST в текст S-выражения и сравните его с ожидаемым выводом текста, который я написал вручную, но у него есть некоторые проблемы:

  • Есть тривиальные бессмысленные различия между сериализованным текстом и ожидаемым выводом, например, пробелами. Например, нет разницы между:

    (сериализованный) и:

     (атрибут (символ str)
     (длина символа))
    

    (написано мной от руки) в их значениях, но сравнение строк, конечно, их различает. Хорошо, я мог бы решить эту проблему с помощью нормализации.

  • Когда тест терпит неудачу, он не показывает в краткой форме разницу между реальным деревом и ожидаемым деревом. Я хочу показать только узел различия, а не все дерево.

Во-вторых, я попытался написать парсер S-выражения и сравнить AST, который парсер (для тестирования) генерирует, с AST, который парсер S-выражения (который я только что реализовал ) создается из рукописного ожидаемого вывода. Однако я понял, что S-выражение тоже должно быть проверено, и это может быть действительно ерундой.

Интересно, какой типичный и простой способ проверить парсер.

PS. Я использую Java и не хочу никаких зависимостей от сторонних библиотек.

7
задан minhee 22 January 2011 в 16:20
поделиться