Я написал калькулятор для основных стандартных операций EStandardOperation (MINUS, PLUS, ADD, SUB, MUL, DIV, REM, MOD) и API-классы для создания/расширения калькуляторов (см. класс syntax.Calculator). А у класса Operation появился метод для схлопывания подвыражений:
public ISyntaxElement reduce(ICalculator calculator, int flags)
Его можно использовать следующим образом
syntax.addFormula(
new Formula(
new Operation(
EStandardOperation.EQ,
a,
new Operation(
EStandardOperation.ADD,
new Value(intType.valueOf("2", 10)),
new Value(intType.valueOf("3", 10))).reduce(CalculatorForStandard.getInstance(), 0)
)
)
);
Данный код помогает упростить выражение (+ 2 3) в число 5.
В дальнейшем стандартный калькулятор может быть расширен для поддержки новых стандартных операций. Также на основе имеющихся базовых классов можно создавать калькуляторы для других типов операций.