//--------------------------------------------------------------------- // テーブル解析 //--------------------------------------------------------------------- /// <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); } }