public IExpression?Parse(InputReader input) { if (input.NextIs(_beginSymbol)) { input.Next(); var expression = Start.Parse(input); if (!input.NextIs(_endSymbol)) { throw new BadInputFormat(input.Text, input.Index); } input.Next(); return(_expressionFactory.Invoke(expression)); } return(_next.Parse(input)); }
internal static string TakeIf(this InputReader input, params char[] anyOf) { input.SkipWhiteSpace(); if (input.NextIs(anyOf)) { return(input.Next().ToString()); } return(""); }
private static string ReadFractionalPart(InputReader input) { var token = ""; if (input.NextIs('.')) { token += input.TakeIf('.'); token += input.TakeWhile(char.IsDigit); } return(token); }
public IExpression?Parse(InputReader input) { var left = ParseNextExpression(input); while (input.NextIs(_supportedOperators.Keys.ToArray())) { var symbol = input.Next(); var right = ParseNextExpression(input); left = _supportedOperators[symbol]?.Invoke(left, right); } return(left); }