public void Case1() { var r1 = Separator.Parse("->"); var r2 = Operator.Parse("%"); var r3 = Operator.Parse("="); var r4 = SimpleRule.Parse("Description % allegro -> Z_ALLEGRO"); var r5 = SimpleRules.Parse("Description % allegro -> Z_ALLEGRO\r\nAmount = 100 -> STOWA"); }
private object ParseWithContains(string source, ParsingContext ctx) { object result = new ExpandoObject(); object _this = null; bool overrideThis = false; int startIndex = ctx.Index; for (var i = 0; i < Contains.Length; i++) { var comp = Contains[i]; var itemResult = comp.Parse(source, ctx); if (ctx.Success && comp.IsThis) { overrideThis = true; _this = itemResult; } if (comp.Name != null) { ((IDictionary <string, object>)result)[comp.Name] = itemResult; } if (!ctx.Success) { break; } if (i < Contains.Length - 1) { Separator?.Parse(source, ctx); if (!ctx.Success) { break; } } } if (ctx.Success && overrideThis) { result = _this; } if (!ctx.Success && !Required) { result = Default; ctx.Success = true; ctx.Index = startIndex; } return(result); }
private object[] ParseWithRepeats(string source, ParsingContext ctx) { var result = new List <object>(); int activeIndex = ctx.Index; object failureResult = null; while (result.Count < Max && ctx.Success) { var itemResult = Repeated.Parse(source, ctx); if (ctx.Success) { result.Add(itemResult); activeIndex = ctx.Index; if (Separator != null) { Separator.Parse(source, ctx); if (ctx.Success) { activeIndex = ctx.Index; } } } else { failureResult = itemResult; } } ctx.Success = result.Count >= Min; if (ctx.Success) { ctx.Index = activeIndex; } else if (failureResult != null) { result.Add(failureResult); } return(result.ToArray()); }
/// <summary> /// Attempts to match an input string starting at the given index. /// </summary> /// <param name="input">String to match.</param> /// <param name="index">Index to begin matching at.</param> /// <returns>An <see cref="IParseResult{T}"/> containing the parsed value.</returns> public override IParseResult <IReadOnlyList <TResult> > Parse(string input, int index) { var results = new List <TResult>(); var i = index; var sb = new StringBuilder(); while (results.Count <= MaxRepetitions) { if (Separator != null && results.Count > 0) { var separatorResult = Separator.Parse(input, i); if (!separatorResult.Success) { break; } sb.Append(separatorResult.Text); i += separatorResult.Text.Length; } var result = Parser.Parse(input, i); if (!result.Success) { break; } results.Add(result.Value); sb.Append(result.Text); i += result.Text.Length; } if (results.Count >= MinRepetitions) { return(new ParseSuccess <IReadOnlyList <TResult> >(sb.ToString(), results, index)); } return(new ParseFail <IReadOnlyList <TResult> >( FailureType.Parsing, index, string.Concat("Expected to match ", Parser, " at least ", MinRepetitions, " times. Actually matched ", results.Count, " times"))); }