public override CodeGenPayload Visit(MultiplyToken token, CodeGenPayload state = default)
        {
            var r = Visit(token.Item2, state);

            return(new CodeGenPayload
            {
                Expression = Expression.Multiply(Visit(token.Item1, state).Expression, r.Expression)
            });
        }
 protected T Visit(IToken token, T state = default)
 {
     return(token switch
     {
         AddToken addToken => Visit(addToken, state),
         SubtractToken subtractToken => Visit(subtractToken, state),
         MultiplyToken multiplyToken => Visit(multiplyToken, state),
         DivideToken divideToken => Visit(divideToken, state),
         NegateToken negateToken => Visit(negateToken, state),
         NumberToken numberToken => Visit(numberToken, state),
         FactorialToken factorialToken => Visit(factorialToken, state),
         PowerToken powerToken => Visit(powerToken, state),
         VariableToken variableToken => Visit(variableToken, state),
         AssignmentToken assignmentToken => Visit(assignmentToken, state),
         _ => throw new ArgumentOutOfRangeException(nameof(token))
     });
 public virtual T Visit(MultiplyToken token, T state = default)
 {
     return(Visit(token.Item1, state ?? new T()).Combine(Visit(token.Item2, state ?? new T())));
 }