public void MaybeStackItemTest() { var stack = new MaybeStack <string>(); stack.Push("alpha"); stack.Push("bravo"); stack.Push("charlie"); if (stack.Item(0).If(out var item, out var exception)) { Console.WriteLine(item); } else { Console.WriteLine(exception.Message); } if (stack.Item(-1).If(out item, out exception)) { Console.WriteLine(item); } else { Console.WriteLine(exception.Message); } }
public Matched <Scraper> Push(Pattern pattern) { if (pattern.MatchedBy(source.Current).If(out var result, out var _exception)) { var scraper = new Scraper(source.Current.Keep(result.Length)); source.Advance(result.Length); scraperStack.Push(this); return(scraper.Match()); } else if (_exception.If(out var exception)) { return(failedMatch <Scraper>(exception)); } else { return(noMatch <Scraper>()); } }
public Result <Configuration> Parse() { var rootGroup = new Group("_$root"); var stack = new MaybeStack <IConfigurationItem>(); stack.Push(rootGroup); Maybe <Group> peekGroup() { return (from parentItem in stack.Peek() from parentGroup in parentItem.IfCast <Group>() select parentGroup); } Maybe <Group> popGroup() { return (from parentItem in stack.Pop() from parentGroup in parentItem.IfCast <Group>() select parentGroup); } Result <(string newSource, string str)> getString(string source) { if (source.Matches("^ /s* /[quote]; f").If(out var result)) { var quote = result.FirstGroup[0]; return(getQuotedString(source.Drop(result.Length), quote)); } else if (source.Matches("^ /s* /(-[/r /n]*) ('/r/n')?; f").If(out result)) { var foundReturn = false; var builder = new StringBuilder(); for (var i = 0; i < source.Length; i++) { var current = source[i]; switch (current) { case ';': return((source.Drop(i + 1), builder.ToString()).Success()); case ']' or '#': return((source.Drop(i), builder.ToString()).Success()); case '\r' or '\n': foundReturn = true; break; default: if (foundReturn) { return((source.Drop(i - 1), builder.ToString()).Success()); } else { builder.Append(current); } break; } } return((string.Empty, builder.ToString()).Success()); } else { return("Couldn't determine string".Failure <(string, string)>()); } }
public override bool Evaluate(string input) { index = State.Position; var current = input.Skip(index); if (!current.IsMatch("['()[]{}']")) { length = current.Length; return(true); } if (!current.IsMatch("^ ['([{']")) { return(false); } var stack = new MaybeStack <char>(); for (var i = index; i < input.Length; i++) { var currentChar = input[i]; switch (currentChar) { case '(': stack.Push(')'); break; case '{': stack.Push('}'); break; case '[': stack.Push(']'); break; case ')': case '}': case ']': var previous = stack.Pop(); if (previous.IsSome) { if (previous.Value != currentChar) { return(false); } if (stack.Count == 0) { length = i - index + 1; return(true); } } else { return(false); } break; } } if (stack.Count > 0) { return(false); } length = current.Length; return(true); }