private void Process_IsEmpty(List<Production> productions){
		// First step is to select symbols that are on the left side of the epsilon production
		// as empty symbols.
		for (int i = 0; i < productions.size(); ++i){
			if (productions.get(i).mRightSymbolsIndices.get(0) == Utilities.ProductionEpsilonCode)
				mSymbolsEx.get(productions.get(i).mLeftNonTerminalSymbolIndex).mIsEmpty = true;
		}
		
		// Now we do the same for the symbols that are on the left side of a productions that has 
		// all empty symbols on the right side.
		Boolean goAgain = true;
		while (goAgain){
			goAgain = false;
			for (int i = 0; i < productions.size(); ++i){
				Boolean allEmptyOnTheRightSide = true;
				for (int j = 0; j < productions.get(i).mRightSymbolsIndices.size(); ++j){
					if (productions.get(i).mRightSymbolsIndices.get(j) != Utilities.ProductionEpsilonCode &&
							mSymbolsEx.get(productions.get(i).mRightSymbolsIndices.get(j)).mIsEmpty == false){
						allEmptyOnTheRightSide = false;
						break;
					}
				}
				if (allEmptyOnTheRightSide &&
						mSymbolsEx.get(productions.get(i).mLeftNonTerminalSymbolIndex).mIsEmpty == false){
					goAgain = true;
					mSymbolsEx.get(productions.get(i).mLeftNonTerminalSymbolIndex).mIsEmpty = true;
				}
			}
		}
	}