Необработанное исключение InvalidOperationException при построении деревьев выражений - PullRequest
0 голосов
/ 26 января 2020

Я пытался построить дерево выражений, которое будет оценивать математические выражения в RPN.

У меня возникла исключительная ситуация при попытке вызвать мое выражение MakeBinary для вычисления чисел в дереве.

Исключением является следующее "System.InvalidOperationException:" Бинарный оператор Add не определен для типов 'System.Char' и 'System.Char'. '"

Вот мой code:

  public static bool isOp(char checkIt)
    {
        bool verify;
        if(checkIt== '+'|| checkIt== '-'||checkIt== '*' || checkIt== '/'||checkIt== '^')
        {
            return verify= true;
        }
        else
        {
            return verify= false;
        }

        return verify;
    }

    public static  BinaryExpression myMakeBiniray(char ops,Expression leftOp, Expression rightOp)
    {


        switch (ops)
        {

            case '+':
                Expression left = leftOp;
                Expression right = rightOp;
               return Expression.MakeBinary(ExpressionType.Add, left, right);
               // return Expression.MakeBinary(ExpressionType.Add, Expression.Constant(2), Expression.Constant(4));

            case '-':
                return Expression.MakeBinary(ExpressionType.Subtract, Expression.Constant(leftOp), Expression.Constant(rightOp));

            case '*':
               return Expression.MakeBinary(ExpressionType.Multiply, Expression.Constant(leftOp), Expression.Constant(rightOp));

            case '/':
              return  Expression.MakeBinary(ExpressionType.Divide, Expression.Constant(leftOp), Expression.Constant(rightOp));

            case '^':
               return Expression.MakeBinary(ExpressionType.Power, Expression.Constant(leftOp), Expression.Constant(rightOp));

            default:
                return null;

        }

    }
    static void Main(string[] args)
    {

        Console.WriteLine("Enter mathematical expression : ");


        string input = "12+";

        Stack<Expression> ex = new Stack<Expression>();



        for (int i = 0; i < input.Length; i++)
        {

            var d = input[i];
            if (!isOp(d))
            {
                Expression constacntNumberExpression = Expression.Constant(d);
                ex.Push(constacntNumberExpression);
            }
            else
            {
                Expression popLeft = ex.Pop();
                Expression popRight = ex.Pop();
                BinaryExpression node=  myMakeBiniray(d, popLeft, popRight);
                ex.Push(node);
            }
        }

Я изо всех сил пытаюсь понять источник проблемы, любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 26 января 2020

Вам нужно преобразовать ввод из char в int, когда вы добавляете числовые выражения в стек.

Измените эту часть Main:

var d = input[i];
if (!isOp(d))
{
    Expression constacntNumberExpression = Expression.Constant(d);
    ex.Push(constacntNumberExpression);
}

В:

var d = input[i];
if (!isOp(d) && Char.IsNumber(d))
{
    var constantNumber = Char.GetNumericValue(d);
    Expression constacntNumberExpression = Expression.Constant(constantNumber);
    ex.Push(constacntNumberExpression);
}
...