A sintaxe da linguagem C é completamente definida pelos CFGs?


7

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?


A resposta depende inteiramente de como você define o idioma dos "Programas C". Uma string é um programa C se tiver a sintaxe correta ou é um programa C se seguir a especificação da linguagem C em sua totalidade? Ou é um programa C se alguns (subconjuntos de) compiladores C compatíveis com os padrões são capazes de gerar um executável executável a partir dele? Sempre favoreci definições de linguagens de programação que requerem alguma semelhança de validade semântica, embora isso geralmente signifique que as linguagens não são livres de contexto, como na sua explicação.
Patrick87

Respostas:


13

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.