Ejemplo n.º 1
0
        //---------------------------------------------------------------------
        // キー/値解析
        //---------------------------------------------------------------------
        /// <summary>キーと値のペアを取得する。</summary>
        /// <param name="iter">イテレータ。</param>
        /// <param name="table">対象テーブル。</param>
        /// <param name="lastNoCheck">改行確認するならば真。</param>
        /// <returns>追加できたならば真。</returns>
        private bool AnalisysKeyAndValue(TomlInnerBuffer.TomlIter iter,
                                         TomlTable table,
                                         bool lastNoCheck)
        {
            // キー文字列を取得する
            //
            // 1. キー文字列を取得
            // 2. キー以降の空白を読み飛ばす
            // 3. = で連結しているか確認
            var keyPtr = iter.GetKeys();            // 1

            iter.SkipSpace();                       // 2
            if (iter.GetChar(0).ch1 != '=')         // 3
            {
                throw new TomlAnalisysException(Resources.KEY_ANALISYS_ERR, iter);
            }

            // 値を取得する
            //
            // 1. 値が取得できるか
            // 2. 無効値であるか
            iter.Skip(1);
            var val = this.AnalisysValue(iter);     // 1

            if (val.ValueType == TomlValueType.TomlNoneValue)
            {
                return(false);                       // 2
            }

            // 改行まで確認
            if (!lastNoCheck && !iter.CheckLineEndOrComment())
            {
                throw new TomlAnalisysException(Resources.KEY_VALUE_ERR, iter);
            }

            // '.' で指定されたテーブル参照を収集する
            //
            // 1. テーブル参照を取得
            // 2. エラーが有れば終了
            // 3. 既に作成済みならばカレントを変更
            // 4. 作成されていなければテーブルを作成し、カレントに設定
            TomlTable curTable = table;
            TomlTable newTable = null;

            for (int i = 0; i < keyPtr.Count - 1; ++i)
            {
                var keystr = keyPtr[i];

                switch (curTable.SearchPathTable(keystr, out newTable))     // 1
                {
                case 0:                                                     // 2
                    throw new TomlAnalisysException(Resources.TABLE_REDEFINITION_ERR, iter);

                case 1:
                    curTable = newTable;                                    // 3
                    break;

                default:
                    newTable = new TomlTable();                             // 4
                    curTable.AddKeyAndValue(keystr, newTable);
                    curTable = newTable;
                    break;
                }
            }

            // 最終のテーブルに値を割り当てる
            var laststr = keyPtr[keyPtr.Count - 1];

            if (!curTable.Contains(laststr))
            {
                curTable.AddKeyAndValue(laststr, val);
                return(true);
            }
            else
            {
                throw new TomlAnalisysException(Resources.DEFINED_KEY_ERR, iter);
            }
        }