public NFA(Parser p, EpsilonNFA eNFA){
		// Populate new array and figure out which states are initial for NFA
		eNFA.Reset();
		for (int i = 0; i < eNFA.GetStates().size(); ++i){
			StateNFA temp = new StateNFA();
			temp.mIsInitial = eNFA.GetStates().get(i).mUsed;
			temp.mItem = eNFA.GetStates().get(i).mItem;
			temp.mUsed = temp.mUsedInNextStep = false;
			mStates.add(temp);
		}
		
		// for each symbol
		for (int i = 0; i < p.GetSymbols().size(); ++i){
			// for each state
			for (int j = 0; j < mStates.size(); ++j){
				
				// set all .mUsed to false except the current one
				for (int k = 0; k < mStates.size(); ++k) eNFA.GetStates().get(k).mUsed = false;
				eNFA.GetStates().get(j).mUsed = true;
				eNFA.DoEpsilonTransitions();
				eNFA.InputSymbol(i);
				
				// save in the new transition
				Transition tempT = new Transition();
				tempT.mInput = i;
				tempT.mNextStates = new ArrayList<StateNFA>();
				for (int k = 0; k < mStates.size(); ++k)
					if (eNFA.GetStates().get(k).mUsed) 
						tempT.mNextStates.add(mStates.get(k)); // add the copy of a state in 'NFA.mStates'
				
				if (!mTransitions.containsKey(mStates.get(j))) 
					mTransitions.put(mStates.get(j), new ArrayList<Transition>());
				mTransitions.get(mStates.get(j)).add(tempT);
			}
		}
		
		Reset();
	}