public IExpression MakeExpression(string expressionString) { var infixTokens = expressionTokenizer.Tokenize(expressionString); if (infixTokens.Count == 0) { return(null); } var postfixTokens = infixToPostfixConverter.Convert(infixTokens); var nodeStack = new Stack <ExpressionNode>(); nodeStack.Push(expressionNodeFactory.MakeNode(postfixTokens[0])); for (int i = 1; i < postfixTokens.Count; i++) { var node = expressionNodeFactory.MakeNode(postfixTokens[i]); if (node is OperatorNode operatorNode) { for (int j = operatorNode.ChildCount - 1; j >= 0; j--) { operatorNode.SetChild(nodeStack.Pop(), j); } } nodeStack.Push(node); } return(new Expression(nodeStack.Pop())); }