private TreeNode MakeUnaryDifferential(UnaryOperationTreeNode uTreeNode, int index) { TreeNode childDx = MakeDifferential(uTreeNode.Child, index); TreeNode differential = UnaryDifferential[uTreeNode.Operation].Clone(); ReplaceDifferentialArguments(differential, uTreeNode.Child, childDx); return(differential); }
// stupid factorial. Why should it be after term, not before it? TreeNode ParseTermWithPossibleFactorial(ConstructionContext context) { TreeNode term = ParseTerm(context); while (context.TryPeekNextToken(out Token factorialToken) && factorialToken is SymbolToken factorialSymbolToken && factorialSymbolToken.Symbol == '!') { context.EatLastToken(); // eat factorial token term = new UnaryOperationTreeNode(UnaryOperation.Factorial, term); } return(term); }