public static bool TryParseAll <T>(TokenListParser <ExpressionToken, T> parser, string source, out T value, out string error) { if (source == null) { throw new ArgumentNullException(nameof(source)); } var tokens = ExpressionTokenizer.TryTokenize(source); if (!tokens.HasValue) { value = default; error = tokens.ToString(); return(false); } var result = parser.AtEnd()(tokens.Value); if (!result.HasValue) { value = default; error = result.ToString(); return(false); } value = result.Value; error = null; return(true); }
static void Main() { Console.Write(Prompt); var line = Console.ReadLine(); while (line != null) { if (!string.IsNullOrWhiteSpace(line)) { try { var tokens = ExpressionTokenizer.TryTokenize(line); if (!tokens.HasValue) { WriteSyntaxError(tokens.ToString(), tokens.ErrorPosition); } else if (!ExpressionParser.TryParse(tokens.Value, out var expr, out var error, out var errorPosition)) { WriteSyntaxError(error, errorPosition); } else { var result = ExpressionEvaluator.Evaluate(expr); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine(result); } }
public void ValidResultsAreComputed(string source, string result) { var tokens = ExpressionTokenizer.TryTokenize(source); Assert.True(tokens.HasValue, tokens.ToString()); Assert.True(ExpressionParser.TryParse(tokens.Value, out var expr, out var err), err); var actual = ExpressionEvaluator.Evaluate(expr); Assert.Equal(result, actual.ToString()); }