Систематический способ создания грамматики дерева ANTLR? - PullRequest
6 голосов
/ 22 августа 2011

У меня есть немного большой файл грамматики синтаксического анализатора ANTLR и я хочу сделать для него древовидную грамматику.Но, насколько я знаю, эту работу по созданию древовидной грамматики нельзя выполнить автоматически, т. Е. Я должен сгенерировать ее вручную, скопировав грамматику синтаксического анализатора, удалив ненужный код и т. Д. Я хочу знать, существует ли систематический способсгенерировать файл грамматики дерева из файла грамматики синтаксического анализатора.

PS Я прочитал статью, в которой говорится, что « Ручная прогулка по дереву лучше, чем древовидная грамматика ».Это достоверная информация?Если так, то было бы лучше для меня сделать ручной обходчик дерева, чем писать файл грамматики дерева ANTLR?И затем, как мне сделать ручной обходчик дерева с моим файлом грамматики синтаксического анализатора ANTLR (он делает AST, используя правила перезаписи)?

Заранее спасибо.

1 Ответ

5 голосов
/ 22 августа 2011

небо писал:

Я хочу знать, существует ли систематический способ создания файла грамматики дерева из файла грамматики синтаксического анализатора

Вы уже описали систематический способ сделать это: скопируйте правила синтаксического анализа / производства в древовидной грамматике и оставьте в ней только правила перезаписи. Это, вероятно, будет обрабатывать большую часть ваших правил, но с другими правилами синтаксического анализатора (с использованием встроенных правил перезаписи AST) это может выглядеть немного иначе. Из-за этого не существует автоматического способа генерировать древовидную грамматику.

небо писал:

P.S. Я прочитал статью, в которой настаивает, что «Ручная прогулка по дереву лучше, чем грамматика деревьев» . Это достоверная информация?

Да, это так. Обратите внимание, что Теренс Парр (создатель ANTLR) опубликовал статью в самой вики ANTLR, так что автор этой статьи (Энди Трипп) поднимает действительные баллы.

небо писал:

Если это так, было бы лучше для меня сделать ручной обходчик дерева, чем писать файл грамматики дерева ANTLR?

Как Энди упомянул в своем заключении: «Решение о том, использовать ли« древовидную грамматику »для перевода вместо простого« ручного выполнения », зависит от вкуса». . Итак, если вы думаете, что написание древовидной грамматики - это слишком хлопотно, идите ручным путем. Это зависит от вас: здесь нет лучшего пути.

небо писал:

А потом, как мне сделать ручной обходчик дерева с моим файлом грамматики синтаксического анализатора ANTLR (он создает AST с использованием правил перезаписи)?

Ваш анализатор создаст AST, который по умолчанию имеет тип CommonTree (API-doc) . Вы можете использовать это дерево, чтобы получить дочерние элементы, родительский элемент, тип токена и т. Д. - все, что вам нужно для обхода дерева вручную.

EDIT

Обратите внимание, что в следующей версии ANTLR (версия 4) (скорее всего) будет возможно автоматически сгенерировать обходчик дерева с учетом грамматики комбинированного или синтаксического анализатора.

См:

...