Комментарии 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();
Да, это будет чуть дольше работать, но зато поддерживать, расширять и отлаживать подобный код будет на порядки удобнее. Примерно как разделение логики в контроллере от представления.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Добавление экшенов в грамматику PEG