Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Лично я считаю, что намного "правильнее" будет строить с помощью "экшенов" непосредственно 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