public override string ToString() { if (_hasDelta) { return(string.Format("{0} to {1}", ParsecUtility.CharToString(Start), ParsecUtility.CharToString(End))); } else { return(ParsecUtility.CharToString(Start)); } }
protected override ResultCore DoParse(Reader src) { var ch = src.Read(); if (0 <= ch && _clazz.Contains((char)ch)) { return(Success()); } else { return(Failure(string.Format("a member of {0} expected but {1} found.", _clazz, ParsecUtility.CharToString(ch)))); } }
/// <summary> /// パースを行います。 /// </summary> /// <param name="src"></param> /// <returns></returns> protected override ResultCore DoParse(Reader src) { var actual = src.Read(); if (_expected == actual) { return(Success()); } else { return(Failure(string.Format("expected {0} but found {1}.", ParsecUtility.CharToString(_expected), ParsecUtility.CharToString(actual)))); } }
protected override ResultCore DoParse(Reader src) { // キーワードの左側から順番に文字の照合を実施 // *照合中にEOFに到達した場合も通常の文字と同じ比較処理で検出し // ハンドリングできるため、ループ条件部には何もチェックを入れない for (var i = 0; i < _keyword.Length; i++) { // 期待される文字 var expected = _keyword[i]; // 実際の文字 var actual = src.Read(); // 比較を行う if (expected != actual) { // NGの場合、その旨の結果を呼び出し元に返す return(Failure(string.Format("expected {0} but found {1} at index {2} in \"{3}\"", ParsecUtility.CharToString(expected), ParsecUtility.CharToString(actual), i, _keyword), -1 == _cut || i < _cut)); } } return(Success()); }
protected override ResultCore DoParse(Reader src) { return(src.EndOfFile ? Success() : Failure(string.Format("EOF expected but found {0}.", ParsecUtility.CharToString(src.Peek())))); }
protected override ResultCore DoParse(Reader src) => ParsecUtility.Or(src, Left, Right);