Esempio n. 1
0
 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);
     }
 }
Esempio n. 2
0
        public void 二つ目の要素のパースに失敗したら一つ分カーソルは進みます()
        {
            var tested = new OneOrMoreParser <char>(new CharParser('a'));

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

            cursol.Index.Is("a".Length);
        }
Esempio n. 3
0
        public void 二つ目の要素のパースに失敗しても全体としては成功です()
        {
            var tested = new OneOrMoreParser <char>(new CharParser('a'));

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

            isSuccess.IsTrue();
        }
Esempio n. 4
0
        public void 一つ目の要素のパースに成功したら成功です()
        {
            var tested = new OneOrMoreParser <char>(new CharParser('a'));

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

            isSuccess.IsTrue();
        }
Esempio n. 5
0
        public void 一つ目の要素のパースに失敗したら失敗です()
        {
            var tested = new OneOrMoreParser <char>(new CharParser('a'));

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

            isSuccess.IsFalse();
        }
Esempio n. 6
0
        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');
        }
Esempio n. 7
0
        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');
        }
Esempio n. 8
0
        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);
 }