private static void DisplayToken(IToken token) { var score = TokenWeightResolver.Invoke(token); var tokenInfo = $"{token.GetType().Name}"; var valueInfo = "[value = {0}]"; var scoreInfo = $"[score = {score}]"; valueInfo = token switch { LiteralToken literalToken => string.Format(valueInfo, $"'{literalToken.Value}'"), LiteralAmountToken literalAmountToken => string.Format(valueInfo, literalAmountToken.Amount), FractionalAmountToken fractionalAmountToken => string.Format(valueInfo, GetRepresentation(fractionalAmountToken)), RangeAmountToken rangeAmountToken => string.Format(valueInfo, GetRepresentation(rangeAmountToken)), UnitToken unitToken => string.Format(valueInfo, unitToken.Unit), FormToken formToken => string.Format(valueInfo, formToken.Form), IngredientToken ingredientToken => string.Format(valueInfo, ingredientToken.Ingredient), _ => string.Empty }; var output = $"-> {tokenInfo}\n\t{valueInfo}\n\t{scoreInfo}"; Console.WriteLine(output); }
/// <summary> /// Visits a <see cref="RangeAmountToken"/>. /// </summary> /// <param name="token">A <see cref="RangeAmountToken"/> instance.</param> public void Visit(RangeAmountToken token) { // A range token has two nested tokens, so we visit the first and store // the value before visiting the second. This allows us to combine the two values. token.LowerBound.Accept(this); var lowerBoundAmount = _parseResult.Details.Amount; token.UpperBound.Accept(this); _parseResult.Details.Amount = $"{lowerBoundAmount}-{_parseResult.Details.Amount}"; }
private static string GetRepresentation(RangeAmountToken range) { return((range.LowerBound, range.UpperBound) switch { (LiteralAmountToken lowerBound, LiteralAmountToken upperBound) => $"{lowerBound.Amount}-{upperBound.Amount}", (FractionalAmountToken lowerBound, FractionalAmountToken upperBound) => $"{GetRepresentation(lowerBound)}-{GetRepresentation(upperBound)}", _ => throw new InvalidOperationException($"Unexpected range lower bound token type: {range.LowerBound.Type}") });
private bool Range(InputBuffer buffer, out RangeAmountToken range) => ExecuteRules(GetRangeRules, buffer, out range);