/* Generated By:JJTree: Do not edit this line. ForClause.java */

package org.apache.xpath.parser;

import org.apache.xpath.Expression;
import org.apache.xpath.operations.Variable;
import org.apache.xpath.seqctor.Binding;
import org.apache.xpath.seqctor.FLWRExpr;

/**
 * ForClause ::= <"for" "$"> VarName "in" 
 *                  Expr ("," "$" VarName "in" Expr)* 
 * 
 * Created Jul 18, 2002
 * @author sboag
 */
public class ForClause extends NonExecutableExpression
{
	
  public ForClause(XPath parser) {
    super(parser);
  }

  /**
   * @see org.apache.xpath.parser.Node#jjtSetParent(Node)
   */
  public void jjtSetParent(Node n)
  {
    super.jjtSetParent(n);
    FLWRExpr flwr = (FLWRExpr)n;
    int vsize = m_exprs.size();
    // vsize--;
    Binding[] bindings = new Binding[vsize/3];
    
    int bindingIndex = 0;
    for (int i = 0; i < vsize; i+=3)
    {
      Variable var = (Variable)m_exprs.elementAt(i);
      try
      {
        Binding binding = new Binding();
        binding.setVar(var);
        bindings[bindingIndex] = binding;
        bindingIndex++;
        var.jjtSetParent(flwr);
      }
      catch (java.lang.NullPointerException e)
      {
        throw e;
      }
    }
    bindingIndex = 0;
    // Ignore the "in" node.  (It should really be void)
    for (int i = 2; i < vsize; i+=3)
    {
      Expression expr = (Expression)m_exprs.elementAt(i);
      expr = (Expression)fixupPrimarys(expr);
      bindings[bindingIndex++].setExpr(expr);
      expr.jjtSetParent(flwr);
    }
    flwr.setBindings(bindings);
  }

}
