Систематический способ создания грамматики дерева ANTLR?
У меня есть немного большой файл грамматики синтаксического анализатора ANTLR и я хочу создать для него древовидную грамматику. Но, насколько я знаю, эта работа по созданию древовидной грамматики не может быть выполнена автоматически, т.е. я должен сгенерировать ее вручную, скопировав грамматику синтаксического анализатора, удалив некоторый ненужный код и т. Д. Я хочу знать, существует ли систематический способ генерировать файл грамматики дерева из файла грамматики синтаксического анализатора.
PS Я прочитал статью, которая настаивает на том, что " ручная прогулка по дереву лучше, чем грамматика деревьев". Это достоверная информация? Если так, то было бы лучше для меня сделать обходчик дерева вручную, чем писать файл грамматики дерева ANTLR? И затем, как мне сделать ручной обходчик дерева с моим файлом грамматики синтаксического анализатора ANTLR (он создает AST, используя правила перезаписи)?
Заранее спасибо.
1 ответ
небо написал:
Я хочу знать, существует ли систематический способ создания файла грамматики дерева из файла грамматики синтаксического анализатора
Вы уже описали систематический способ сделать это: скопируйте правила синтаксического анализатора / производства в древовидную грамматику и оставьте в ней только правила перезаписи. Это, вероятно, будет обрабатывать большую часть ваших правил, но с другими правилами синтаксического анализатора (с использованием встроенных правил перезаписи AST) это может выглядеть немного иначе. Из-за этого не существует автоматического способа генерировать древовидную грамматику.
небо написал:
PS Я прочитал статью, которая настаивает на том, что "ручная прогулка по дереву лучше, чем грамматика деревьев". Это достоверная информация?
Да, это. Обратите внимание, что Теренс Парр (создатель ANTLR) опубликовал статью в самой вики ANTLR, так что автор этой статьи (Энди Трипп) поднимает действительные баллы.
небо написал:
Если так, то было бы лучше для меня сделать обходчик дерева вручную, чем писать файл грамматики дерева ANTLR?
Как отметил в своем заключении Энди: "Решение о том, следует ли использовать" древовидную грамматику "в переводе или просто" делать это вручную ", является делом вкуса"., Итак, если вы думаете, что написание древовидной грамматики - это слишком хлопотно, идите ручным путем. Это зависит от вас: нет лучшего пути здесь.
небо написал:
И затем, как мне сделать ручной обходчик дерева с моим файлом грамматики синтаксического анализатора ANTLR (он создает AST, используя правила перезаписи)?
Ваш парсер создаст AST, который по умолчанию имеет тип CommonTree
(API-документ). Вы можете использовать это дерево, чтобы получить дочерние элементы, родительский элемент, тип токена и т. Д. - все, что вам нужно для обхода дерева вручную.
РЕДАКТИРОВАТЬ
Обратите внимание, что в следующей версии ANTLR (версия 4) (скорее всего) будет возможно автоматически сгенерировать обходчик дерева с учетом грамматики комбинированного или синтаксического анализатора.
Увидеть: