The context-free terminology doesn&#x27;t apply to C because the ambiguity rests in not knowing what is the <i>lexical</i> category of foo in &quot;foo * bar&quot;. That information comes from semantics.<p>A language whose semantics you have to understand to understand its syntax is outside of the entire formal language realm inside which we formally recognize a &quot;context-free&quot; category. That formal language realm is purely syntactic: the terminal symbols are just &quot;dumb&quot; and stand for themselves. They are subject to rules which indicate how those symbols are combined.<p>C is &quot;quasi context free&quot; in that if we resolve what the raw tokens mean (which one is a type and which one isn&#x27;t), then the resulting language is context-free. In fact stronger than context free: amenable not only to LALR(1) parsing approaches but to recursive descent, with a suitable refactoring of the left-recursive rules given in the standard.