Eu acho que a pergunta é auto-suficiente. A sintaxe da linguagem C é completamente definida por meio de gramáticas livres de contexto ou temos construtos de linguagem que podem exigir definições não livres de contexto durante a análise?
Um exemplo de construção não CFL que pensei ser a declaração de variáveis antes do uso. Mas em Compiladores (Aho Ullman Sethi), afirma-se que a linguagem C não distingue entre identificadores com base em seus nomes. Todos os identificadores são simbolizados como 'id' pelo Lexical Analyzer. Se C não for completamente definido pelos CFGs, alguém pode dar um exemplo da construção Não CFL em C?
context-free
programming-languages
compilers
parsing
c
Madeyedexter
fonte
fonte
Respostas:
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.
fonte