Есть ли какие-либо средства для получения ANTLR4 для автоматического удаления избыточных узлов в генерируемых деревьях разбора?Упрощение дерева синтаксического анализа ANTLR4
Более конкретно, я экспериментировал с грамматикой для GLSL, и вы закончили с длинными линейными последовательностями «выражений» в дереве разбора из-за пересылки правил, необходимых для автоматической обработки приоритета оператора.
Большинство генерируемых узлов дерева просто «переходят на следующий уровень приоритета», поэтому не предоставляют никакой полезной синтаксической информации - вам действительно нужен только последний узел выражения в каждой последовательности (то есть точка, в которой пересылка правила прекращена) или точка, где он становится фактическим узлом дерева с более чем одним дочерним элементом (то есть фактическое выражение встречается в источнике) ...
Я надеялся, что будет простой способ убить фиктивные узлы промежуточного выражения - этот тип структуры должен быть общим в любой грамматике с приоритетом оператора.
Основная структура грамматики является довольно прямым клоном берется из спецификации Khronos для языка:
https://www.khronos.org/registry/gles/specs/3.1/es_spec_3.1.pdf
Я пишу переводчик от источника к источнику, то есть с целью удалить неиспользуемые переменные, неиспользуемые функции и т.д. Где это возможно, я хочу, чтобы сохранить исходное форматирование, поэтому не хотелось бы идти слишком абстрактно, но да, я согласен с этим чувством. – solidpixel
P.S. Спасибо за обновление по единственному рекурсивному правилу - я думаю, что это решит проблему. (По-прежнему пытаюсь обернуть голову вокруг изменений в ANTLR4 - совсем другое, чем 3 ...). – solidpixel
@ Isogen74 да, это * очень * отличается от v3, и это к лучшему IMHO. Во всяком случае, если вы строите переводчик источника на источник, вы совершенно правы в * не * слишком абстрактном. Вы * будете нуждаться в дереве разбора для таких вещей. –