public PartCombinator(PeekReader in, PartCombinator parent) {
        this.parent = parent;

        try {
            StringBuilder out = new StringBuilder();
            for (; ; ) {
                int c = in.read();
                if (c == -1 || c == ')') {
                    break;
                } else if (c == '(') {
                    parts.add(out.toString());
                    out.setLength(0);
                    parts.add(new PartCombinator(in, this));
                } else {
                    out.append((char) c);
                }
            }

            parts.add(out.toString());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }