Показать сообщение отдельно
Старый 18.03.2015, 03:33   #14  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
858 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
Цитата:
Сообщение от lvan Посмотреть сообщение
Интерпретатор напишу. Не хочу парсер писать - вроде есть в dll
надо только понять, как его использовать
написал
выглядит примерно так:

X++:
private anytype evalBinary(Microsoft.Dynamics.AX.Framework.Tools.CodeUpgradeTool.Parser.BinaryExpression _expr)
{
    switch (true)
    {
        case _expr is Microsoft.Dynamics.AX.Framework.Tools.CodeUpgradeTool.Parser.AddExpression :
            return this.evalExpression(_expr.get_Left()) + this.evalExpression(_expr.get_Right());

        case _expr is Microsoft.Dynamics.AX.Framework.Tools.CodeUpgradeTool.Parser.SubtractExpression :
            return this.evalExpression(_expr.get_Left()) - this.evalExpression(_expr.get_Right());

        case _expr is Microsoft.Dynamics.AX.Framework.Tools.CodeUpgradeTool.Parser.MultiplyExpression :
            return this.evalExpression(_expr.get_Left()) * this.evalExpression(_expr.get_Right());

        case _expr is Microsoft.Dynamics.AX.Framework.Tools.CodeUpgradeTool.Parser.DivideExpression :
            return this.evalExpression(_expr.get_Left()) / this.evalExpression(_expr.get_Right());


        case _expr is Microsoft.Dynamics.AX.Framework.Tools.CodeUpgradeTool.Parser.OrExpression :
            return this.evalExpression(_expr.get_Left()) || this.evalExpression(_expr.get_Right());

        case _expr is Microsoft.Dynamics.AX.Framework.Tools.CodeUpgradeTool.Parser.AndExpression :
            return this.evalExpression(_expr.get_Left()) && this.evalExpression(_expr.get_Right());


        case _expr is Microsoft.Dynamics.AX.Framework.Tools.CodeUpgradeTool.Parser.EqualExpression :
            return this.evalExpression(_expr.get_Left()) == this.evalExpression(_expr.get_Right());

        case _expr is Microsoft.Dynamics.AX.Framework.Tools.CodeUpgradeTool.Parser.NotEqualExpression :
            return this.evalExpression(_expr.get_Left()) != this.evalExpression(_expr.get_Right());

        case _expr is Microsoft.Dynamics.AX.Framework.Tools.CodeUpgradeTool.Parser.LessThanExpression :
            return this.evalExpression(_expr.get_Left()) < this.evalExpression(_expr.get_Right());

        case _expr is Microsoft.Dynamics.AX.Framework.Tools.CodeUpgradeTool.Parser.LessThanOrEqualExpression :
            return this.evalExpression(_expr.get_Left()) <= this.evalExpression(_expr.get_Right());

        case _expr is Microsoft.Dynamics.AX.Framework.Tools.CodeUpgradeTool.Parser.GreaterThanExpression :
            return this.evalExpression(_expr.get_Left()) > this.evalExpression(_expr.get_Right());

        case _expr is Microsoft.Dynamics.AX.Framework.Tools.CodeUpgradeTool.Parser.GreaterThanOrEqualExpression :
            return this.evalExpression(_expr.get_Left()) >= this.evalExpression(_expr.get_Right());

        default:
            type = _expr.GetType();
            throw error(strFmt("Expression %1 not implemented", CLRInterop::getAnyTypeForObject(type.get_Name())));
    }
}