@Override
 CompoundSpiderDiagram createSD(
     Map<String, Entry<Object, CommonTree>> attributes, CommonTree mainNode)
     throws ReadingException {
   String operator = (String) attributes.remove(SDTextOperatorAttribute).getKey();
   ArrayList<SpiderDiagram> operands = new ArrayList<>();
   int i = 1;
   Entry<Object, CommonTree> curSD, lastSD = null;
   while ((curSD = attributes.remove(CompoundSpiderDiagram.SDTextArgAttribute + i++)) != null
       && curSD.getKey() instanceof SpiderDiagram) {
     operands.add((SpiderDiagram) curSD.getKey());
     lastSD = curSD;
   }
   if (curSD != null) {
     throw new ReadingException(
         i18n("GERR_ILLEGAL_STATE"), (CommonTree) curSD.getValue().getChild(0));
   }
   if (!attributes.isEmpty()) {
     throw new ReadingException(
         i18n("ERR_TRANSLATE_UNKNOWN_ATTRIBUTES", attributes.keySet()),
         (CommonTree) attributes.values().iterator().next().getValue().getChild(0));
   }
   try {
     return SpiderDiagrams.createCompoundSD(operator, operands, false);
   } catch (Exception e) {
     throw new ReadingException(
         e.getLocalizedMessage(),
         lastSD == null ? mainNode : (CommonTree) lastSD.getValue().getChild(0));
   }
 }
 @Override
 @SuppressWarnings("unchecked")
 public Map<String, Region> fromASTNode(CommonTree treeNode) throws ReadingException {
   ArrayList<ArrayList<Object>> rawHabitats = regionListTranslator.fromASTNode(treeNode);
   if (rawHabitats == null || rawHabitats.size() < 1) {
     return null;
   }
   HashMap<String, Region> habitats = new HashMap<>();
   for (ArrayList<Object> rawHabitat : rawHabitats) {
     if (rawHabitat.size() == 2) {
       habitats.put((String) rawHabitat.get(0), new Region((ArrayList<Zone>) rawHabitat.get(1)));
     }
   }
   return habitats;
 }
 @Override
 public ArrayList<V> fromASTNode(CommonTree treeNode) throws ReadingException {
   if (treeNode.token != null && treeNode.token.getType() == headTokenType) {
     checkNode(treeNode);
     if (treeNode.getChildCount() < 1) {
       return null;
     }
     ArrayList<V> objs = new ArrayList<>(treeNode.getChildCount());
     int i = 0;
     for (Object obj : treeNode.getChildren()) {
       objs.add(fromASTChildAt(i++, (CommonTree) obj));
     }
     return objs;
   }
   throw new ReadingException(
       i18n("ERR_TRANSLATE_UNEXPECTED_ELEMENT", i18n(i18n("ERR_TRANSLATE_LIST_OR_SLIST"))),
       treeNode);
 }