Na prática, para uma linguagem que possa eventualmente ser compilada / transformada em instruções no nível do sistema, é necessário que seja uma gramática livre de contexto?
ex: todas as linguagens de programação / script possuem gramática livre de contexto? Java é baseado em CFGs, mas será que todas as linguagens de programação são baseadas em CFGs?
Não parece obrigatório, mas há lacunas no meu entendimento.
Algum contexto para a pergunta: eu estava olhando para a especificação da linguagem Java, que também fornece as regras gramaticais . Isso me fez pensar sobre essa questão.
pl.programming-languages
context-free
sandeepkunkunuru
fonte
fonte
Respostas:
Duas vezes não.
Primeiro, a maioria das HPLs não é livre de contexto. Embora eles geralmente tenham sintaxe baseada em um CFG, eles também têm o que as pessoas chamam de semântica estática (que também é frequentemente incluída no termo sintaxe). Isso pode incluir nomes e tipos que precisam ser verificados para um programa correto. Por exemplo,
é um programa Java sintaticamente correto, mas não será compilado porque
d
não está definido ea
não possui um tipo de ajuste.Em segundo lugar, você pode analisar linguagens que não são livres de contexto (como obviamente comprovado pela existência de compiladores). Somente os CFGs podem ser analisados com eficiência, enquanto os CSGs não podem, em geral. No entanto, você pode adicionar alguns recursos que não são livres de contexto e permanecer eficientes.
Os compiladores geralmente são executados em fases: primeira tokenização (regular), depois análise sem contexto, depois análise de nome e tipo (sensível ao contexto, às vezes até mais difícil). Você pode observar esse comportamento pelo tipo de mensagem de erro recebida.
fonte
public class Program { public static void main(String[] args) { ... } }
... Java não vai deixar você sair tão fácil. :-)class A { ... }
é completamente suficiente, poisjavac
compila coisas que você não pode realmente executar (por falta de um ponto de entrada) também. Mas simA análise de perl não pode ser decidida.
http://www.jeffreykegler.com/Home/perl-and-undecidability/perl-and-undecidability-files/TPR3.pdf?attredirects=0
http://www.perlmonks.org/?node_id=663393
fonte
Não acredito que a gramática do Python seja livre de contexto. O requisito de que linhas no mesmo bloco de código tenham a mesma quantidade de indentação não é o tipo de coisa que as gramáticas livres de contexto lidam bem.
Mais precisamente, parece haver um homomorfismo da linguagem dos blocos Python da forma
para o idioma sem contexto que o primeiro bloco de zeros vem do conjunto de espaços no início da linha1, o segundo bloco vem o conjunto de espaços no início da linha2, o terceiro bloco vem do conjunto de espaços no início da linha3, e as linhas restantes com o else etc estão lá para forçar a linha1, a linha2 e a linha3 a pertencer ao mesmo bloco.0 0n10n10n
fonte
foo * bar;
uma declaraçãofoo
como ponteirobar
ou multiplicação defoo
vezesbar
?Bodo Manthey e Martin Böhme mostram que todo compilador C ++ é necessariamente Turing completo, ou seja, ele pode calcular qualquer função recursiva parcial em tempo de compilação . Portanto, é muito pior do que apenas sensível ao contexto.
http://wwwhome.math.utwente.nl/~mantheyb/journals/BotEATCS_BoehmeManthey_CompilingCPP.pdf
fonte
Penso que a declaração antes do uso de variáveis e o polimorfismo de função das linguagens OOP são outros exemplos de especificações de linguagens de programação que não podem ser tratadas por gramáticas livres de contexto:
Fiz uma pequena pesquisa no Google e encontrei este artigo: " Uma gramática booleana para uma linguagem booleana simples " de A.Okhotin (2004); Segundo ele, o verdadeiro problema é encontrar uma linguagem de programação completamente descrita por uma gramática formal:
Uma linguagem de programação processual de brinquedo é definida e uma gramática booleana para o conjunto de programas bem formados nessa linguagem é construída. Aparentemente, essa é a primeira especificação de uma linguagem de programação inteiramente por uma gramática formal.
A seção Introdução do artigo é curta, mas muito esclarecedora.
fonte
Acredito que a gramática de C é tecnicamente livre de contexto, já que os analisadores sempre usam técnicas sem contexto para dar suporte ao dispositivo de Duff .
As linguagens baseadas em recuo não são naturalmente livres de contexto, como David disse, mas se tornam livres de contexto em relação a um token de recuo parametrizado.
Haskell permite alterar a precedência do operador com infix e infixl. O módulo estrito de pragma do Perl é implementado usando as configurações lexicais $ ^ H e% ^ H, que não o tornam livre de contexto, provavelmente outras configurações também.
Existem linguagens de expansão de macro como o TeX, nas quais a análise de afaik não faz sentido sem a execução.
Provavelmente, existem até duas gramáticas livres de contexto cuja interseção não é livre de contexto, mas ainda descreve uma máquina de Turing.
Java e assembler provavelmente são naturalmente livres de contexto.
fonte
(a)-b
tornar C sensível ao contexto? (a
Poderia ser uma variável ou um typedef - algumas outras línguas não permitem lançando expressões menos unário por esta razão)Não, e muitas linguagens práticas não são livres de contexto. Por exemplo, a gramática C ++ não é, porque em alguns contextos a resolução gramatical depende da digitação de informações que não são livres de contexto.
fonte
Primeiro, deixe-me fazer uma distinção entre a sintaxe de uma linguagem de programação e a própria linguagem.
A sintaxe de muitas linguagens é (pelo menos com base em) uma gramática livre de contexto (CFG), porque elas são bem estudadas e existem algoritmos que podem analisar com eficiência uma CFG e o caso limite que não pode ser resolvido pela CFG pode ser tratado especialmente
No entanto, muitas linguagens não são livres de contexto (quando símbolos de declaração antes do uso são usados, por exemplo, em java, C (++), D).
Curiosidade: D tem uma avaliação da função de tempo de compilação completa de Turing e expansão de modelo, tornando a linguagem em si não decidível por Turing. No entanto, o criador da linguagem fez um grande esforço para tornar a sintaxe um CFG.
fonte
No que diz respeito a "Todas as linguagens de programação / script são livres de gramática?" parte está em causa, a resposta é um número definitivo
Re: a questão principal de "para um idioma que pode eventualmente ser compilado / transformado em instruções no nível do sistema", não sei por que ele precisa necessariamente ser um CFG. No entanto, poderia haver melhores explicações.
fonte
Uma linguagem de programação precisa se basear em algum tipo de formalismo gramatical, do qual os CFGs são um exemplo. Embora os CFGs sejam os mais comuns (e o habitual ensinado nos cursos de compilação em universidades), existem outros formalismos, como as Gramáticas de Análise de Expressão Analisada, sobre as quais você pode ler mais aqui (pdf) ou na Wikipedia para obter uma leitura mais detalhada.
fonte