Документация и общие рекомендации заключаются в том, что абстрактное синтаксическое дерево должно пропускать токены, которые не имеют смысла. («Записать значимые входные токены (и только значимые токены» - ссылка на Definitive ANTLR) IE: В C ++ AST вы опускаете фигурные скобки в начале и конце класса, так как они не имеют значения и являются просто механизм разграничения начала и конца класса для анализа. Я понимаю, что для быстрого и эффективного обхода дерева отбраковка бесполезных узлов токенов, как это полезно, но для того, чтобы соответствующим образом раскрасить код, мне нужна эта информация, даже если это не влияет на смысл кода. A) Есть ли какая-то причина, по которой мне не следует использовать AST для нескольких целей и не пропускать указанные токены?
Мне кажется, что вывод интерпретатора ANTLRWorks - это то, что я ищу. В интерпретаторе ANTLRWorks он выводит древовидную диаграмму, где для каждого сопоставленного правила создается узел, а также дочерний узел для каждого токена и / или подчиненного правила. Дерево разбора, я полагаю, оно называется.
Если бы вручную обходить дерево, разве не было бы полезно иметь узлы, отмечающие правило? Имея узел, отмечающий правило с его подправилами и токенами в качестве дочерних элементов, обходчику не нужно смотреть вперед на несколько узлов, чтобы узнать контекст того, на каком узле он находится. Древовидные грамматики кажутся мне излишними. Учитывая дерево узлов AST, древовидная грамматика заново анализирует узлы, чтобы получить какой-то другой вывод. B) Учитывая, что грамматика синтаксического анализатора была ответственна за генерацию правильно сформированных AST, и учитывая включение узлов AST правила, не должен ли ручной обходчик избегать избыточного соответствия шаблона узла AST грамматике дерева?
Боюсь, я дико неправильно понимаю назначение механизма грамматики дерева. Древовидная грамматика более или менее определяет набор методов, которые будут проходить по дереву, искать шаблон узлов, который соответствует правилу древовидной грамматики, и выполнять на этом основании некоторые действия. Я не могу зависеть от формирования вывода AST, основываясь на том, что аккуратно и аккуратно для грамматики дерева (исключая бессмысленные токены для скорости сопоставления с образцом), но использую AST для цветового кодирования даже бессмысленных токенов. Я также пишу IDE; Я также не могу написать каждый возможный шаблон узла AST, которому мог бы соответствовать автор плагина, и при этом я не хочу требовать, чтобы они использовали ANTLR для написания древовидной грамматики. В случае авторов плагинов, которые обходят дерево по своим собственным критериям, узлы правил были бы весьма полезны, чтобы избежать необходимости сопоставления с образцом.
Мысли? Я знаю, что этот «вопрос» может раздвинуть границы того, чтобы быть ТАКИМ вопросом, но я не уверен, как еще сформулировать мои запросы или куда еще спросить.