Justification for the pumping lemma of context free languages
A context-free grammar has a finite number of nonterminals. This means the number of different derivation trees you can generate such that each nonterminal on each path of each tree is different is also finite: if you have $n$ nonterminals, then each path longer than $n$ will contain at least one nonterminal twice. That means all other derivations have a repeating nonterminal $A$ on some path. We can then pump by repeating the path segment from $A$ to $A$ arbitrarily often. This remains true after we make the grammar proper by removing all unproductive and unreachable nonterminals and cyclic rules.