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) {}

}