コード例 #1
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        public static ParsnipDefinition Parse(String input, IParsnipRuleFactory factory)
        {
            var states = new PackratState[input.Length + 1];

            Enumerable.Range(0, input.Length + 1).ToList().ForEach(i => states[i] = new PackratState());
            var result = ParseRule_Definition(input, 0, states, factory);

            return(result?.Node);
        }
コード例 #2
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Selection: rule | comment | TOKENID | (`<EOL>)
        private static ParseResult <IParsnipDefinitionItem> ParseRule_DefinitionItem(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            if (states[inputPosition].Mem_ParseRule_DefinitionItem is var mem && mem != null)
            {
                return(mem);
            }

            var r1 = ParseRule_Rule(input, inputPosition, states, factory);

            if (r1 != null)
            {
                return(states[inputPosition].Mem_ParseRule_DefinitionItem = new ParseResult <IParsnipDefinitionItem>(factory.DefinitionItem1(r1.Node), r1.Advanced));
            }
            var r2 = ParseRule_Comment(input, inputPosition, states, factory);

            if (r2 != null)
            {
                return(states[inputPosition].Mem_ParseRule_DefinitionItem = new ParseResult <IParsnipDefinitionItem>(factory.DefinitionItem2(r2.Node), r2.Advanced));
            }
            var r3 = ParseCustomLexeme(input, inputPosition, factory.TOKENID);

            if (r3 != null)
            {
                return(states[inputPosition].Mem_ParseRule_DefinitionItem = new ParseResult <IParsnipDefinitionItem>(factory.DefinitionItem3(r3.Node), r3.Advanced));
            }
            var r4 = ParseRule_DefinitionItem_C4(input, inputPosition, states, factory);

            if (r4 != null)
            {
                return(states[inputPosition].Mem_ParseRule_DefinitionItem = new ParseResult <IParsnipDefinitionItem>(factory.DefinitionItem4(), r4.Advanced));
            }
            return(null);
        }
コード例 #3
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Sequence: ~<EOLOS> .
        private static ParseResult <String> ParseRule_ClassIdentifier_M(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            var r1 = ParseIntrinsic_EndOfLineOrStream(input, inputPosition);

            if (r1 != null)
            {
                return(null);
            }
            var r2 = ParseIntrinsic_AnyCharacter(input, inputPosition);

            if (r2 == null)
            {
                return(null);
            }
            return(new ParseResult <String>(r2.Node, r2.Advanced));
        }
コード例 #4
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Selection: <Aa#> | "-"
        private static ParseResult <String> ParseRule_RuleIdentifier_S2_M(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            var r1 = ParseIntrinsic_AnyLetterOrDigit(input, inputPosition);

            if (r1 != null)
            {
                return(new ParseResult <String>(r1.Node, r1.Advanced));
            }
            var r2 = ParseLexeme(input, inputPosition, "-", StringComparison.Ordinal);

            if (r2 != null)
            {
                return(new ParseResult <String>(r2.Node, r2.Advanced));
            }
            return(null);
        }
コード例 #5
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Sequence: `"(" union `")"
        private static ParseResult <Union> ParseRule_Token_C6(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            var r1 = ParseLexeme(input, inputPosition, "(", StringComparison.Ordinal);

            if (r1 == null)
            {
                return(null);
            }
            var r2 = ParseRule_Union(input, inputPosition + r1.Advanced, states, factory);

            if (r2 == null)
            {
                return(null);
            }
            var r3 = ParseLexeme(input, inputPosition + r1.Advanced + r2.Advanced, ")", StringComparison.Ordinal);

            if (r3 == null)
            {
                return(null);
            }
            return(new ParseResult <Union>(r2.Node, r1.Advanced + r2.Advanced + r3.Advanced));
        }
コード例 #6
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Sequence: `"."
        private static ParseResult <EmptyNode> ParseRule_Token_C1(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            var r1 = ParseLexeme(input, inputPosition, ".", StringComparison.Ordinal);

            if (r1 == null)
            {
                return(null);
            }
            return(new ParseResult <EmptyNode>(EmptyNode.Instance, r1.Advanced));
        }
コード例 #7
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Selection: (`".") | (<CSTRING> "i"?) | rule-identifier | TOKENID | "--" | (`"(" union `")")
        private static ParseResult <IToken> ParseRule_Token(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            if (states[inputPosition].Mem_ParseRule_Token is var mem && mem != null)
            {
                return(mem);
            }

            var r1 = ParseRule_Token_C1(input, inputPosition, states, factory);

            if (r1 != null)
            {
                return(states[inputPosition].Mem_ParseRule_Token = new ParseResult <IToken>(factory.Token1(), r1.Advanced));
            }
            var r2 = ParseRule_Token_C2(input, inputPosition, states, factory);

            if (r2 != null)
            {
                return(states[inputPosition].Mem_ParseRule_Token = new ParseResult <IToken>(factory.Token2(r2.Node.Item1, r2.Node.Item2), r2.Advanced));
            }
            var r3 = ParseRule_RuleIdentifier(input, inputPosition, states, factory);

            if (r3 != null)
            {
                return(states[inputPosition].Mem_ParseRule_Token = new ParseResult <IToken>(factory.Token3(r3.Node), r3.Advanced));
            }
            var r4 = ParseCustomLexeme(input, inputPosition, factory.TOKENID);

            if (r4 != null)
            {
                return(states[inputPosition].Mem_ParseRule_Token = new ParseResult <IToken>(factory.Token4(r4.Node), r4.Advanced));
            }
            var r5 = ParseLexeme(input, inputPosition, "--", StringComparison.Ordinal);

            if (r5 != null)
            {
                return(states[inputPosition].Mem_ParseRule_Token = new ParseResult <IToken>(factory.Token5(r5.Node), r5.Advanced));
            }
            var r6 = ParseRule_Token_C6(input, inputPosition, states, factory);

            if (r6 != null)
            {
                return(states[inputPosition].Mem_ParseRule_Token = new ParseResult <IToken>(factory.Token6(r6.Node), r6.Advanced));
            }
            return(null);
        }
コード例 #8
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Sequence: token ("+" | "?" | "*")?
        private static ParseResult <TokenCardinality> ParseRule_Cardinality(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            if (states[inputPosition].Mem_ParseRule_Cardinality is var mem && mem != null)
            {
                return(mem);
            }

            var r1 = ParseRule_Token(input, inputPosition, states, factory);

            if (r1 == null)
            {
                return(null);
            }
            var r2 = ParseMaybe(input, inputPosition + r1.Advanced, states, factory, (i, p, s, f) => ParseRule_Cardinality_S2_M(i, p, s, f));

            if (r2 == null)
            {
                return(null);
            }
            return(states[inputPosition].Mem_ParseRule_Cardinality = new ParseResult <TokenCardinality>(factory.Cardinality1(r1.Node, r2.Node), r1.Advanced + r2.Advanced));
        }
コード例 #9
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Sequence: rule-identifier `-- `":"
        private static ParseResult <RuleHeadPrefix> ParseRule_RuleHeadPrefix(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            if (states[inputPosition].Mem_ParseRule_RuleHeadPrefix is var mem && mem != null)
            {
                return(mem);
            }

            var r1 = ParseRule_RuleIdentifier(input, inputPosition, states, factory);

            if (r1 == null)
            {
                return(null);
            }
            var r2 = ParseIntrinsic_OptionalHorizontalWhitespace(input, inputPosition + r1.Advanced);

            if (r2 == null)
            {
                return(null);
            }
            var r3 = ParseLexeme(input, inputPosition + r1.Advanced + r2.Advanced, ":", StringComparison.Ordinal);

            if (r3 == null)
            {
                return(null);
            }
            return(states[inputPosition].Mem_ParseRule_RuleHeadPrefix = new ParseResult <RuleHeadPrefix>(factory.RuleHeadPrefix1(r1.Node), r1.Advanced + r2.Advanced + r3.Advanced));
        }
コード例 #10
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Sequence: rule-head-prefix `-- `<EOL>
        private static ParseResult <RuleHeadPrefix> ParseRule_RuleHead_C2(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            var r1 = ParseRule_RuleHeadPrefix(input, inputPosition, states, factory);

            if (r1 == null)
            {
                return(null);
            }
            var r2 = ParseIntrinsic_OptionalHorizontalWhitespace(input, inputPosition + r1.Advanced);

            if (r2 == null)
            {
                return(null);
            }
            var r3 = ParseIntrinsic_EndOfLine(input, inputPosition + r1.Advanced + r2.Advanced);

            if (r3 == null)
            {
                return(null);
            }
            return(new ParseResult <RuleHeadPrefix>(r1.Node, r1.Advanced + r2.Advanced + r3.Advanced));
        }
コード例 #11
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Sequence: rule-head-prefix `-- class-identifier `-- `<EOL>
        private static ParseResult <(RuleHeadPrefix, ClassIdentifier)> ParseRule_RuleHead_C1(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            var r1 = ParseRule_RuleHeadPrefix(input, inputPosition, states, factory);

            if (r1 == null)
            {
                return(null);
            }
            var r2 = ParseIntrinsic_OptionalHorizontalWhitespace(input, inputPosition + r1.Advanced);

            if (r2 == null)
            {
                return(null);
            }
            var r3 = ParseRule_ClassIdentifier(input, inputPosition + r1.Advanced + r2.Advanced, states, factory);

            if (r3 == null)
            {
                return(null);
            }
            var r4 = ParseIntrinsic_OptionalHorizontalWhitespace(input, inputPosition + r1.Advanced + r2.Advanced + r3.Advanced);

            if (r4 == null)
            {
                return(null);
            }
            var r5 = ParseIntrinsic_EndOfLine(input, inputPosition + r1.Advanced + r2.Advanced + r3.Advanced + r4.Advanced);

            if (r5 == null)
            {
                return(null);
            }
            return(new ParseResult <(RuleHeadPrefix, ClassIdentifier)>((r1.Node, r3.Node), r1.Advanced + r2.Advanced + r3.Advanced + r4.Advanced + r5.Advanced));
        }
コード例 #12
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Selection: (rule-head-prefix `-- class-identifier `-- `<EOL>) | (rule-head-prefix `-- `<EOL>)
        private static ParseResult <RuleHead> ParseRule_RuleHead(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            if (states[inputPosition].Mem_ParseRule_RuleHead is var mem && mem != null)
            {
                return(mem);
            }

            var r1 = ParseRule_RuleHead_C1(input, inputPosition, states, factory);

            if (r1 != null)
            {
                return(states[inputPosition].Mem_ParseRule_RuleHead = new ParseResult <RuleHead>(factory.RuleHead1(r1.Node.Item1, r1.Node.Item2), r1.Advanced));
            }
            var r2 = ParseRule_RuleHead_C2(input, inputPosition, states, factory);

            if (r2 != null)
            {
                return(states[inputPosition].Mem_ParseRule_RuleHead = new ParseResult <RuleHead>(factory.RuleHead2(r2.Node), r2.Advanced));
            }
            return(null);
        }
コード例 #13
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Sequence: rule-head rule-body
        private static ParseResult <Rule> ParseRule_Rule(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            if (states[inputPosition].Mem_ParseRule_Rule is var mem && mem != null)
            {
                return(mem);
            }

            var r1 = ParseRule_RuleHead(input, inputPosition, states, factory);

            if (r1 == null)
            {
                return(null);
            }
            var r2 = ParseRule_RuleBody(input, inputPosition + r1.Advanced, states, factory);

            if (r2 == null)
            {
                return(null);
            }
            return(states[inputPosition].Mem_ParseRule_Rule = new ParseResult <Rule>(factory.Rule1(r1.Node, r2.Node), r1.Advanced + r2.Advanced));
        }
コード例 #14
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Sequence: `<EOL>
        private static ParseResult <EmptyNode> ParseRule_DefinitionItem_C4(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            var r1 = ParseIntrinsic_EndOfLine(input, inputPosition);

            if (r1 == null)
            {
                return(null);
            }
            return(new ParseResult <EmptyNode>(EmptyNode.Instance, r1.Advanced));
        }
コード例 #15
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Sequence: token `"/" token
        private static ParseResult <(IToken, IToken)> ParseRule_Special_C1(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            var r1 = ParseRule_Token(input, inputPosition, states, factory);

            if (r1 == null)
            {
                return(null);
            }
            var r2 = ParseLexeme(input, inputPosition + r1.Advanced, "/", StringComparison.Ordinal);

            if (r2 == null)
            {
                return(null);
            }
            var r3 = ParseRule_Token(input, inputPosition + r1.Advanced + r2.Advanced, states, factory);

            if (r3 == null)
            {
                return(null);
            }
            return(new ParseResult <(IToken, IToken)>((r1.Node, r3.Node), r1.Advanced + r2.Advanced + r3.Advanced));
        }
コード例 #16
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        private static ParseResult <T> ParseMaybe <T>(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory, Func <String, Int32, PackratState[], IParsnipRuleFactory, ParseResult <T> > parseAction)
        {
            var result = parseAction(input, inputPosition, states, factory);

            if (result != null)
            {
                return(result);
            }
            return(new ParseResult <T>(default(T), 0));
        }
コード例 #17
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Repetition: choice+
        private static ParseResult <RuleBody> ParseRule_RuleBody(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            if (states[inputPosition].Mem_ParseRule_RuleBody is var mem && mem != null)
            {
                return(mem);
            }

            var result = ParsePlus(input, inputPosition, states, factory, (i, p, s, f) => ParseRule_Choice(i, p, s, f));

            if (result == null)
            {
                return(null);
            }
            return(states[inputPosition].Mem_ParseRule_RuleBody = new ParseResult <RuleBody>(factory.RuleBody1(result.Node), result.Advanced));
        }
コード例 #18
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Selection: "+" | "?" | "*"
        private static ParseResult <String> ParseRule_Cardinality_S2_M(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            var r1 = ParseLexeme(input, inputPosition, "+", StringComparison.Ordinal);

            if (r1 != null)
            {
                return(new ParseResult <String>(r1.Node, r1.Advanced));
            }
            var r2 = ParseLexeme(input, inputPosition, "?", StringComparison.Ordinal);

            if (r2 != null)
            {
                return(new ParseResult <String>(r2.Node, r2.Advanced));
            }
            var r3 = ParseLexeme(input, inputPosition, "*", StringComparison.Ordinal);

            if (r3 != null)
            {
                return(new ParseResult <String>(r3.Node, r3.Advanced));
            }
            return(null);
        }
コード例 #19
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Sequence: union `-- `<EOLOS>
        private static ParseResult <Choice> ParseRule_Choice(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            if (states[inputPosition].Mem_ParseRule_Choice is var mem && mem != null)
            {
                return(mem);
            }

            var r1 = ParseRule_Union(input, inputPosition, states, factory);

            if (r1 == null)
            {
                return(null);
            }
            var r2 = ParseIntrinsic_OptionalHorizontalWhitespace(input, inputPosition + r1.Advanced);

            if (r2 == null)
            {
                return(null);
            }
            var r3 = ParseIntrinsic_EndOfLineOrStream(input, inputPosition + r1.Advanced + r2.Advanced);

            if (r3 == null)
            {
                return(null);
            }
            return(states[inputPosition].Mem_ParseRule_Choice = new ParseResult <Choice>(factory.Choice1(r1.Node), r1.Advanced + r2.Advanced + r3.Advanced));
        }
コード例 #20
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        private static ParseResult <IReadOnlyList <T> > ParseStar <T>(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory, Func <String, Int32, PackratState[], IParsnipRuleFactory, ParseResult <T> > parseAction)
        {
            var list = new List <T>();
            var nextResultInputPosition = inputPosition;

            while (true)
            {
                var nextResult = parseAction(input, nextResultInputPosition, states, factory);
                if (nextResult == null)
                {
                    break;
                }
                list.Add(nextResult.Node);
                var advanced = nextResult.Advanced;
                if (advanced == 0)
                {
                    break;
                }
                nextResultInputPosition = nextResultInputPosition + advanced;
            }
            return(new ParseResult <IReadOnlyList <T> >(list, nextResultInputPosition - inputPosition));
        }
コード例 #21
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Series: sequence/(-- "|" --)
        private static ParseResult <Union> ParseRule_Union(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            if (states[inputPosition].Mem_ParseRule_Union is var mem && mem != null)
            {
                return(mem);
            }

            var result = ParseSeries(input, inputPosition, states, factory, (i, p, s, f) => ParseRule_Sequence(i, p, s, f), (i, p, s, f) => ParseRule_Union_D(i, p, s, f));

            if (result == null)
            {
                return(null);
            }
            return(states[inputPosition].Mem_ParseRule_Union = new ParseResult <Union>(factory.Union1(result.Node), result.Advanced));
        }
コード例 #22
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Sequence: <CSTRING> "i"?
        private static ParseResult <(String, String)> ParseRule_Token_C2(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            var r1 = ParseIntrinsic_CString(input, inputPosition);

            if (r1 == null)
            {
                return(null);
            }
            var r2 = ParseMaybe(input, inputPosition + r1.Advanced, states, factory, (i, p, s, f) => ParseLexeme(i, p, "i", StringComparison.Ordinal));

            if (r2 == null)
            {
                return(null);
            }
            return(new ParseResult <(String, String)>((r1.Node, r2.Node), r1.Advanced + r2.Advanced));
        }
コード例 #23
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Sequence: -- "|" --
        private static ParseResult <(String, String, String)> ParseRule_Union_D(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            var r1 = ParseIntrinsic_OptionalHorizontalWhitespace(input, inputPosition);

            if (r1 == null)
            {
                return(null);
            }
            var r2 = ParseLexeme(input, inputPosition + r1.Advanced, "|", StringComparison.Ordinal);

            if (r2 == null)
            {
                return(null);
            }
            var r3 = ParseIntrinsic_OptionalHorizontalWhitespace(input, inputPosition + r1.Advanced + r2.Advanced);

            if (r3 == null)
            {
                return(null);
            }
            return(new ParseResult <(String, String, String)>((r1.Node, r2.Node, r3.Node), r1.Advanced + r2.Advanced + r3.Advanced));
        }
コード例 #24
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Sequence: <Aa> (<Aa#> | "-")*
        private static ParseResult <RuleIdentifier> ParseRule_RuleIdentifier(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            if (states[inputPosition].Mem_ParseRule_RuleIdentifier is var mem && mem != null)
            {
                return(mem);
            }

            var r1 = ParseIntrinsic_AnyLetter(input, inputPosition);

            if (r1 == null)
            {
                return(null);
            }
            var r2 = ParseStar(input, inputPosition + r1.Advanced, states, factory, (i, p, s, f) => ParseRule_RuleIdentifier_S2_M(i, p, s, f));

            if (r2 == null)
            {
                return(null);
            }
            return(states[inputPosition].Mem_ParseRule_RuleIdentifier = new ParseResult <RuleIdentifier>(factory.RuleIdentifier1(r1.Node, r2.Node), r1.Advanced + r2.Advanced));
        }
コード例 #25
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Series: special/--
        private static ParseResult <Sequence> ParseRule_Sequence(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            if (states[inputPosition].Mem_ParseRule_Sequence is var mem && mem != null)
            {
                return(mem);
            }

            var result = ParseSeries(input, inputPosition, states, factory, (i, p, s, f) => ParseRule_Special(i, p, s, f), (i, p, s, f) => ParseIntrinsic_OptionalHorizontalWhitespace(i, p));

            if (result == null)
            {
                return(null);
            }
            return(states[inputPosition].Mem_ParseRule_Sequence = new ParseResult <Sequence>(factory.Sequence1(result.Node), result.Advanced));
        }
コード例 #26
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Repetition: (~<EOLOS> .)+
        private static ParseResult <ClassIdentifier> ParseRule_ClassIdentifier(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            if (states[inputPosition].Mem_ParseRule_ClassIdentifier is var mem && mem != null)
            {
                return(mem);
            }

            var result = ParsePlus(input, inputPosition, states, factory, (i, p, s, f) => ParseRule_ClassIdentifier_M(i, p, s, f));

            if (result == null)
            {
                return(null);
            }
            return(states[inputPosition].Mem_ParseRule_ClassIdentifier = new ParseResult <ClassIdentifier>(factory.ClassIdentifier1(result.Node), result.Advanced));
        }
コード例 #27
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Selection: (token `"/" token) | segment
        private static ParseResult <Segment> ParseRule_Special(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            if (states[inputPosition].Mem_ParseRule_Special is var mem && mem != null)
            {
                return(mem);
            }

            var r1 = ParseRule_Special_C1(input, inputPosition, states, factory);

            if (r1 != null)
            {
                return(states[inputPosition].Mem_ParseRule_Special = new ParseResult <Segment>(factory.Special1(r1.Node.Item1, r1.Node.Item2), r1.Advanced));
            }
            var r2 = ParseRule_Segment(input, inputPosition, states, factory);

            if (r2 != null)
            {
                return(states[inputPosition].Mem_ParseRule_Special = new ParseResult <Segment>(factory.Special2(r2.Node), r2.Advanced));
            }
            return(null);
        }
コード例 #28
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        // Sequence: `"//" (~<EOLOS> .)* `<EOLOS>
        private static ParseResult <String> ParseRule_Comment(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory)
        {
            if (states[inputPosition].Mem_ParseRule_Comment is var mem && mem != null)
            {
                return(mem);
            }

            var r1 = ParseLexeme(input, inputPosition, "//", StringComparison.Ordinal);

            if (r1 == null)
            {
                return(null);
            }
            var r2 = ParseStar(input, inputPosition + r1.Advanced, states, factory, (i, p, s, f) => ParseRule_Comment_S2_M(i, p, s, f));

            if (r2 == null)
            {
                return(null);
            }
            var r3 = ParseIntrinsic_EndOfLineOrStream(input, inputPosition + r1.Advanced + r2.Advanced);

            if (r3 == null)
            {
                return(null);
            }
            return(states[inputPosition].Mem_ParseRule_Comment = new ParseResult <String>(factory.Comment1(r2.Node), r1.Advanced + r2.Advanced + r3.Advanced));
        }
コード例 #29
0
ファイル: Parsnip.cs プロジェクト: JoeGaggler/Parsnip
        private static ParseResult <IReadOnlyList <T> > ParseSeries <T, D>(String input, Int32 inputPosition, PackratState[] states, IParsnipRuleFactory factory, Func <String, Int32, PackratState[], IParsnipRuleFactory, ParseResult <T> > parseAction, Func <String, Int32, PackratState[], IParsnipRuleFactory, ParseResult <D> > parseDelimiterAction)
        {
            var list = new List <T>();
            var nextResultInputPosition = inputPosition;
            var firstResult             = parseAction(input, nextResultInputPosition, states, factory);

            if (firstResult == null)
            {
                return(null);
            }
            nextResultInputPosition += firstResult.Advanced;
            list.Add(firstResult.Node);
            while (true)
            {
                var delimResult = parseDelimiterAction(input, nextResultInputPosition, states, factory);
                if (delimResult == null)
                {
                    break;
                }
                var nextResult = parseAction(input, nextResultInputPosition + delimResult.Advanced, states, factory);
                if (nextResult == null)
                {
                    break;
                }
                list.Add(nextResult.Node);
                nextResultInputPosition = nextResultInputPosition + delimResult.Advanced + nextResult.Advanced;
            }
            return(new ParseResult <IReadOnlyList <T> >(list, nextResultInputPosition - inputPosition));
        }