Расположение AST во время аннотации и после

Помеченные узлы AST можно посетить во время синтаксического анализа в X3 с помощью annotation_base::on_success.

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

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

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

0

Решение

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

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

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

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

1

Другие решения

Других решений пока нет …