Estou tentando entender gramáticas sensíveis ao contexto.
Eu entendo por que idiomas como
não são livres de contexto, mas o que eu gostaria de saber se uma linguagem semelhante ao cálculo lambda sem tipo é sensível ao contexto.
Gostaria de ver um exemplo de um simples, mas não brinquedo (considero os exemplos de brinquedos acima), um exemplo de gramática sensível ao contexto que pode, para algumas regras de produção, por exemplo, dizer se alguma sequência de símbolos é ou não está no escopo atualmente (por exemplo, ao produzir o corpo de uma função).
As gramáticas sensíveis ao contexto são poderosas o suficiente para tornar variáveis indefinidas / não declaradas / não vinculadas um erro sintático (e não semântico)?
Respostas:
Sim, eu acredito que isso seja possível, mas não, não estou disposto a construir explicitamente essa gramática sensível ao contexto. Vou explicar minha resposta, dividindo a pergunta em duas partes diferentes.
(1) Qual seria o exemplo de não brinquedo? Deve refletir a declaração de variáveis. Minha proposta de uma linguagem assim, abstraída da programação real, seria algo assim. O alfabeto é . { w 1 ; w 2 ; ... ; w n ( x 1 ; x 2 ; … ; x m ) ∣ w i , x j ∈ { a , b{a,b,;,(,)}
que a linguagem é sensível ao contexto.
(2) Para mostrar que é realmente sensível ao contexto, eu usaria outro formalismo. O de uma máquina de Turing com uso linear de sua fita: um autômato linear delimitado LBA. Eu posso programá-lo para fazer a correspondência de padrões / eu consideraria consecutivamente cada e tentaria combiná-lo com um w j adequado , letra por letra. Os LBAs são equivalentes a gramáticas sensíveis ao contexto, mas muito mais fáceis de programar.xj wj
fonte
Muitas outras linguagens NP-hard também estão no CSL pelo mesmo motivo, como CLIQUE.
Também existem linguagens bastante naturais na CSL que são ainda mais difíceis.
No entanto, não conheço nenhuma maneira de expressar uma CSL arbitrária como uma gramática sensível ao contexto (CSG), além de usar a construção de Landweber no Teorema 3 de seu artigo. Nesta construção, o CSG descreve o reverso da operação do autômato de limite linear que reconhece o CSL. As produções do CSG descrevem como um determinado estado da máquina resulta de um possível movimento. Esse CSG é uma tradução direta do autômato em uma gramática; portanto, ele não corresponde necessariamente a recursos de idioma, como poder declarar variáveis, mas será atolado pelos detalhes do autômato.
Se você insiste em um CSG em vez de um CSL, e se sua pergunta real é especificamente sobre querer ver um CSG para um idioma que envolva escopo de variável restrito, a resposta de Hendrik Jan parece ser um bom começo.
fonte
Sim, gramáticas sensíveis ao contexto (CSG) são poderosas o suficiente para fazer a verificação de variáveis indefinidas / não declaradas / não acopladas, mas infelizmente não conhecemos nenhum algoritmo eficiente para analisar seqüências de caracteres de CSG.
Um exemplo real de uma linguagem sensível ao contexto é a linguagem de programação C. Um recurso como declarar variáveis primeiro e depois usá-las posteriormente torna a linguagem C uma linguagem sensível ao contexto (CSL). ( Eu não sei sobre cálculo lambda sem tipo ).
E porque não conhecemos nenhum algoritmo de análise linear para CSL (ou CSG). Essa é a razão no design do compilador, usamos o CFG (e apenas seu algoritmo de análise) para verificação de sintaxe, pois conhecemos algoritmos eficientes para analisar o CFG (se estiver em forma restrita). Os compiladores analisam primeiro um recurso livre de contexto e, posteriormente, manipulam recursos sensíveis ao contexto de maneira problemática (por exemplo, verifica qualquer variável usada na tabela de símbolos, se estiver definida. Caso contrário, gera um erro).
A gramática sensível ao contexto também é usada no processamento de linguagem natural (PNL). E a maioria das linguagens naturais são exemplos de linguagens sensíveis ao contexto. (Não sei ao certo o idioma sânscrito ).
Vou tentar explicá-lo com um exemplo bobo, mas simples (é apenas uma ideia, você pode refinar):
Agora, usando essa gramática, podemos gerar algumas declarações corretas, mas algumas também estão erradas. Por exemplo,
Mas
Razão: o valor de <TENSE> depende do valor <NOUN> (por exemplo
I <TENNSE> --> I am
) e, portanto, a gramática não gera instruções corretas no idioma inglês.Na verdade, não podemos escrever uma gramática sem contexto para inglês completo!
Você deve ter notado que qualquer tradutor de idioma natural ou verificador gramatical não funciona corretamente (tente com instruções longas). Porque esse problema está no algoritmo de análise sensível ao contexto.
REFERÊNCIA : Você pode assistir às palestras do Dr. Arun Kumar . Em algumas palestras, ele explica exatamente em que você está interessado.
fonte
(estendendo comentários em resposta)
Não tenho certeza se este é um exemplo que você gostaria.
Quase todas as linguagens de programação reais são sensíveis ao contexto (no sentido geral, ou seja, combinam as gramáticas Chomsky tipo 0 e tipo I com "sensível ao contexto", o que é verdade, é claro, pois gramáticas irrestritas são ainda mais sensíveis ao contexto do que o contexto gramáticas sensíveis ).
Por exemplo, "as variáveis precisam ser declaradas antes de usadas", "os identificadores devem ser únicos", tudo isso exige contexto (às vezes referido como contexto semântico, mas que pode ser enganoso, pois envolve recursos sintáticos de qualquer maneira), veja, por exemplo, https: // www .cs.purdue.edu / homes / hosking / 502 / notes / 04-semantics.pdf
A sensação de que os exemplos acima são sensíveis ao contexto (no sentido gramatical / sintático e semântico) é porque eles falam sobre seu contexto (o que precede ou vem depois).
Uma "variável já definida" é sobre contexto anterior , um uso variável. Um "identificador exclusivo" é o contexto do que precede ou vem após uma declaração de identificador, e assim por diante.
veja também O JavaScript é uma linguagem livre de contexto?no SO
fonte