2016-01-23 4 views
0

Маркированные узлы АСТ можно посещать во время разбора в X3 с использованием annotation_base::on_success.Расположение АСТ во время аннотации и после

Могу ли я получить их адреса (и сохранить, а также другую информацию, например, соответствующую пару итератора входного диапазона) и полагаться на ее неизменность (для всех, но, возможно, за исключением узла AST верхнего уровня, который можно перемещать/копировать после parse) при использовании их позже?

Могу ли я предположить, что узлы AST уже были выделены в состоянии, которое не будет изменено при возврате parse?

AST представляет собой комбинацию агрегатов и контейнеров STL: рекурсивное дерево.

ответ

1

Конечно, все промежуточные узлы AST могут быть перемещены/скопированы.

Это очень ясно, если вы, например, понимаете, что происходит, когда x_rule анализирует на X, а затем вы разобираете x_rule % ','. Вектор (или другой контейнер) будет перемещать/копировать X, а все остальные элементы могут перемещаться из-за перераспределения.

Если цель состоит в том, чтобы прикрепить некоторые данные из дерева, не слишком увеличивая узлы AST, вы можете рассмотреть возможность хранения информации отдельно и ссылаться на нее (по идентификатору, указателю или ссылке какого-либо типа).

В этом случае вам может потребоваться «сбор мусора» ваших отдельно хранимых данных (и защита от скопившегося скопления в случае тяжелой обратной смены). С помощью shared_ptr вы можете получить это за счет дополнительных накладных расходов.

+0

Я хочу знать, какие узлы соответствуют диапазонам итераторов. Существует биекция, но я не хочу каждый раз выполнять древовидную структуру, чтобы найти каждый идентификатор. Но я думаю, что смогу сделать это один раз после полного строительства дерева. – Orient

Смежные вопросы