Indeed. There is a rule that Type generates Identifier, which can generate an example like foo. Likewise, Var generates Identifier, which generates foo. But these generations are not purely grammar rules; Type can only generate foo if there exists a declaration in the semantic space.  If we regard it as purely a grammar rule, then we have a straightforward ambiguity in a context-free language.  It is context-free simply because the rules are all of the form   one_sym -&gt; zero_or_more_syms.<p>If C were parsed this way, nondeterministically, ultimately the ambiguity would be resolved by looking up the type info anyway.  (The interesting possibility exists, though, that in some cases the type info could be inferred,  based on how the declared identifier is used.)