Как стать автором
Обновить

Комментарии 1

Лично я считаю, что намного "правильнее" будет строить с помощью "экшенов" непосредственно AST в виде DTO, а логику реализовывать уже визиторами/треверсерами по этому AST.


Ну типа такого:


expr: expr '+' term { AdditionNode(expr, term) }

В качестве альтернативы

В крайнем случае в AdditionNode добавить интерфейс/абстрактный_класс Expression (в питоне их нет, по-этому я про другие языки) с методом eval, который будет рекурсивно вызывать вложенные правила (на псевдоязыке):


abstract class Expression
    constructor(Expression a, Expression b):
        [this.a, this.b] = [a, b]

    eval():
        return this.a.eval() + this.b.eval();

Да, это будет чуть дольше работать, но зато поддерживать, расширять и отлаживать подобный код будет на порядки удобнее. Примерно как разделение логики в контроллере от представления.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории