Esempio n. 1
0
 private static void RunJsonExample()
 {
     {
         var sdfa =
             from start in StartAtAny.ToGenericParser().WithPosition()
             from result in "abc".ToParserInvariant().ToGenericParser().WithPosition()
             select(result, start.Position).WithPosition() into result
             from a in AnyChar.Reversed().WithInputTransform <char, char, Generic.ReversedReadOnlyList <char, IReadOnlyList <char> >, Generic.InputReverse <char, Generic.ReversedReadOnlyList <char, IReadOnlyList <char> > > >(default).Times(4, 4)
Esempio n. 2
0
        // WAT THE F*CK, F*CK COMBINATORS, F*CK MY LIFE, F****CK!
        public static Parser <T> OrPreview <T>(this Parser <T> first, Parser <T> other)
            where T : BaseSyntax, IPositionAware <T>, IPassiveParseTransition, new() => i =>
        {
            var fr = first(i);
            var sr = other(i);
            switch (fr.WasSuccessful)
            {
            case false when !sr.WasSuccessful && i.Memos.IsEnabled(MemoFlags.NextFail):
                i.Memos.Disable(MemoFlags.NextFail);
                return(sr.IfFailure(sf => DetermineBestError(fr, sf)));

            case true:
                fr.Remainder.Memos.Enable(MemoFlags.NextFail);
                break;
            }

            if (fr.WasSuccessful)
            {
                return(Success(fr.Value, fr.Remainder));
            }
            if (sr.WasSuccessful)
            {
                return(Success(sr.Value, sr.Remainder));
            }

            if (!i.IsEffort(fr, sr))
            {
                return(sr.IfFailure(sf => DetermineBestError(fr, sf)));
            }

            // read until terminator char
            var r = AnyChar.Until(Char(';'))(i);

            var bestResult = DetermineBestError(fr, sr);
            var error      = new T();
            error.SetPos(FromInput(bestResult.Remainder), r.Remainder.Position - i.Position);


            error.Error = new PassiveParseError(bestResult.Message, bestResult.Expectations);
            r.Remainder.Memos.Enable(MemoFlags.NextFail);
            return(Success(error, r.Remainder));
        };
Esempio n. 3
0
        public static Parser <T> PreviewMultiple <T>(this Parser <T> first, params Parser <T>[] others)
            where T : BaseSyntax, IPositionAware <T>, IPassiveParseTransition, new()
        {
            return(i =>
            {
                var results = new[] { first }.Concat(others).Select(x => x(i)).ToArray();

                var succeeded = results.FirstOrDefault(x => x.WasSuccessful);

                if (succeeded is not null)
                {
                    return Success(succeeded.Value, succeeded.Remainder);
                }

                if (results.All(x => !x.WasSuccessful))
                {
                    if (i.Memos.IsEnabled(MemoFlags.NextFail))
                    {
                        i.Memos.Disable(MemoFlags.NextFail);
                        return DetermineBestErrors(results);
                    }
                }

                if (!i.IsEffort(results))
                {
                    return DetermineBestErrors(results);
                }

                var r = AnyChar.Until(Char(';'))(i);

                var error = new T();
                error.SetPos(FromInput(i), r.Remainder.Position - i.Position);

                var bestResult = DetermineBestErrors(results);
                error.Error = new PassiveParseError(bestResult.Message, bestResult.Expectations);
                r.Remainder.Memos.Enable(MemoFlags.NextFail);
                return Success(error, r.Remainder);
            });
        }
 public void Visit(AnyChar target)
 {
     stack.Push(NFA.AnyCharacter());
 }
Esempio n. 5
0
        public void TestStatics()
        {
            ut.Assert.AreEqual(Text("abc", ".txt").Expression, @"abc\.txt");
            ut.Assert.AreEqual(Text("abc", ".txt")[1].Expression, @"(?:abc\.txt){1}");
            ut.Assert.AreEqual(Group("abc", ".txt").Expression, @"(abc\.txt)");
            ut.Assert.AreEqual(NamedGroup("group1", "abc", ".txt").AtLeast(3).Expression, @"(?'group1'abc\.txt){3,}");
            ut.Assert.AreEqual(CaptureGroup("group1", "abc", ".txt").NoneOrOnce(RepeatMode.Lazy).Expression, @"(?'group1'abc\.txt)??");
            var g = NamedGroup("group1", NewLine.OnceOrMore());

            ut.Assert.AreEqual((g + BackRef("group1")).Expression, @"(?'group1'(?:\n|\r\n)+)\k'group1'");
            ut.Assert.AreEqual((g + BackRef(1)).Expression, @"(?'group1'(?:\n|\r\n)+)\1");

            ut.Assert.AreEqual(AtomicGroup("abc", ".txt").NoneOrMany().Expression, @"(?>abc\.txt)*");
            ut.Assert.AreEqual(Greedy("abc", ".txt").Maybe().Expression, @"(?>abc\.txt)?");
            ut.Assert.AreEqual(NonBacktracking("abc", ".txt").OnceOrMore().Expression, @"(?>abc\.txt)+");
            ut.Assert.AreEqual(NoBacktrack("abc", ".txt").Expression, @"(?>abc\.txt)");

            ut.Assert.AreEqual(NonCapturingGroup("abc", ".txt").Expression, @"(?:abc\.txt)");
            ut.Assert.AreEqual(Enclose("abc", ".txt")[1].Expression, @"(?:abc\.txt){1}");

            ut.Assert.AreEqual(BalancingGroup("group1", "abc.txt").Expression, @"(?'-group1'abc\.txt)");
            ut.Assert.AreEqual(BalancingGroup("group1", "group2", "abc.txt").Expression, @"(?'group2-group1'abc\.txt)");


            ut.Assert.AreEqual(LookAhead("abc")[2, 7].Expression, "(?=abc)");
            ut.Assert.AreEqual(NegativeLookAhead("abc", "efg").Expression, "(?!abcefg)");
            ut.Assert.AreEqual(LookBehind("abc".Repeat(5)).Expression, "(?<=(?:abc){5})");
            ut.Assert.AreEqual(NegativeLookBehind("abc".AsItIs() + "d" | "f").Expression, "(?<!abcd|f)");

            ut.Assert.AreEqual(AssertNextIs("abc").Expression, "(?=abc)");
            ut.Assert.AreEqual(AssertNextIsNot("abc", "efg")[2, 7].Expression, "(?!abcefg)");
            ut.Assert.AreEqual(AssertPreviousIs("abc".Repeat(5)).Expression, "(?<=(?:abc){5})");
            ut.Assert.AreEqual(AssertPreviousIsNot("abc".AsItIs() + "d" | "f").Expression, "(?<!abcd|f)");

            var p = "q" + AssertNextIs("u" + Group(AnyChar)) +
                    AnyChar.Repeat(3) + BackRef(1);

            ut.Assert.AreEqual(p.Expression, @"q(?=u(.)).{3}\1");

            p = "qu" + Group(AnyChar) + AnyChar + BackRef(1);
            ut.Assert.AreEqual(p.Expression, @"qu(.).\1");

            p = "qu" + Group(AnyChar) + AnyChar + AssertNextIs(BackRef(1));
            ut.Assert.AreEqual(p.Expression, @"qu(.).(?=\1)");

            ut.Assert.AreEqual(Intersection(Unicode.Arabic, Unicode.Letter).Expression, @"(?=\p{IsArabic})\p{L}");
            ut.Assert.AreEqual(Difference(Unicode.Letter, Unicode.Arabic).Expression, @"(?!\p{IsArabic})\p{L}");

            var ag = IfExists("group1").ThenMatch("abc");

            ut.Assert.AreEqual(ag.Expression, "(?(group1)abc)");
            ag = ag.ElseMatch("x");
            ut.Assert.AreEqual(ag.Expression, "(?(group1)abc|x)");

            ag = Check(1).YesPattern("abc");
            ut.Assert.AreEqual(ag.Expression, "(?(1)abc)");
            ag = ag.NoPattern("x");
            ut.Assert.AreEqual(ag.Expression, "(?(1)abc|x)");

            ag = Assert(StartOfText).YesPattern("abc");
            ut.Assert.AreEqual(ag.Expression, @"(?(\A)abc)");
            ag = ag.NoPattern("x");
            ut.Assert.AreEqual(ag[2, 3].Expression, @"(?(\A)abc|x){2,3}");

            ut.Assert.AreEqual(OptionsGroup()[1].Expression, "");
            var op = new OptionsGroupPattern().IgnoreCase().Multiline(false);

            ut.Assert.AreEqual(op.Expression, "(?i-m)");

            p = OptionsGroup().SetAll(true).OnceOrMore();
            ut.Assert.AreEqual(p.Expression, "(?imnsx)");

            op = Options.SetAll(false);
            ut.Assert.AreEqual(op.Expression, "(?-imnsx)");

            op = Options.SetAll(null);
            ut.Assert.AreEqual(op.Expression, "");

            p = OptionsGroup("abc")[2, 3];
            ut.Assert.AreEqual(p.Expression, "(abc)");


            ut.Assert.AreEqual(Comment("Test").Expression, @"(?#Test)");

            var LineComments = WithLineComments(
                ("abc", "string"),
                (Unicode.Arabic, "Arabic letter"))[2];
Esempio n. 6
0
 [Fact] public void ParseAnyChar() => AnyChar.ParseString("x").ShouldBe('x');