A linguagem C possui regras de digitação. Por exemplo, você não pode dividir dois ponteiros e, quando chama um procedimento que aceita um ponteiro, não pode usar um duplo. O compilador de CA analisa sua fonte em várias fases: primeiro há uma análise lexical, depois a fonte é analisada e assim por diante. Essas fases são abstrações e, de fato, informações adicionais são passadas de fase para fase. Por exemplo, embora a gramática de C não se importe com nomes de variáveis, essas informações são passadas e é assim que a gramática atribuída pode verificar as regras de digitação. Portanto, existem mecanismos adicionais trabalhando sobre a gramática.
Para um exemplo ainda mais simples, pegue o dado por Aho e Ullman. Na fase de análise, todos os nomes de variáveis parecem "iguais", mas você não pode usar uma variável a menos que ela tenha sido declarada. Essas informações são ocultas do analisador sem contexto, mas são mantidas como um atributo para a fase lexical e são verificadas durante a análise. A gramática livre de contexto de C representa apenas alguns aspectos do código C legal, que são úteis para implementar um analisador rápido. Além desse analisador, as outras regras são verificadas, a semântica é fornecida ao código C e o código da máquina é gerado.