Project

General

Profile

Feature #4689

[expression] Отсечение поддеревьев выражения в обходчике

Added by Artem Kotsynyak over 5 years ago. Updated about 5 years ago.

Status:
Closed
Priority:
Normal
Category:
-
Target version:
Start date:
02/05/2014
Due date:
% Done:

100%

Estimated time:
Published in build:
140915

Description

Добавить возможность неполного обхода дерева выражения. Отсечение следует проводить для подвыражений (onExprBegin()) и, взможно, для операндов (onOperandBegin()).

History

#1

Updated by Alexander Kamkin over 5 years ago

  • Assignee set to Andrei Tatarnikov

Какой предлагается механизм? Возвращать спецзначение?

#2

Updated by Artem Kotsynyak over 5 years ago

  • Tracker changed from Bug to Feature

Alexander Kamkin wrote:

Какой предлагается механизм? Возвращать спецзначение?

Да. Есть вариант с выбрасыванием исключения, но это уж слишком.

#3

Updated by Alexander Kamkin about 5 years ago

  • Target version set to 0.1

Пример обходчика с отсечением поддеревьев можно посмотреть в проекте Verilog Translator (пакет ru.ispras.verilog.parser.walker). Предлагаю сделать аналогичным образом. Методы-визиторы возвращают одно из трех возможных значений:

enum Result {
  OK,    // Продолжить обход.
  PRUNE, // Отсечь дочерние поддеревья узла (может возвращаться только в методах onNodeBegin).
  ABORT  // Завершить обход.
}
#4

Updated by Andrei Tatarnikov about 5 years ago

  • 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.

#5

Updated by Alexander Kamkin about 5 years ago

  • Target version changed from 0.1 to 0.3
#6

Updated by Andrei Tatarnikov about 5 years ago

  • Status changed from Resolved to Closed
  • Published in build set to 140915

Also available in: Atom PDF