Помеченные узлы AST можно посетить во время синтаксического анализа в X3 с помощью annotation_base::on_success
.
Могу ли я получить их адреса (и сохранить, а также другую информацию, например, соответствующую пару итераторов входного диапазона) и рассчитывать на ее неизменность (для всех, но, возможно, за исключением узла AST верхнего уровня, который можно перемещать / копировать после parse
) когда их использовать позже?
Можно ли предположить, что узлы AST уже размещены в состоянии, которое не будет изменено при parse
возвращается?
AST — это комбинация агрегатов и контейнеров STL: рекурсивное дерево.
Конечно, все промежуточные узлы AST также можно перемещать / копировать.
Это очень ясно, если вы, например, понимаете, что происходит, когда x_rule
разбирает в X
а потом разбираешь x_rule % ','
, Вектор (или другой контейнер) будет перемещать / копировать X
в, и все другие элементы могут двигаться из-за перераспределения.
Если цель состоит в том, чтобы прикрепить некоторые данные вне дерева, не слишком сильно увеличивая узлы AST, вы можете рассмотреть возможность хранения информации отдельно и ссылки на нее (по идентификатору, указателю или какой-либо ссылке).
В этом случае вам может просто понадобиться «собрать мусор» отдельно хранимых данных (и защититься от неконтролируемого накопления в случае интенсивного возврата). Используя shared_ptr
может получить вам это удобно за счет дополнительных накладных расходов.
Других решений пока нет …