public static DCInsideArchiveQueryNode[] to_linear(DCInsideArchiveQueryNode query) { var querys = new DCInsideArchiveQueryNode[65535]; var stack = new Stack <DCInsideArchiveQueryNode>(); var pos = new Stack <int>(); var max = 1; stack.Push(query); pos.Push(1); while (stack.Count > 0) { var pop = stack.Pop(); var ps = pos.Pop(); max = Math.Max(max, ps); querys[ps] = pop; if (pop.left_query != null) { stack.Push(pop.left_query); pos.Push(ps * 2); } if (pop.right_query != null) { stack.Push(pop.right_query); pos.Push(ps * 2 + 1); } } return(querys.Take(max + 1).ToArray()); }
public static DCInsideArchiveQueryNode make_tree(string query_string) { var stack = new Stack <DCInsideArchiveQueryNode>(); var postfix = to_postfix(query_string); while (postfix.Count > 0) { string token = postfix.Pop(); switch (token[0]) { case '(': break; case '-': { var s1 = stack.Pop(); var s2 = stack.Pop(); stack.Push(new DCInsideArchiveQueryNode { combination = DCInsideArchiveQueryCombinationOption.Difference, left_query = s2, right_query = s1, is_operator = true }); } break; case '|': { var s1 = stack.Pop(); var s2 = stack.Pop(); stack.Push(new DCInsideArchiveQueryNode { combination = DCInsideArchiveQueryCombinationOption.Combination, left_query = s2, right_query = s1, is_operator = true }); } break; case '&': case '+': { var s1 = stack.Pop(); var s2 = stack.Pop(); stack.Push(new DCInsideArchiveQueryNode { combination = DCInsideArchiveQueryCombinationOption.Default, left_query = s2, right_query = s1, is_operator = true }); } break; case '~': { var s = stack.Pop(); s.option = DCInsideArchiveQueryTokenOption.Complement; stack.Push(s); } break; default: var query_node = new DCInsideArchiveQueryNode { token = token, token_type = DCInsideArchiveQueryTokenType.Common, is_operator = false }; if (token.Contains('[')) { if (token_dic.ContainsKey(token.Split('[')[0])) { query_node.token_type = token_dic[token.Split('[')[0]]; } else { query_node.token_type = DCInsideArchiveQueryTokenType.None; } query_node.token = token.Split('[')[1].TrimEnd(']'); } stack.Push(query_node); break; } } return(stack.Pop()); }