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);
        }
Exemple #2
0
        public void 二つ目の要素のパースに成功したら二つ分カーソルは進みます()
        {
            var tested = new ZeroOrMoreParser <char>(new CharParser('a'));

            var(_, cursol, _) = tested.Parse(new Cursol("aa"));

            cursol.Index.Is("aa".Length);
        }
Exemple #3
0
        public void 一つ目の要素のパースに成功したら成功です()
        {
            var tested = new ZeroOrMoreParser <char>(new CharParser('a'));

            var(isSuccess, _, _) = tested.Parse(new Cursol("a"));

            isSuccess.IsTrue();
        }
Exemple #4
0
        public void 一つ目の要素のパースに失敗したら結果は空です()
        {
            var tested = new ZeroOrMoreParser <char>(new CharParser('a'));

            var(_, _, parsed) = tested.Parse(new Cursol("b"));

            parsed.Count().Is(0);
        }
Exemple #5
0
        public void 一つ目の要素のパースに失敗したらカーソルは進みません()
        {
            var tested = new ZeroOrMoreParser <char>(new CharParser('a'));

            var(_, cursol, _) = tested.Parse(new Cursol("b"));

            cursol.Index.Is(0);
        }
Exemple #6
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);
     }
 }