NodeParser.java
package edu.udel.cis.vsl.tass.ast.parser;
import org.xml.sax.Attributes;
class NodeParser implements NodeParserIF {
private String lastDescendent;
private final RefMappers refMappers;
private final NodeTypes nodeTypes;
private NodeTypeIF nodeType;
private NodeEltWrapperIF node;
private int attrCount = -1;
private int childCount = -1;
public NodeParser(NodeTypes nodeTypes, RefMappers refMappers) {
this.nodeTypes = nodeTypes;
this.refMappers = refMappers;
}
public NodeParserIF makeInstance() {
return new NodeParser(nodeTypes,refMappers);
}
@Override
public NodeParserIF makeDescendent(String localName) {
lastDescendent = localName;
if (nodeType == null) {
// First element holds the id field and node type
nodeType = nodeTypes.getNodeType(localName);
return new LeafIntParser(nodeTypes, refMappers);
} else {
if (nodeType.isAttr(localName)) {
attrCount = nodeType.getPosition(localName, attrCount);
} else {
childCount = nodeType.getPosition(localName, childCount);
}
return nodeType.makeDescendent(localName);
}
}
// None of the non-leaf nodes use XML attributes
@Override
public void setAttrs(Attributes attrs) {}
@Override
public NodeEltWrapperIF node() {
return node;
}
@Override
public void addDescendent(NodeEltWrapperIF descendent) {
if (node == null) {
int id = ((IntEltWrapper)descendent).getNode().intValue();
node = nodeType.getEmptyNode(refMappers.getId());
refMappers.addId(node,id);
} else if (nodeType.isAttr(lastDescendent)) {
if (nodeType.isRefAttr(lastDescendent)) {
int refAddr = ((IntEltWrapper)descendent).getNode().intValue();
refMappers.addRef(node,refAddr,attrCount);
} else {
node.setAttr(attrCount,descendent);
}
} else {
node.setChild(childCount,descendent);
}
}
@Override
public void characters(String str) {}
}