public Object[] parseProduciton(Tree<ASTValueData> sProduction) {
        final List<Tree<ASTValueData>> group = getGroup(sProduction, Term);
        List<Tree<ASTValueData>> ssp = group.size() == 1 ? null : getGroup(first(group), NAME); // For types, there is no parameter.
        List<Tree<ASTValueData>> ssnp = getGroup(last(getGroup(sProduction, Term)), NAME); // For types, there is no parameter.
        // For types, there is no parameter.
        Object[] ret = new Object[4];
        // Object[0] -> Object[1] ( Object[2] ) Object[3]
        ret[0] = text(first(getGroup(sProduction, NAME)));
        ret[1] = mapKeyword(text(first(tail(getGroup(sProduction, NAME)))));
        String[] p;
        String[] np;
        int i = 0;
        if (ssp != null) {
            ret[2] = p = new String[ssp.size()];

            for (Tree<ASTValueData> sss : ssp) {
                p[i++] = trans(text(sss));
            }
        } else {
            ret[2] = new String[]{};
        }
        ret[3] = np = new String[ssnp.size()];
        i = 0;
        for (Tree<ASTValueData> sss : ssnp) {
            np[i++] = trans(text(sss));
        }
        return ret;
    }