Ejemplo n.º 1
0
        //---------------------------------------------------------------------
        // テーブル解析
        //---------------------------------------------------------------------
        /// <summary>テーブルを作成する。</summary>
        /// <param name="iter">イテレータ。</param>
        /// <param name="table">カレントテーブル。</param>
        private void AnalisysTable(TomlInnerBuffer.TomlIter iter, TomlTable table)
        {
            // '.' で区切られたテーブル名を事前に収集する
            var keyPtr = iter.GetKeys();

            // テーブルが閉じられているか確認
            if (!iter.CloseTable())
            {
                throw new TomlAnalisysException(Resources.TABLE_SYNTAX_ERR, iter);
            }

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

            foreach (var keystr in keyPtr)
            {
                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;
                }
            }

            // 空白は読み捨てておく
            iter.SkipSpace();

            // カレントのテーブルを設定
            this.current = curTable;
            if (!this.current.IsDefined)
            {
                this.current.IsDefined = true;
            }
            else
            {
                throw new TomlAnalisysException(Resources.DEFINED_KEY_ERR, iter);
            }
        }