//--------------------------------------------------------------------- // キー/値解析 //--------------------------------------------------------------------- /// <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); } }