public Element parseElement(Scanner in) throws IOException {
        in.read();

        if (in.isSymbol("%")) {
            return parseReference(in, new IntegerElement());
        } else if (in.isSymbol("$")) {
            return parseReference(in, new StringElement());
        } else if (in.isSymbol("*")) {
            return parseReference(in, new StarElement());
        } else if (in.isSymbol("[")) {
            List<String> ls = new ArrayList<String>();
            for (; ; ) {
                in.read();
                if (in.isName()) {
                    ls.add(in.getToken());
                } else if (in.isSymbol("]")) {
                    break;
                } else if (!in.isSymbol("|")) {
                    in.error("Expected | or ] instead of `" + in.getToken() + "'");
                }
            }

            String[] values = ls.toArray(new String[ls.size()]);
            return parseReference(in, new OptionsElement(values));
//      } else if (in.isSymbol("{")) {
//          parseReference(in);
//      } else if (in.isSymbol("(")) {
//          parseReference(in);
        }

        return null;
    }