Пример #1
0
        private List <Segment> GetSegmentsFromString(string text)
        {
            var segs         = new List <Segment>();
            var textSegments = ParserTools.SplitOnUnescaped(text, new string[] { ParserTools.And, ParserTools.Or });

            for (int s = 0; s < textSegments.Count; s++)
            {
                if (textSegments[s] == ParserTools.And || textSegments[s] == ParserTools.Or)
                {
                    continue;
                }
                var seg = new Segment(textSegments[s]);
                if (textSegments.Count - 1 > s)
                {
                    if (textSegments[s + 1] == ParserTools.Or)
                    {
                        seg.WithNext = GroupOperators.OR;
                    }
                    else
                    {
                        seg.WithNext = GroupOperators.AND;
                    }
                }
                else
                {
                    seg.WithNext = GroupOperators.None;
                }
                segs.Add(seg);
            }
            return(segs);
        }
Пример #2
0
        public static List <string> SplitOnUnescaped(string data, string[] values)
        {
            List <string> vals = new List <string>(values);

            vals.Sort((a, b) => - 1 * a.CompareTo(b));
            List <string> splits = new List <string>();

            while (!string.IsNullOrEmpty(data))
            {
                int first       = -1;
                int foundLength = -1;
                foreach (var val in vals)
                {
                    var loc = data.IndexOf(val);
                    if (loc == -1)
                    {
                        continue;
                    }
                    if (ParserTools.NotEscaped(data, loc) && (loc < first || first == -1))
                    {
                        first       = loc;
                        foundLength = val.Length;
                    }
                }
                if (first == -1)
                {
                    splits.Add(data);
                    break;
                }
                if (first != 0)
                {
                    splits.Add(data.Substring(0, first));
                    splits.Add(data.Substring(first, foundLength));
                }
                data = data.Substring(first + foundLength);
            }
            return(splits);
        }
Пример #3
0
        private SegmentParseResult GetSegment(string segment)
        {
            var mySegs       = new List <Segment>();
            int occurences   = 0;
            int start        = -1;
            int end          = -1;
            int lastEndMatch = -1;

            for (int i = 0; i < segment.Length; i++)
            {
                if (segment[i] == '(' && ParserTools.NotEscaped(segment, i))
                {
                    occurences += 1;
                    if (start == -1)
                    {
                        start = i;
                        if (start > 0 && start - lastEndMatch > 1)
                        {
                            var text    = segment.Substring(lastEndMatch + 1, start - lastEndMatch - 1);
                            var newSegs = GetSegmentsFromString(text);
                            var last    = newSegs.Last();
                            if (last.WithNext == GroupOperators.None)
                            {
                                last.WithNext = GetNextOperator(segment, i);
                            }
                            mySegs.AddRange(newSegs);
                        }
                    }
                    continue;
                }
                if (segment[i] == ')' && ParserTools.NotEscaped(segment, i))
                {
                    occurences -= 1;
                    if (occurences == 0)
                    {
                        end          = i;
                        lastEndMatch = i;
                        var seg = GetSegment(segment.Substring(start + 1, end - start - 1));
                        if (seg.HadError)
                        {
                            return(seg);
                        }
                        else
                        {
                            seg.Segment.WithNext = GetNextOperator(segment, i);
                            mySegs.Add(seg.Segment);
                        }
                        start = -1;
                        end   = -1;
                    }
                }
            }

            //uneven
            if (occurences > 0)
            {
                return(new SegmentParseResult {
                    HadError = true, ErrorReason = ParseErrors.NoEndingParenthesis
                });
            }
            else if (occurences < 0)
            {
                return(new SegmentParseResult {
                    HadError = true, ErrorReason = ParseErrors.NoStartingParenthesis
                });
            }

            //none
            if (start == -1 && end == -1 && mySegs.Count == 0)
            {
                var results = GetSegmentsFromString(segment);
                var result  = new Segment();
                if (results.Count > 1)
                {
                    result.HasSegments = true;
                    result.Segments    = results;
                }
                else
                {
                    result = results.First();
                }
                return(new SegmentParseResult {
                    HadError = false, Segment = result
                });
            }

            //remainder
            if (start == -1 && end == -1 && mySegs.Count > 0 && lastEndMatch < segment.Length - 1)
            {
                mySegs.Add(new Segment {
                    HasSegments = false, Value = segment.Substring(end + 1)
                });
            }

            return(new SegmentParseResult {
                Segment = new Segment {
                    HasSegments = true, Segments = mySegs
                }, HadError = false
            });
        }