public RegExpTreeItem Load(String s) { if (s.Length == 0) return null; Char last = s[s.Length - 1]; if (last == ']') { int i = s.Length - 2; while (s[i] != '[' && i > 0) i--; if (s[i] != '[') throw new Exception("No corresponding bracket!"); RegExpTreeItem res = new RegExpTreeItem(); String right = s.Substring(i + 1, s.Length - i - 2); RegExpTreeItem rightitem = Roots.ContainsKey(right) ? Roots[right].Clone().Children[0] : new RegExpTreeItem() { Op = Operation.NONE, Value = right[0] }; if (i == 0) return rightitem; String left = String.Empty; if (s[i - 1] == '|') { res.Op = Operation.OR; left = s.Substring(0, i - 1); } else { left = s.Substring(0, i); res.Op = Operation.AND; } res.Children.Add(Load(left)); res.Children.Add(rightitem); return res; } if (last == ')') { int i = s.Length - 2; int count = 1; while (i > 0 && count != 0) { if (s[i] == ')') count++; if (s[i] == '(') count--; if (count == 0) break; i--; } if (i == 0 && s[i] == '(') count--; if (s[i] != '(' || count != 0) throw new Exception("No corresponding bracket!"); RegExpTreeItem res = new RegExpTreeItem(); String right = s.Substring(i + 1, s.Length - i - 2); if (right == String.Empty) return new RegExpTreeItem() { Op = Operation.LAMBDA }; if (i == 0) return Load(right); String left = String.Empty; if (s[i - 1] == '|') { res.Op = Operation.OR; left = s.Substring(0, i - 1); } else { left = s.Substring(0, i); res.Op = Operation.AND; } res.Children.Add(Load(left)); res.Children.Add(Load(right)); return res; } if (last == '*' && s.Length > 1) { String expr = s.Substring(0, s.Length - 1); RegExpTreeItem res = new RegExpTreeItem() { Op = Operation.MULT }; res.Children.Add(Load(expr)); return res; } if (Special.Contains(last)) throw new Exception("Single special item " + last + "!"); if (s.Length == 1) return new RegExpTreeItem() { Op = Operation.NONE, Value = last }; if (s[s.Length - 2] == '|') { String expr = s.Substring(0, s.Length - 2); if (expr.Length == 0) throw new Exception("Nothing to the left of |!"); RegExpTreeItem res = new RegExpTreeItem() { Op = Operation.OR }; res.Children.Add(Load(expr)); res.Children.Add(new RegExpTreeItem() { Op = Operation.NONE, Value = last }); return res; } RegExpTreeItem rs = new RegExpTreeItem() { Op = Operation.AND }; rs.Children.Add(Load(s.Substring(0, s.Length - 1))); rs.Children.Add(new RegExpTreeItem() { Op = Operation.NONE, Value = last }); return rs; }
public RegExpTreeItem Clone() { RegExpTreeItem res = new RegExpTreeItem(); res.Op = Op; res.Value = Value; foreach (var child in Children) res.Children.Add(child.Clone()); return res; }
private void Copy(RegExpTreeItem from, RegExpTreeItem to) { to.Value = from.Value; to.Op = from.Op; foreach (var child in from.Children) { var tochild = new RegExpTreeItem(); to.Children.Add(tochild); Copy(child, tochild); } }