public State iterate(SimpleNode root) throws ParseException
	{
		SimpleNode nodeChild = null;
		
		StateQueue cur = stateQueue.element();
		
		if( cur == null )
			return null;
		
		
		for(int i=0;i<root.jjtGetNumChildren();i++)
		{
			nodeChild = (SimpleNode) root.jjtGetChild(i);
			
			if( nodeChild == null )
				continue;
			
			analysis(nodeChild);
			
			
			if( nodeChild.jjtGetNumChildren() > 0 )
			{
				boolean isOR = nodeChild.toString().equals("OR");
				
				if( isOR )
				{
					cur.orQueue.add(cur.last);
					cur.last.isFinal = true;
//					State newS = new State();
//					cur.head.connect(newS, null, false);
//					stateQueue.addFirst(new StateQueue(newS));
					
					stateQueue.addFirst(new StateQueue(cur.head));
				}
				else
				{
					StateQueue sq = new StateQueue(cur.last);
					if( cur.toConnect.size() > 0)
					{
						sq.toConnect.addAll(cur.toConnect);
						cur.toConnect.clear();
					}
					stateQueue.addFirst(sq);
				}
				
				
				cur.last = iterate(nodeChild);
				
				
//				if( cur.toConnect.size() > 0 )
//				{
//					for(State s: cur.toConnect)
//						s.connect(cur.last, null, false);
//					
//					cur.toConnect.clear();
//				}
				
//				if( isOR )
//				{
//					cur.last.isFinal = true;
//					cur.orQueue.add(cur.last);
//				}
				
				StateQueue last = stateQueue.remove();
				if( last != null )
				{
					if( last.orQueue.size() > 0 )
						cur.toConnect.addAll(last.orQueue);
					
					if( last.toConnect.size() > 0 )
						cur.toConnect.addAll(last.toConnect);
				}
			}
		}
		
		return cur.last;
	}