public override int VisitZeroOrMore(ZeroOrMoreParser <TInput> parser, int start) { var totalLen = 0; if (parser.ZeroOrOne) { var len = Search(parser.Parser, start); if (len > 0) { totalLen += len; len = Search(parser.Parser, start + len); if (len > 0) { totalLen += len; } } } else { var len = Search(parser.Parser, start); while (len > 0) { totalLen += len; len = Search(parser.Parser, start + totalLen); } } return(totalLen); }
public void 二つ目の要素のパースに成功したら二つ分カーソルは進みます() { var tested = new ZeroOrMoreParser <char>(new CharParser('a')); var(_, cursol, _) = tested.Parse(new Cursol("aa")); cursol.Index.Is("aa".Length); }
public void 一つ目の要素のパースに成功したら成功です() { var tested = new ZeroOrMoreParser <char>(new CharParser('a')); var(isSuccess, _, _) = tested.Parse(new Cursol("a")); isSuccess.IsTrue(); }
public void 一つ目の要素のパースに失敗したら結果は空です() { var tested = new ZeroOrMoreParser <char>(new CharParser('a')); var(_, _, parsed) = tested.Parse(new Cursol("b")); parsed.Count().Is(0); }
public void 一つ目の要素のパースに失敗したらカーソルは進みません() { var tested = new ZeroOrMoreParser <char>(new CharParser('a')); var(_, cursol, _) = tested.Parse(new Cursol("b")); cursol.Index.Is(0); }
public void 一つ目の要素のパースに成功したら一つ目の要素のみが得られます() { var tested = new ZeroOrMoreParser <char>(new CharParser('a')); var(_, _, parsed) = tested.Parse(new Cursol("a")); parsed.Count().Is(1); parsed.ElementAt(0).Is('a'); }
public override void VisitZeroOrMore(ZeroOrMoreParser <TInput> parser) { if (parser.ZeroOrOne) { WriteOptional(parser.Parser); } else { WriteZeroOrMore(parser.Parser); } }
public override Parser <TInput> VisitZeroOrMore(ZeroOrMoreParser <TInput> parser) { if (state.State == 0 || (state.LastResult > 0 && !parser.ZeroOrOne)) { // keep going as long as searching is successful and consumed input state.State++; state.InputLength += state.LastResult; return(parser.Parser); } else { return(null); } }