с макушки головы:
Я бы работал рекурсивно (в основном противоположно рекурсивному приличному парсеру), используя некоторую эвристику о том, что делать с диапазонами ((...)
: возможно, выбор случайным образом), опционально (?
: см. [], ниже), повторы ('' распределение Пуассона?). Литералы ("..."
) просто записываются в вывод, а подтокены (`<...> ') генерируют рекурсию.
Это не должно быть слишком сложно, если вы не хотите гарантировать какое-то полное покрытие. Даже тогда, просто генерация связки данных была бы помощью ...
[*] Вам необходимо включать дополнительные опции менее чем в 50% случаев, чтобы предотвратить бесконечный регресс при обработке таких правил, как
nonterm: otherstuff <nonterm>?
Хороший улов по плинтусу .
Аналогично с повторениями, бросайте распределения, которые сильно сходятся.
Сначала вам нужно будет проанализировать входную грамматику, если она представлена в форме BNF, как здесь. Простейшей вещью было бы использовать отображение (name, string)
, а затем начать с токена самого высокого уровня (который, как вы можете предположить, означает первый ...).
Это дает вам:
("программа", " NEWLINE? ")
(«импорт», («импорт» NEWLINE) *)
...
Когда вы начинаете с "program", нажимаете "", поэтому вы возвращаетесь ... при возвращении, история "NEWLINE?", Поэтому бросьте кубик и напишите или нет, нажмите "", чтобы повториться ... по возвращении все готово.
Я нахожу себя подозревающим, что это было сделано раньше. Если вам просто нужен вывод, я бы поискал в сети ... Возможно, http://portal.acm.org/citation.cfm?doid=966137.966142,, хотя огромное количество генераторов парсеров там загромождают пространство поиска ... Попробуйте эту статью , тоже.
Кстати: ваш местный университет, вероятно, имеет онлайн-подписку на эти журналы, поэтому вы можете получить их бесплатно, подключившись к библиотеке.