private void Process_BeginsDirectlyWithSymbol(List<Production> productions, Boolean[][] beginsDirectlyWithSymbol){
		// First set all pairs to false.
		for (int i = 0; i < mSymbolsEx.size(); ++i){
			for (int j = 0; j < mSymbolsEx.size(); ++j){ // for each pair of symbols
				beginsDirectlyWithSymbol[i][j] = false;
			}
		}
		// Then set to true only the appropriate pairs.
		for (int i = 0; i < mSymbolsEx.size(); ++i){
			SymbolEx firstSym = mSymbolsEx.get(i);
			if (firstSym.mSym.mIsTerminal) continue; // only nonterminal symbols can be processed
			for (int j = 0; j < mSymbolsEx.size(); ++j){
				SymbolEx secondSym = mSymbolsEx.get(j);
				for (int k = 0; k < productions.size(); ++k){
					if (firstSym == mSymbolsEx.get(productions.get(k).mLeftNonTerminalSymbolIndex)){
						// now we go through all of the productions
						for (int l = 0; l < productions.get(k).mRightSymbolsIndices.size(); ++l){
							int productionSymIndex = productions.get(k).mRightSymbolsIndices.get(l);
							if (productionSymIndex != Utilities.ProductionEpsilonCode){
								if (mSymbolsEx.get(productionSymIndex) == secondSym){
									beginsDirectlyWithSymbol[i][j] = true;
									break;// we found our 'secondSym' in production right side symbols
								}else if (mSymbolsEx.get(productionSymIndex).mIsEmpty){
									continue;// so far there are only empty symbols in this production
								}else{
									break;// because whatever comes next won't be in 'beginsDirectlyWithSymbol' relation.
								}
							}
							else break;
						}
					}
				}
			}
		}
	}