コード例 #1
0
        public SearchNodeList Parse()
        {
            var ret = new SearchNodeList();

            if (!(this.Source == ""))
            {
                string[]     parts      = this.Source.Split('/');
                const string NO_INDEX   = @"^(\*|[a-z]+)$";
                const string WITH_INDEX = @"^(\*|[a-z]+)\[[0-9]+\]$";
                const string WITH_NAME  = @"^(\*|[a-z]+)\[.+\]$";
                foreach (var part in parts)
                {
                    if (Regex.IsMatch(part, NO_INDEX))
                    {
                        ret.Add(new SearchNode(this.KeywordToEnum(part)));
                    }
                    else if (Regex.IsMatch(part, WITH_INDEX))
                    {
                        var _open        = part.IndexOf('[');
                        var _close       = part.IndexOf(']');
                        var index_string = part.Substring(_open + 1, _close - (_open + 1)).Trim();
                        var index        = int.Parse(index_string);
                        ret.Add(new SearchNode(this.KeywordToEnum(part.Substring(0, _open)), index));
                    }
                    else if (Regex.IsMatch(part, WITH_NAME))
                    {
                        var _open  = part.IndexOf('[');
                        var _close = part.IndexOf(']');
                        var name   = part.Substring(_open + 1, _close - (_open + 1)).Trim();
                        ret.Add(new SearchNode(this.KeywordToEnum(part.Substring(0, _open)), name));
                    }
                    else
                    {
                        throw new Exception("Query expression contains errors.");
                    }
                }
            }
            return(ret);
        }
コード例 #2
0
 public Node GetChild(params SearchNode[] parsed_search_expression)
 {
     if (parsed_search_expression.Length == 0)
     {
         return(null);
     }
     else if (parsed_search_expression.Length == 1)
     {
         return(this.GetNodeByType(parsed_search_expression[0]));
     }
     else
     {
         var rest_parts = new SearchNodeList();
         rest_parts.AddRange(parsed_search_expression);
         var first_part = rest_parts[0];
         rest_parts.RemoveAt(0);
         var first_result = this.GetNodeByType(first_part);
         if (first_result == null)
         {
             return(null);
         }
         return(first_result.GetChild(rest_parts.ToArray()));
     }
 }