public override Parser <TInput> VisitOneOrMore(OneOrMoreParser <TInput> parser) { if (state.State == 0) { state.State = 1; state.NextOutputStart = output.Count; return(parser.Parser); } else if (state.State == 1 && state.LastResult < 0) { // first parse did not succeed, fail state.InputLength = state.LastResult; return(null); } else if (state.LastResult > 0) { // keep going as long as parsing is successful and consumed input state.State++; state.InputLength += state.LastResult; state.NextOutputStart = output.Count; return(parser.Parser); } else { return(null); } }
public void 二つ目の要素のパースに失敗したら一つ分カーソルは進みます() { var tested = new OneOrMoreParser <char>(new CharParser('a')); var(_, cursol, _) = tested.Parse(new Cursol("ab")); cursol.Index.Is("a".Length); }
public void 二つ目の要素のパースに失敗しても全体としては成功です() { var tested = new OneOrMoreParser <char>(new CharParser('a')); var(isSuccess, _, _) = tested.Parse(new Cursol("ab")); isSuccess.IsTrue(); }
public void 一つ目の要素のパースに成功したら成功です() { var tested = new OneOrMoreParser <char>(new CharParser('a')); var(isSuccess, _, _) = tested.Parse(new Cursol("a")); isSuccess.IsTrue(); }
public void 一つ目の要素のパースに失敗したら失敗です() { var tested = new OneOrMoreParser <char>(new CharParser('a')); var(isSuccess, _, _) = tested.Parse(new Cursol("b")); isSuccess.IsFalse(); }
public void 二つ目の要素のパースに失敗したらパース結果は一文字分です() { var tested = new OneOrMoreParser <char>(new CharParser('a')); var(_, _, parsed) = tested.Parse(new Cursol("ab")); parsed.Count().Is(1); parsed.ElementAt(0).Is('a'); }
public void 一つ目の要素のパースに成功したら一つ目の要素のみが得られます() { var tested = new OneOrMoreParser <char>(new CharParser('a')); var(_, _, parsed) = tested.Parse(new Cursol("a")); parsed.Count().Is(1); parsed.ElementAt(0).Is('a'); }
public override int VisitOneOrMore(OneOrMoreParser <TInput> parser, int start) { int len = Search(parser.Parser, start); if (len < 0) { return(len); } var totalLen = 0; while (len > 0) { totalLen += len; len = Search(parser.Parser, start + totalLen); } return(totalLen); }
public override void VisitOneOrMore(OneOrMoreParser <TInput> parser) { WriteOneOrMore(parser.Parser); }