Feature #4689
closed
[expression] Отсечение поддеревьев выражения в обходчике
Added by Artem Kotsynyak almost 11 years ago.
Updated about 10 years ago.
Assignee:
Andrei Tatarnikov
Published in build:
140915
Description
Добавить возможность неполного обхода дерева выражения. Отсечение следует проводить для подвыражений (onExprBegin()) и, взможно, для операндов (onOperandBegin()).
- Assignee set to Andrei Tatarnikov
Какой предлагается механизм? Возвращать спецзначение?
- Tracker changed from Bug to Feature
Alexander Kamkin wrote:
Какой предлагается механизм? Возвращать спецзначение?
Да. Есть вариант с выбрасыванием исключения, но это уж слишком.
- Target version set to 0.1
Пример обходчика с отсечением поддеревьев можно посмотреть в проекте Verilog Translator (пакет ru.ispras.verilog.parser.walker
). Предлагаю сделать аналогичным образом. Методы-визиторы возвращают одно из трех возможных значений:
enum Result {
OK, // Продолжить обход.
PRUNE, // Отсечь дочерние поддеревья узла (может возвращаться только в методах onNodeBegin).
ABORT // Завершить обход.
}
- Status changed from New to Resolved
- % Done changed from 0 to 100
Реализовано в r541. Я сделал немножко по-другому: вместо возвращаемого значения для каждого метода, я добавил в интерфейс ExprTreeVisitor метод getStatus, который возвращает текущий статус visitor-а:
static enum Status
{
OK, // Continue traversing
SKIP, // Skip child nodes
ABORT // Stop traversing
}
Status getStatus();
Так сделано для того, что бы минимизировать изменения в уже реализованных Visitor-ах и не вынуждать разработчиков Visitor-ов, не использующих возможности прерывания обхода и отсечения поддеревьев, каждый раз возвращать статус. В тех случаях, когда требуется прерывание обхода из-за ошибки, то это уже исключение (exception), а не статус ABORT.
- Target version changed from 0.1 to 0.3
- Status changed from Resolved to Closed
- Published in build set to 140915
Also available in: Atom
PDF