/// <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); }
/// <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); } }
//--------------------------------------------------------------------- // 定数リテラル解析 //--------------------------------------------------------------------- /// <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); }
/// <summary>キーと値を登録する。</summary> /// <param name="key">キー。</param> /// <param name="value">値。</param> public void AddKeyAndValue(string key, ITomlValue value) { this.root.AddKeyAndValue(key, value); }
/// <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); } }