예제 #1
0
        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));
        }
예제 #2
0
        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);
        }