Как я должен построить и пройти вывод AST грамматики ANTLR3? - PullRequest
3 голосов
/ 13 мая 2011

Документация и общие рекомендации заключаются в том, что абстрактное синтаксическое дерево должно пропускать токены, которые не имеют смысла. («Записать значимые входные токены (и только значимые токены» - ссылка на Definitive ANTLR) IE: В C ++ AST вы опускаете фигурные скобки в начале и конце класса, так как они не имеют значения и являются просто механизм разграничения начала и конца класса для анализа. Я понимаю, что для быстрого и эффективного обхода дерева отбраковка бесполезных узлов токенов, как это полезно, но для того, чтобы соответствующим образом раскрасить код, мне нужна эта информация, даже если это не влияет на смысл кода. A) Есть ли какая-то причина, по которой мне не следует использовать AST для нескольких целей и не пропускать указанные токены?

Мне кажется, что вывод интерпретатора ANTLRWorks - это то, что я ищу. В интерпретаторе ANTLRWorks он выводит древовидную диаграмму, где для каждого сопоставленного правила создается узел, а также дочерний узел для каждого токена и / или подчиненного правила. Дерево разбора, я полагаю, оно называется.

Если бы вручную обходить дерево, разве не было бы полезно иметь узлы, отмечающие правило? Имея узел, отмечающий правило с его подправилами и токенами в качестве дочерних элементов, обходчику не нужно смотреть вперед на несколько узлов, чтобы узнать контекст того, на каком узле он находится. Древовидные грамматики кажутся мне излишними. Учитывая дерево узлов AST, древовидная грамматика заново анализирует узлы, чтобы получить какой-то другой вывод. B) Учитывая, что грамматика синтаксического анализатора была ответственна за генерацию правильно сформированных AST, и учитывая включение узлов AST правила, не должен ли ручной обходчик избегать избыточного соответствия шаблона узла AST грамматике дерева?

Боюсь, я дико неправильно понимаю назначение механизма грамматики дерева. Древовидная грамматика более или менее определяет набор методов, которые будут проходить по дереву, искать шаблон узлов, который соответствует правилу древовидной грамматики, и выполнять на этом основании некоторые действия. Я не могу зависеть от формирования вывода AST, основываясь на том, что аккуратно и аккуратно для грамматики дерева (исключая бессмысленные токены для скорости сопоставления с образцом), но использую AST для цветового кодирования даже бессмысленных токенов. Я также пишу IDE; Я также не могу написать каждый возможный шаблон узла AST, которому мог бы соответствовать автор плагина, и при этом я не хочу требовать, чтобы они использовали ANTLR для написания древовидной грамматики. В случае авторов плагинов, которые обходят дерево по своим собственным критериям, узлы правил были бы весьма полезны, чтобы избежать необходимости сопоставления с образцом.

Мысли? Я знаю, что этот «вопрос» может раздвинуть границы того, чтобы быть ТАКИМ вопросом, но я не уверен, как еще сформулировать мои запросы или куда еще спросить.

1 Ответ

4 голосов
/ 13 мая 2011

Сион Шивок писал:

A) Есть ли какая-то причина, по которой мне не следует использовать AST для нескольких целей и отказаться от использования указанных токенов?

Нет, вы тоже не против держать их там.

Сион Шеевок писал:

Кажетсядля меня то, что вывод интерпретатора ANTLRWorks - это то, что я ищу.В интерпретаторе ANTLRWorks он выводит древовидную диаграмму, где для каждого сопоставленного правила создается узел, а также дочерний узел для каждого токена и / или подчиненного правила.Дерево разбора, я полагаю, оно называется.

Правильно.

Сион Шеевок написал:

B)Учитывая, что грамматика синтаксического анализатора была ответственна за генерацию правильно сформированных AST, и учитывая включение узлов AST правила, не должен ли ручной обходчик избегать избыточного соответствия шаблона узла AST грамматике дерева?

Древесные грамматики часто используются для смешивания пользовательского кода для оценки / интерпретации входного источника.Если вы смешаете этот код внутри грамматики синтаксического анализатора и , то в синтаксическом анализаторе произойдет некоторый возврат, этот пользовательский код может быть выполнен больше, чем предполагалось.Ходить по дереву с помощью древовидной грамматики (если все сделано правильно) можно только одним способом, в результате чего пользовательский код может быть выполнен только один раз.

Но , если необходим отдельный обходчик / итератор дерева, есть два лагеря, которые выступают за использование древовидных грамматик, а другие предпочитают обходить дерево вручную с помощью пользовательского итератора.Оба лагеря дают действительные баллы о том, как они предпочитают ходить по АСТ.Так что нет однозначного способа сделать это одним конкретным способом.

Сион Шеевок писал:

Мысли?

Поскольку вы не оцениваете / не интерпретируете, вы также не будете использовать древовидную грамматику.

Но чтобы создать дерево разбора, как это делает ANTLRWorks (к которому у вас нет доступа, кстати), вам нужно будет смешать правила переписывания AST внутри грамматики вашего синтаксического анализатора.Вот вопросы и ответы, которые объясняют, как это сделать: Как вывести AST, построенный с использованием ANTLR?

Удачи!

...