private bool HandleParenthese(string[] ss, HashSet <int> used, IList <StartEnd> startEnd, Dictionary <StartEnd, IClausable> map, IExpParser <T> parser, IExpClause clause) { for (int i = 0; i < ss.Length; i++) { if (Right.Equals(ss[i]) && !used.Contains(i)) { for (int j = i - 1; j >= 0; j--) { if (Right.Equals(ss[j]) && !used.Contains(j)) { break; } if (Left.Equals(ss[j]) && !used.Contains(j)) { used.Add(i); used.Add(j); StartEnd se = new StartEnd(j, i); IClausable con = ParseNoParenthese(se.GetStrings(ss, Sharpen.Collections.ToArray(startEnd, new StartEnd[] { })), map, parser, clause); map[se] = con; startEnd.Add(se); foreach (StartEnd sub in se.GetChildren(Sharpen.Collections.ToArray(startEnd, new StartEnd[] { }))) { startEnd.Remove(sub); map.Remove(sub); } return(true); } } } } return(false); }
public virtual IClausable Parse(string exp, IExpParser <T> subParser, IExpClause clause) { string[] ss = StringUtil.SplitRemainRex(exp, Sharpen.Collections.ToArray(spliter, new string[] { })); HashSet <int> used = new HashSet <int>(); IList <StartEnd> startEnd = new List <StartEnd>(); Dictionary <StartEnd, IClausable> map = new MyDictionary <StartEnd, IClausable>(); while (true) { bool success = HandleParenthese(ss, used, startEnd, map, subParser, clause); if (!success) { break; } } string[] total = new StartEnd(-1, ss.Length).GetStrings(ss, Sharpen.Collections.ToArray(map.Keys, new StartEnd[] { })); return(ParseNoParenthese(total, map, subParser, clause)); }