/// <inheritdoc/> public bool TryParseIngredient( ParserContext context, IEnumerable <Template> templates, out ParseResult parseResult) { var fullMatches = FindFullMatches(context, templates); if (fullMatches.Any()) { var bestMatchMetadata = _bestMatchHeuristic.Invoke(fullMatches); parseResult = new ParseResult() { Details = new ParseResult.IngredientDetails(), Metadata = bestMatchMetadata }; var tokenVisitor = new ParserTokenVisitor(parseResult); foreach (var token in parseResult.Metadata.Tokens) { token.Accept(tokenVisitor); } return(true); } parseResult = null; return(false); }
private void VisitTokens(ParseResult parseResult) { var tokenVisitor = new ParserTokenVisitor(parseResult); foreach (var token in parseResult.Metadata.Tokens) { token.Accept(tokenVisitor); } }
/// <inheritdoc/> public bool TryParseIngredient( ParserContext context, IEnumerable <Template> templates, out ParseResult parseResult) { foreach (var template in templates) { context.Buffer.Reset(); var result = template.TryReadTokens(context, out var tokens); switch (result) { case TemplateMatchResult.NoMatch: case TemplateMatchResult.PartialMatch: // Always skip non-matches or partial matches. continue; case TemplateMatchResult.FullMatch: // Stop on the first full match parseResult = new ParseResult() { Details = new ParseResult.IngredientDetails(), Metadata = new ParseResult.ParseMetadata() { Template = template, MatchResult = TemplateMatchResult.FullMatch, Tokens = tokens.ToList() } }; var tokenVisitor = new ParserTokenVisitor(parseResult); foreach (var token in parseResult.Metadata.Tokens) { token.Accept(tokenVisitor); } return(true); default: throw new ArgumentOutOfRangeException( $"Encountered unknown template match result: {result}"); } } parseResult = null; return(false); }
/// <inheritdoc/> public override void Accept(ParserTokenVisitor parserTokenVisitor) { parserTokenVisitor.Visit(this); }