/// <summary>
        /// 数字をパースします。これは<see cref="Parse(JsonScanner)" />の一部で使用されます。
        /// </summary>
        /// <param name="scanner">指定するスキャナ。</param>
        /// <returns>パースに成功した場合32ビット符号付き数字を返します。</returns>
        public static int ParseNumber(JsonScanner scanner)
        {
            scanner.Empty();

            scanner.CheckAddAdvance(IsSign);

            scanner.CheckAddAdvanceLoop(IsDigit);

            scanner.CheckAddAdvance(IsDecimalPoint);

            scanner.CheckAddAdvanceLoop(IsDigit);

            if (scanner.CheckAddAdvance(IsExponent))
            {
                scanner.CheckAddAdvance(IsSign);

                scanner.CheckAddAdvanceLoop(IsDigit);
            }

            try
            {
                return(int.Parse(scanner.Scan));
            }
            catch (FormatException)
            {
                throw new ArgumentMapParseException("bad format number", scanner.Itext.PositionInfo);
            }
            catch (OverflowException)
            {
                throw new ArgumentMapParseException("overflow number", scanner.Itext.PositionInfo);
            }
            catch (Exception)
            {
                throw new ArgumentMapParseException("unexpected error number", scanner.Itext.PositionInfo);
            }
        }
        /// <summary>
        /// Json文字列をパースします。これは<see cref="Parse(JsonScanner)"/>の一部で使用されます。
        /// </summary>
        /// <param name="scanner">指定するスキャナ。</param>
        /// <returns>パースに成功した場合文字列をさらに返します。</returns>
        private static string ParseString(JsonScanner scanner)
        {
            const string b = "\b";
            const string f = "\f";
            const string n = "\n";
            const string r = "\r";
            const string t = "\t";

            scanner.Empty();

            if (!scanner.CheckAdvance(IsDoubleQuote))
            {
                throw new ArgumentMapParseException("string -> double quotation mark required", scanner.Itext.PositionInfo);
            }

            while (!scanner.CheckAdvance(IsDoubleQuote))
            {
                if (scanner.CheckAdvance(IsBackslash))
                {
                    if (scanner.CheckAddAdvance(IsDoubleQuote))
                    {
                        continue;
                    }
                    if (scanner.CheckAddAdvance(IsBackslash))
                    {
                        continue;
                    }
                    if (scanner.CheckAddAdvance(IsSlash))
                    {
                        continue;
                    }
                    if (scanner.CheckAdvance(IsSmallB))
                    {
                        scanner.Add(b);
                    }
                    else if (scanner.CheckAdvance(IsSmallF))
                    {
                        scanner.Add(f);
                    }
                    else if (scanner.CheckAdvance(IsSmallN))
                    {
                        scanner.Add(n);
                    }
                    else if (scanner.CheckAdvance(IsSmallR))
                    {
                        scanner.Add(r);
                    }
                    else if (scanner.CheckAdvance(IsSmallT))
                    {
                        scanner.Add(t);
                    }
                    else if (scanner.CheckAdvance(IsSmallU))
                    {
                        var codepoint = 0;

                        for (var i = 0; i < 4; i++)
                        {
                            try
                            {
                                codepoint = codepoint * 16 + scanner.Current.ToHexValue();

                                scanner.Advance();
                            }
                            catch (Exception)
                            {
                                break;
                            }
                        }

                        scanner.Add(Convert.ToChar(codepoint).ToString());
                    }
                    else
                    {
                        throw new ArgumentMapParseException("string -> not supported escape", scanner.Itext.PositionInfo);
                    }
                }
                else if (scanner.Check(IsControl))
                {
                    throw new ArgumentMapParseException("string -> control character", scanner.Itext.PositionInfo);
                }
                else
                {
                    scanner.AddAdvance();
                }
            }

            return(scanner.Scan);
        }