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"); }
public void GetRemainder_Test() { var target = new StringCharacterSequence("abc"); target.GetNext().Should().Be('a'); target.GetRemainder().Should().Be("bc"); }
/// <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)); }
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("+!@#"); }
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"); }
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); }
public void GetRemainder_Empty() { var target = new StringCharacterSequence(""); target.GetRemainder().Should().Be(""); }