private Field parseField(String id) throws IOException, Err {
final XMLNode node = nmap.get(id);
if (node==null) throw new IOException("Unknown FieldID "+id+" encountered.");
if (!node.is("field")) throw new IOException("ID "+id+" is not a field.");
String label = label(node);
Pos isPrivate = yes(node,"private") ? Pos.UNKNOWN : null;
Pos isMeta = yes(node,"meta") ? Pos.UNKNOWN : null;
Expr type = null;
for(XMLNode sub:node) if (sub.is("types")) { Expr t=parseType(sub); if (type==null) type=t; else type=type.plus(t); }
int arity;
if (type==null || (arity=type.type().arity())<2) throw new IOException("Field "+label+" is maltyped.");
String parentID = node.getAttribute("parentID");