a context-free language
Step back from any single grammar and ask: which languages, as sets of strings, can grammars of this kind describe AT ALL? A context-free language is one that some context-free grammar can generate. It is the natural class one rung above the regular languages — exactly the languages with the kind of nested, recursive, matching structure that finite automata cannot capture but a stack can.
Formally, a language L over an alphabet Σ (Sigma) is context-free if there exists a context-free grammar G whose generated language L(G) equals L. The classic examples are { a^n b^n : n ≥ 0 } (equal numbers of a's then b's), the language of balanced parentheses, and palindromes — all of which are NOT regular, because keeping count of unbounded nesting needs unbounded memory that a finite automaton lacks. Equivalently, by a fundamental theorem, the context-free languages are exactly the languages accepted by pushdown automata: a finite-state controller plus one stack. The single stack is precisely the extra memory that lets you match nested structure (push on the way in, pop on the way out).
Context-free languages sit squarely in the middle of the Chomsky hierarchy: every regular language is context-free, but not vice versa, and every context-free language is context-sensitive, but not vice versa. They have useful but PARTIAL closure properties — closed under union, concatenation, and Kleene star, but NOT under intersection or complement — and there are honest limits: { a^n b^n c^n } is not context-free (a pumping lemma for CFLs proves this), and several natural questions about CFGs, like whether two grammars generate the same language, are undecidable. So context-free is powerful enough for programming-language syntax, but far from all-powerful.
L = { a^n b^n : n ≥ 0 } = {ε, ab, aabb, aaabbb, ...} is context-free (grammar S → a S b | ε) but not regular. By contrast { a^n b^n c^n } is NOT context-free — a stack can match a's against b's, but cannot then also match against the c's.
A CFL = generated by some CFG = accepted by some pushdown automaton; it captures one level of nested matching.
CFLs are closed under union, concatenation, and Kleene star but NOT under intersection or complement — a real limit. And { a^n b^n c^n } is not context-free, so the class is genuinely weaker than full Turing power.