/// <summary> /// パース本処理後にロギングを行い、呼び出しスタックを更新します。 /// </summary> /// <param name="result"></param> internal void PostParse <T>(ResultCore <T> result) { // 呼び出し階層の記録がOFFの場合は処理を直ちに終了 if (_nostack) { return; } // アペンダーが存在しない場合は処理を直ちに終了 if (_nolog) { _stack?.Pop(); return; } // パース終了を示すログメッセージを作成してアペンダーをコール var buff = MakeLabel('-'); if (result.Successful) { buff.Append("Success(").Append(result.Capture); } else { buff.Append("Failure(").Append(result.Message); } if (!result.CanBacktrack) { buff.Append(", cut"); } _logAppender(buff.Append(')').ToString()); // スタックから直近のパーサー名を削除 _stack.Pop(); }
/// <summary> /// パース開始と終了の文字位置の情報を持たない<see cref="ResultCore"/>を返します。 /// </summary> /// <returns></returns> public ResultCore DetachPosition() { if (Successful) { return(ResultCore.OfSuccess(CanBacktrack)); } else { return(ResultCore.OfFailure(_message, CanBacktrack)); } }
/// <summary> /// パース失敗を表す<see cref="ResultCore"/>インスタンスを生成します。 /// </summary> /// <param name="message">パース失敗の理由を示すメッセージ</param> /// <param name="canBacktrack">直近の<c>|</c>や<c>Or(...)</c>を /// 起点とするバックトラックを有効にするかどうか(デフォルトは<c>true</c>で、バックトラックは有効)</param> /// <returns></returns> protected ResultCore Failure(string message, bool canBacktrack) { return(ResultCore.OfFailure(message, canBacktrack)); }
/// <summary> /// パース失敗を表す<see cref="ResultCore"/>インスタンスを生成します。 /// </summary> /// <param name="message">パース失敗の理由を示すメッセージ</param> /// <returns></returns> protected ResultCore Failure(string message) { return(ResultCore.OfFailure(message, true)); }
/// <summary> /// パース成功を表す<see cref="ResultCore"/>インスタンスを生成します。 /// </summary> /// <param name="canBacktrack">直近の<c>|</c>や<c>Or(...)</c>を /// 起点とするバックトラックを有効にするかどうか(デフォルトは<c>true</c>で、バックトラックは有効)</param> /// <returns></returns> protected ResultCore Success(bool canBacktrack) { return(ResultCore.OfSuccess(canBacktrack)); }
/// <summary> /// パース成功を表す<see cref="ResultCore"/>インスタンスを生成します。 /// </summary> /// <returns></returns> protected ResultCore Success() { return(ResultCore.OfSuccess(true)); }
/// <summary> /// パース成功を表す<see cref="ResultCore{T}"/>インスタンスを生成します。 /// </summary> /// <param name="value"></param> /// <param name="canBacktrack">直近の<c>|</c>や<c>Or(...)</c>を /// 起点とするバックトラックを有効にするかどうか(デフォルトは<c>true</c>で、バックトラックは有効)</param> /// <returns></returns> protected ResultCore <T> Success(T value, bool canBacktrack) { return(ResultCore <T> .OfSuccess(value, canBacktrack)); }
/// <summary> /// パース成功を表す<see cref="ResultCore{T}"/>インスタンスを生成します。 /// </summary> /// <param name="value"></param> /// <returns></returns> protected ResultCore <T> Success(T value) { return(ResultCore <T> .OfSuccess(value, true)); }