コード例 #1
0
        private static ArrayRule ParseRule(SafeReader reader, int min, int max)
        {
            var values = new bool[max + 1];

            if (ParseListItem(reader, min, max, values))
            {
                for (; reader.MoveNextIf(',') && ParseListItem(reader, min, max, values);)
                {
                    ;
                }
            }

            return(new ArrayRule(values));
        }
コード例 #2
0
        private static bool WhiteSpaceAtLeastOnce(SafeReader s)
        {
            if (s.IsEmpty)
            {
                return(false);
            }

            var retval = false;

            while (s.MoveNextIf(' '))
            {
                retval = true;
            }

            return(retval);
        }
コード例 #3
0
        private static NaiveRule ParseRule(SafeReader reader, int min, int max)
        {
            var values = new HashSet <int>();

            if (ParseListItem(reader, min, max, values))
            {
                for (; reader.MoveNextIf(',') && ParseListItem(reader, min, max, values);)
                {
                    ;
                }

                //while (true)
                //{
                //	if (!reader.MoveNextIf(',')) break;
                //	if (!ParseListItem(reader, min, max, values))
                //		throw new ArgumentException("Invalid input: " + reader);
                //}
            }

            return(new NaiveRule(values));
        }
コード例 #4
0
        private static bool ParseListItem(SafeReader reader, int min, int max, HashSet <int> values)
        {
            // ?
            // *[/step]
            // from[-to][/step]
            int start, stop = -1, step;


            // ? does not support steps
            if (reader.MoveNextIf('?'))
            {
                AddRange(values, min, max, 1);
                return(true);
            }

            // *
            if (reader.MoveNextIf('*'))
            {
                start = min;
                stop  = max;
            }
            else
            {
                // min[-max]
                if (!TryReadInt(reader, out start) ||
                    start < min ||
                    start > max)
                {
                    return(false);
                }

                // [-max]
                if (reader.MoveNextIf('-'))
                {
                    if (!TryReadInt(reader, out stop) ||
                        stop > max ||
                        stop < start)
                    {
                        // syntax error
                        return(false);
                    }
                }
            }

            if (reader.MoveNextIf('/'))
            {
                if (!TryReadInt(reader, out step))
                {
                    // syntax error
                    return(false);
                }

                if (stop == -1)
                {
                    stop = max;
                }
            }
            else
            {
                // short-circuit for simple scalar
                if (stop == -1)
                {
                    values.Add(start);
                    return(true);
                }

                step = 1;
            }

            AddRange(values, start, stop, step);

            return(true);
        }