Генерация n операторов из контекстно-свободных грамматик - PullRequest
6 голосов
/ 15 мая 2010

Чтобы не изобретать велосипед, я хотел бы знать, что уже сделано для генерации случайных операторов из языка без контекста (например, созданного yacc и т. Д.). Эти грамматики в основном предназначены для разбора, но, может быть, кто-то сделал какое-то поколение для тестирования парсеров? Спасибо

Ответы [ 3 ]

4 голосов
/ 15 мая 2010

Проверьте это сообщение в блоге . По сути, он рандомизирует RHS, выбранную при каждом применении правила.

3 голосов
/ 15 мая 2010

Существует древняя, но все еще интересная статья здесь , в которой показано, почему вам нужно несколько больше ограничений для эффективного генерирования случайных предложений, чем для анализа - в ней также предлагается простой способ предоставления этих дополнительных ограничений. и приводит полный пример программы (... в Фортране IV ... но, эй, старше 40 лет ...! -).

К сожалению, мне не известны какие-либо более поздние работы по этому вопросу (или реализации на более современных языках), но перекодировка пыльной колоды Фортрана на любой язык, который вам больше нравится, не должна быть такой сложной, как придумывать эти концепции в свой собственный ;-) - это как раз тот вид уже древних вещей, которые я просматривал в реальных бумажных библиотеках еще во время учебы в колледже, и я поражен, что онлайн-средства поиска ACM позволили мне найти ссылку, которую я смутно вспоминается, так быстро (слава, ACM! -). Я никогда не проводил никаких оригинальных исследований на эту тему.

1 голос
/ 15 мая 2010

Генерация последовательности случайных токенов, как эта, довольно проста; начиная с символа цели, выберите произвольное расширение незаполненных нетерминалов. Вы, вероятно, хотите какой-то поиск по веткам и границам по любой ветви сгенерированного дерева разбора, чтобы вы могли контролировать глубину / размер.

Но я не вижу большого смысла в тестировании парсеров таким образом, по крайней мере, если ваш генератор парсера напрямую принимает описание языка без контекста. Это происходит, когда вы используете полностью контекстный генератор / инструмент синтаксического анализа, такой как GLR (который мы используем в нашей системе преобразования программ, DMS) или анализатор Earley.

У вас есть другая проблема: если вы хотите протестировать парсер, вам нужно кормить его тем, что он хочет, и, конечно же, это не токены. Теперь вам нужно сгенерировать действительные лексемы для листьев терминала. Это тоже не сложно, но если вы хотите быть осторожным с этим подходом, вы бы написали свою грамматику в стиле без сканера.

Но последняя проблема в том, что для большинства языков трудно найти грамматику без контекста. Так что теперь вы должны отладить свою золотую грамматику тоже; как ты это сделаешь? Как только вы доберетесь до этой стадии, вы, скорее всего, просто сдадитесь, отладите анализатор и продолжите свою жизнь.

Генерация случайных поддеревьев полезна при восстановлении после ошибок, если вы можете соединить случайное дерево, чтобы исправить исходный поток. Мы делаем упрощенную форму для парсера DMS, что означает, что у нас есть только один механизм обработки ошибок.

...