コード例 #1
0
        /// <summary>値の解析を行う。</summary>
        /// <param name="iter">イテレータ。</param>
        /// <returns>値情報。</returns>
        private ITomlValue AnalisysValue(TomlInnerBuffer.TomlIter iter)
        {
            ITomlValue value = null;

            // インラインテーブル、配列、日付の確認
            //
            // 1. インラインテーブルを解析する
            // 2. 配列を解析する
            // 3. 値を取得する
            iter.SkipSpace();
            if (iter.GetChar(0).ch1 == '{')         // 1
            {
                iter.Skip(1);
                value = this.GetInlineTable(iter);
            }
            else if (iter.GetChar(0).ch1 == '[')    // 2
            {
                iter.Skip(1);
                value = this.GetValueArray(iter);
            }
            else
            {
                value = this.ConvertValue(iter);    // 3
            }

            return(value);
        }
コード例 #2
0
 /// <summary>キーと値を登録する。</summary>
 /// <param name="key">キー。</param>
 /// <param name="value">値。</param>
 public void AddKeyAndValue(string key, ITomlValue value)
 {
     if (!this.keyPair.ContainsKey(key))
     {
         this.keyPair.Add(key, value);
     }
     else
     {
         throw new ArgumentException(Resources.REREGIST_KEY_ERR);
     }
 }
コード例 #3
0
        //---------------------------------------------------------------------
        // 定数リテラル解析
        //---------------------------------------------------------------------
        /// <summary>数値(定数)を取得する。</summary>
        /// <param name="iter">イテレータ。</param>
        /// <param name="value">値(戻り値)</param>
        /// <returns>値が取得できたならば真。</returns>
        internal static bool AnalisysKeyword(this TomlInnerBuffer.TomlIter iter, out ITomlValue value)
        {
            // 真偽値(偽)を返す
            if (iter.RemnantLength >= 5)
            {
                if (iter.GetChar(4).ch1 == 'e' &&
                    iter.GetChar(3).ch1 == 's' &&
                    iter.GetChar(2).ch1 == 'l' &&
                    iter.GetChar(1).ch1 == 'a' &&
                    iter.GetChar(0).ch1 == 'f')
                {
                    value = TomlValue.False;
                    iter.Skip(5);
                    return(true);
                }
            }

            if (iter.RemnantLength >= 4)
            {
                // 真偽値(真)を返す
                if (iter.GetChar(3).ch1 == 'e' &&
                    iter.GetChar(2).ch1 == 'u' &&
                    iter.GetChar(1).ch1 == 'r' &&
                    iter.GetChar(0).ch1 == 't')
                {
                    value = TomlValue.True;
                    iter.Skip(4);
                    return(true);
                }

                // 正の無限値を返す
                if (iter.GetChar(3).ch1 == 'f' &&
                    iter.GetChar(2).ch1 == 'n' &&
                    iter.GetChar(1).ch1 == 'i' &&
                    iter.GetChar(0).ch1 == '+')
                {
                    value = TomlValue.Create(double.PositiveInfinity);
                    iter.Skip(4);
                    return(true);
                }

                // 負の無限値を返す
                if (iter.GetChar(3).ch1 == 'f' &&
                    iter.GetChar(2).ch1 == 'n' &&
                    iter.GetChar(1).ch1 == 'i' &&
                    iter.GetChar(0).ch1 == '-')
                {
                    value = TomlValue.Create(double.NegativeInfinity);
                    iter.Skip(4);
                    return(true);
                }

                // 正の非数値を返す
                if (iter.GetChar(3).ch1 == 'n' &&
                    iter.GetChar(2).ch1 == 'a' &&
                    iter.GetChar(1).ch1 == 'n' &&
                    iter.GetChar(0).ch1 == '+')
                {
                    value = TomlValue.Create(double.NaN);
                    iter.Skip(4);
                    return(true);
                }

                // 負の非数値を返す
                if (iter.GetChar(3).ch1 == 'n' &&
                    iter.GetChar(2).ch1 == 'a' &&
                    iter.GetChar(1).ch1 == 'n' &&
                    iter.GetChar(0).ch1 == '-')
                {
                    value = TomlValue.Create(-double.NaN);
                    iter.Skip(4);
                    return(true);
                }
            }

            if (iter.RemnantLength >= 3)
            {
                // 無限値を返す
                if (iter.GetChar(2).ch1 == 'f' &&
                    iter.GetChar(1).ch1 == 'n' &&
                    iter.GetChar(0).ch1 == 'i')
                {
                    value = TomlValue.Create(double.PositiveInfinity);
                    iter.Skip(3);
                    return(true);
                }

                // 非数値を返す
                if (iter.GetChar(2).ch1 == 'n' &&
                    iter.GetChar(1).ch1 == 'a' &&
                    iter.GetChar(0).ch1 == 'n')
                {
                    value = TomlValue.Create(double.NaN);
                    iter.Skip(3);
                    return(true);
                }
            }

            value = null;
            return(false);
        }
コード例 #4
0
 /// <summary>キーと値を登録する。</summary>
 /// <param name="key">キー。</param>
 /// <param name="value">値。</param>
 public void AddKeyAndValue(string key, ITomlValue value)
 {
     this.root.AddKeyAndValue(key, value);
 }
コード例 #5
0
        /// <summary>数値(整数/実数/日付)を取得する。</summary>
        /// <param name="iter">イテレータ。</param>
        /// <returns>値情報。</returns>
        private ITomlValue ConvertValue(TomlInnerBuffer.TomlIter iter)
        {
            ITomlValue value = null;

            // 値リテラルを解析する
            if (iter.AnalisysKeyword(out value))
            {
                return(value);
            }

            // 複数ライン文字列を返す
            if (iter.RemnantLength >= 3)
            {
                // 複数ライン文字列を返す
                if (iter.GetChar(2).ch1 == '"' &&
                    iter.GetChar(1).ch1 == '"' &&
                    iter.GetChar(0).ch1 == '"')
                {
                    iter.Skip(3);
                    return(TomlValue.Create(iter.GetMultiStringValue()));
                }

                // 複数ライン文字列(リテラル)を返す
                if (iter.GetChar(2).ch1 == '\'' &&
                    iter.GetChar(1).ch1 == '\'' &&
                    iter.GetChar(0).ch1 == '\'')
                {
                    iter.Skip(3);
                    return(TomlValue.Create(iter.GetMultiLiteralStringValue()));
                }
            }

            // 数値/日付/文字列
            if (iter.RemnantLength > 0)
            {
                switch (iter.GetChar(0).ch1)
                {
                case (byte)'"':
                    // 文字列を取得する
                    iter.Skip(1);
                    return(TomlValue.Create(iter.GetStringValue()));

                case (byte)'\'':
                    // リテラル文字列を取得する
                    iter.Skip(1);
                    return(TomlValue.Create(iter.GetLiteralStringValue()));

                case (byte)'#':
                    // コメントを取得する
                    iter.Skip(1);
                    return(null);

                case (byte)'+':
                    // 数値を取得する
                    iter.Skip(1);
                    return(iter.GetNumberValue(false));

                case (byte)'-':
                    // 数値を取得する
                    iter.Skip(1);
                    return(iter.GetNumberValue(true));

                default:
                    // 日付/数値を取得する
                    return(iter.GetNumberOrDateValue());
                }
            }
            else
            {
                throw new TomlAnalisysException(Resources.NOT_DEFINED_VALUE_ERR, iter);
            }
        }