Что такое синтезированные атрибуты в контексте создания абстрактного дерева синтаксиса?

Компиляторы обрабатывают исходный код и создают абстрактное синтаксическое дерево. Функции, используемые для построения указателей возврата абстрактного синтаксического дерева, которые составляют синтезированные атрибуты. Каковы они и как они отличаются от унаследованных атрибутов.?

edit: Я не знаю, может ли это помочь, но я изначально слышал об этих терминах во французском контексте: Attributs synthétisés, attributs hérités.

Ответ 1

Атрибуты - это дополнительные значения, связанные с чем-то центральным интересом. В случае АСТ вы можете думать о них как о парах (attribute_name, attribute_value), связанных с каждым AST node, где имя атрибута соответствует некоторому интересному фактологическому типу, а значение атрибута соответствует фактическому состоянию этого факта (например, "(constants_in_subtree_count, 12)" ).

Наследуются и синтезируются термины для описания того, как значения атрибутов вычисляются для каждого AST node, обычно связанного с правилом грамматики, которое создает AST node с использованием его дочерних элементов.

Синтезированные атрибуты - это те, значение которых вычисляется из значений атрибутов из дочерних узлов и передается по дереву. Часто значения синтезированных атрибутов объединяются для создания атрибута для родительского node. Если AST node имеет двух детей, каждый из которых имеет свои собственные атрибуты (constants_in_subtree_count, 5) и (constants_in_subtree_count, 7), то, передавая эти атрибуты вверх, родитель может вычислить свой соответствующий атрибут (constants_in_subtree_count, 12).

Унаследованные атрибуты - это те, которые передаются от родителя до ребенка. Если корень функции AST "знает", то функция return type is (return_type, integer) как атрибут, она может передать тип возврата дочерним элементам функции root, например. к телу функции. Некоторое место в глубине этого дерева является фактическим оператором return; если он получает унаследованный атрибут (return_type, X), он может проверить, что результат, который он вычисляет, является правильным типом.

На практике вы хотите иметь возможность определять произвольные наборы атрибутов для узлов и передавать их вверх и вниз по дереву для нескольких целей, необходимых для обработки АСТ (построение таблиц символов, построение графиков потока управления, проверка типов операций, вычислительные метрики,...). Генератор грамматики > представляет собой своего рода генератор синтаксического анализатора, который будет принимать правила грамматики, наборы определений атрибутов и правила о том, как вычислить синтезированные и унаследованные атрибуты для узлов, участвующих в каждое правило, и генерирует как синтаксический анализатор, так и AST walker, который вычисляет все атрибуты.

Значение этой идеи заключается в том, что она обеспечивает организационный принцип, поддерживаемый автоматизацией, который может быть использован для вычисления многих интересных вещей об АСТ в регулярном режиме. В противном случае вы сможете кодировать все это с помощью специального hoc-кода.

Наш DMS Software Reengineering Toolkit - это система управления АСТ (фактически преобразование исходных программ), которая в значительной степени использует параллельную оценку атрибутов для вычисления всех видов полезных анализов над AST: обычные метрики, таблицы символов, проверки типов (например, проверка типа возврата, описанная выше), удаление из потока кода и потока данных из кода, а также другие непродуманные, но полезные результаты, рассчитанные по поддеревьям ( "список связанных с выполнением заданий в этом выражении" ). Почему параллель? Ну, вычисления атрибутов в поддеревьях по существу независимы, поэтому parallelism уже существует, и когда вы имеете дело с действительно большими проблемами с деревьями. DMS часто занимается тысячами единиц компиляции, каждый из которых производит (возможно, большой) АСТ.