/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 1997-2006.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.query.parser.serql;
import org.openrdf.query.parser.serql.ast.ASTEdge;
import org.openrdf.query.parser.serql.ast.ASTNode;
import org.openrdf.query.parser.serql.ast.ASTNodeElem;
import org.openrdf.query.parser.serql.ast.ASTReifiedStat;
import org.openrdf.query.parser.serql.ast.ASTVar;
import org.openrdf.query.parser.serql.ast.SyntaxTreeBuilderTreeConstants;
import org.openrdf.query.parser.serql.ast.VisitorException;
/**
* Inserts anonymous variables into the abstract syntax tree at places where
* such variables are already implicitly present.
*/
public class AnonymousVarGenerator extends ASTVisitorBase {
private int anonymousVarNo = 1;
@Override
public Object visit(ASTNode node, Object data)
throws VisitorException
{
if (node.jjtGetNumChildren() == 0) {
ASTNodeElem nodeElem = createNodeElem();
nodeElem.jjtSetParent(node);
node.jjtAppendChild(nodeElem);
}
return super.visit(node, data);
}
@Override
public Object visit(ASTReifiedStat node, Object data)
throws VisitorException
{
if (node.jjtGetChild(0) instanceof ASTEdge) {
// subject node is missing
ASTNodeElem nodeElem = createNodeElem();
nodeElem.jjtSetParent(node);
node.jjtInsertChild(nodeElem, 0);
}
if (node.jjtGetNumChildren() <= 2) {
// object node is missing
ASTNodeElem nodeElem = createNodeElem();
nodeElem.jjtSetParent(node);
node.jjtAppendChild(nodeElem);
}
if (node.getID() == null) {
node.setID(createAnonymousVar());
}
return super.visit(node, data);
}
private ASTNodeElem createNodeElem() {
ASTNodeElem nodeElem = new ASTNodeElem(SyntaxTreeBuilderTreeConstants.JJTNODEELEM);
ASTVar var = createAnonymousVar();
var.jjtSetParent(nodeElem);
nodeElem.jjtAppendChild(var);
return nodeElem;
}
private ASTVar createAnonymousVar() {
ASTVar var = new ASTVar(SyntaxTreeBuilderTreeConstants.JJTVAR);
var.setName("-anon-" + anonymousVarNo++);
var.setAnonymous(true);
return var;
}
}