Какой генератор парсера будет полезен для манипулирования производством? - PullRequest
2 голосов
/ 29 сентября 2011

Аналогично Генерируя n операторов из контекстно-свободных грамматик , я хочу случайным образом генерировать предложения из грамматики.

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

Если бы у меня была грамматика, похожая на:

start_symbol ::= foo
foo ::= bar | baz

Что такое хороший генератор парсера для:

  • давая мне символ начала производства
  • позвольте мне выбрать одно производство из RHS начального символа (foo в этом случае)
  • дайте мне варианты производства для foo

Ясно, что каждый синтаксический анализатор имеет внутренние представления для продукций и методы связывания продукции с его RHS, но каким парсером будет легко манипулировать этими внутренностями?

Примечание: запись в блоге , на которую ссылается другой упомянутый мной вопрос SO, имеет своего рода собственный синтаксический анализатор CFG. Я хочу использовать фактическую грамматику для реального парсера, а не генерировать свой собственный грамматический парсер.

1 Ответ

3 голосов
/ 29 сентября 2011

Должно быть довольно легко написать грамматику, которая соответствует грамматике, которую принимает генератор синтаксического анализатора. (С генератором синтаксического анализатора с открытым исходным кодом вы должны быть в состоянии извлечь такую ​​грамматику из исходного кода генератора синтаксического анализатора; тогда все они будут иметь собственные грамматики). После этого вы можете проанализировать любую грамматику, которую принимает генератор синтаксического анализатора.

Если вы хотите манипулировать разобранной грамматикой, вам понадобится абстрактное синтаксическое дерево того же самого. Вы можете заставить большинство генераторов синтаксических анализаторов создавать дерево, используя встроенные механизмы или специальный код, который вы добавляете.

...