public EpsilonNFA(Parser p, BEGINS_sets b_sets){
		mParser = p;
		mB_Sets = b_sets;
		// The following is implementation of the algorithm presented on the page 148.
		
		// This is 4th step in the algorithm
		for (int i = 0; i < p.GetProductions().size(); ++i){
			// case 4.a), we need only the initial productions
			if (p.GetProductions().get(i).mLeftNonTerminalSymbolIndex == p.GetInitialNonTerminalSymbol()){
				List<Integer> b_set = new ArrayList<Integer>();
				b_set.add(Utilities.EOFTerminalSymbolCode);
				StateNFA s = CreateState(p.GetProductions().get(i).mLeftNonTerminalSymbolIndex,
						p.GetProductions().get(i).mRightSymbolsIndices, true, 0, b_set, i);
				mStates.add(s);
			}
		}
		// process newly added initial states
		for (int i = 0; i < mStates.size(); ++i)
			if (mStates.get(i).mIsInitial)
				ProcessState(mStates.get(i));
		
		DoEpsilonTransitions();
	}