/// <summary> /// パースを行います。 /// </summary> /// <param name="src"></param> /// <returns></returns> protected override ResultCore <char> DoParse(Reader src) { var ch = src.Peek(); var res = _original.Parse(src); return(res.Successful ? Success((char)ch) : Failure(res.Message)); }
public void ParseAsyncは内部パーサーと同じように失敗します() { var cursol = new Cursol("public"); var parser = new CharParser('a'); var tested = new RecursiveParser <char>(() => parser); (tested.Parse(cursol)).IsStructuralEqual(parser.Parse(cursol)); }
public void ParseAsyncは内部パーサーと同じように成功します() { var cursol = new Cursol("public"); var parser = new CharParser('p'); var tested = new DebugParser <char>(parser, () => { }); (tested.Parse(cursol)).IsStructuralEqual(parser.Parse(cursol)); }
public void ParseAsyncはIgnoreCaseでない場合に大文字指定の場合に小文字を区別します() { var cursol = new Cursol("public"); var tested = new CharParser('P'); var(isSuccess, _, _) = tested.Parse(cursol); isSuccess.IsFalse(); }
public void ParseAsyncはIgnoreCaseで大文字指定でも小文字を識別します() { var cursol = new Cursol("public"); var tested = new CharParser('P', true); var(isSuccess, _, _) = tested.Parse(cursol); isSuccess.IsTrue(); }
public void ParseAsyncは読み込みに成功した場合にその分進んだカーソルを返します() { var cursol = new Cursol("public"); var tested = new CharParser('p'); var result = tested.Parse(cursol); result.cursol.Index.Is(1); }
public void ParseAsyncは指定していない文字を読み込みに失敗します() { var cursol = new Cursol("internal"); var tested = new CharParser('p'); var result = tested.Parse(cursol); result.isSuccess.IsFalse(); }
public void ParseAsyncは指定した文字を読み込みます() { var cursol = new Cursol("public"); var tested = new CharParser('p'); var result = tested.Parse(cursol); result.parsed.Is('p'); }
public void ParseAsyncは指定した文字を読み込みに成功します() { var cursol = new Cursol("public"); var tested = new CharParser('p'); var result = tested.Parse(cursol); result.isSuccess.IsTrue(); }
public void ParseAsyncはIgnoreCaseで大文字指定の場合に実際に識別した文字を結果とします() { var cursol = new Cursol("public"); var tested = new CharParser('P', true); var(_, _, parsed) = tested.Parse(cursol); parsed.Is('p'); }
public void FailParse() { IScanner scanner = Provider.Scanner; CharParser parser = Prims.CharOf(NonMatchedChar); ParserMatch m = parser.Parse(scanner); Assert.IsTrue(!m.Success); Assert.AreEqual(scanner.Offset, 0); }
public void SuccessParse() { IScanner scanner = Provider.Scanner; CharParser parser = Prims.CharOf(MatchedChar); ParserMatch m = parser.Parse(scanner); Assert.IsTrue(m.Success); Assert.AreEqual(m.Offset, 0); Assert.AreEqual(m.Length, 1); Assert.AreEqual(scanner.Offset, 1); }
public ParserError(ParserMatch noMatch, string errorId, string errorMessage) { if (errorId == null) { throw new ArgumentNullException("errorId"); } if (errorMessage == null) { throw new ArgumentNullException("errorMessage"); } long errorOffset = noMatch.Offset + noMatch.Length; IScanner scanner = noMatch.Scanner; long originalOffset = scanner.Offset; long lastLineOffset = 0; scanner.Offset = 0; Parser eol = Prims.Eol; Parser notEol = new CharParser(delegate(Char c) { return(c != '\r' && c != '\n'); }); _line = 1; // 1 based not 0 based while (!scanner.AtEnd) { notEol.Parse(scanner); if (scanner.AtEnd) { break; } ParserMatch match = eol.Parse(scanner); if (scanner.Offset > errorOffset) { break; } if (match.Success) { ++_line; lastLineOffset = scanner.Offset; } } _column = errorOffset - lastLineOffset + 1; // 1 based not 0 based scanner.Offset = originalOffset; _errorText = errorMessage; _errorId = errorId; }
public static Either <TLeft, char> ParseToChar <TLeft>(this string source, TLeft left) { return(CharParser.Parse(source, left)); }
public static Either <TLeft, char> ParseToChar <TLeft>(this Either <TLeft, string> source, TLeft left) { return(source.FlatMap(x => CharParser.Parse(x, left))); }
public static Maybe <char> ParseToChar(this string source) { return(CharParser.Parse(source)); }