/// <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);
            }
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
 /// <inheritdoc/>
 public override void Accept(ParserTokenVisitor parserTokenVisitor)
 {
     parserTokenVisitor.Visit(this);
 }