コード例 #1
0
        public void Parse_Complete_Fail()
        {
            // We should match 'a', Any('b') then when we see 'c' we Complete() and FailRule(). This
            // will cause the entire parser to abort and return "ab" even though Any() should accept
            // 'c'. The parser won't even try it because it's marked complete.
            // Not that this is ordering dependent, because Match('c') is defined before Any() so it
            // is tested first.
            var target = Pratt <string>(c => c
                                        .Add(Match('a'), p => p
                                             .Bind(1, (ctx, x) => x.Value.ToString())
                                             )
                                        .Add(Match('c'), p => p
                                             .BindLeft(1, (ctx, str, x) =>
            {
                ctx.Complete();
                ctx.FailRule();
                return("");
            })
                                             )
                                        .Add(Any(), p => p
                                             .BindLeft(1, (ctx, str, x) =>
            {
                return(str.Value + x.ToString());
            })
                                             )
                                        );

            var input  = new StringCharacterSequence("abcdefg");
            var result = target.Parse(input);

            result.Success.Should().BeTrue();
            result.Value.Should().Be("ab");
            input.GetRemainder().Should().Be("cdefg");
        }
コード例 #2
0
        public void GetRemainder_Test()
        {
            var target = new StringCharacterSequence("abc");

            target.GetNext().Should().Be('a');
            target.GetRemainder().Should().Be("bc");
        }
コード例 #3
0
        /// <summary>
        /// Parse a Command from a line of text using the given parser objects
        /// </summary>
        /// <param name="verbs"></param>
        /// <param name="args"></param>
        /// <param name="line"></param>
        /// <returns></returns>
        public static Command ParseCommand(IParser <char, string> verbs, IParser <char, IParsedArgument> args, string line)
        {
            var sequence = new StringCharacterSequence(line);
            var verb     = verbs.Parse(sequence).Value;
            var rawArgs  = sequence.GetRemainder();
            var argsList = args.List().Parse(sequence).Value.ToList();

            if (!sequence.IsAtEnd)
            {
                var remainder = sequence.GetRemainder();
                throw new ParseException($"Could not parse all arguments. '{remainder}' fails at {sequence.CurrentLocation}");
            }

            var cmdArgs = new ParsedArguments(rawArgs, argsList);

            return(Command.CreateFromParser(verb, cmdArgs, line));
        }
コード例 #4
0
        public void GracefulFail()
        {
            var target = Pratt <string>(c => c
                                        .Add(DigitString())
                                        );
            var input  = new StringCharacterSequence("+!@#");
            var result = target.Parse(input);

            result.Success.Should().BeFalse();
            result.Consumed.Should().Be(0);
            input.GetRemainder().Should().Be("+!@#");
        }
コード例 #5
0
        public void Parse_Complete()
        {
            var target = Pratt <string>(c => c
                                        .Add(Any(), p => p
                                             .Bind(1, (ctx, x) => x.Value.ToString())
                                             .BindLeft(1, (ctx, str, x) =>
            {
                var r = str.Value + x.ToString();
                if (r.Length >= 3)
                {
                    ctx.Complete();
                }
                return(r);
            })
                                             )
                                        );

            var input  = new StringCharacterSequence("abcdefg");
            var result = target.Parse(input);

            result.Success.Should().BeTrue();
            result.Value.Should().Be("abc");
            input.GetRemainder().Should().Be("defg");
        }
コード例 #6
0
        public CommandFormat ParseScript(string script)
        {
            var input       = new StringCharacterSequence(script);
            var parseResult = _scriptParser.Parse(input);

            if (!parseResult.Success)
            {
                throw new ParseException($"Could not parse command format string: '{script}'");
            }
            if (!input.IsAtEnd)
            {
                throw new ParseException($"Parse did not complete for format string '{script}'. Unparsed remainder: '{input.GetRemainder()}'");
            }
            return(parseResult.Value);
        }
コード例 #7
0
        public void GetRemainder_Empty()
        {
            var target = new StringCharacterSequence("");

            target.GetRemainder().Should().Be("");
        }