Esta é uma reformulação dos programas de gramática São? solicitado anteriormente por Vag e com muitas sugestões dos comentaristas.
De que maneira uma gramática pode ser vista como especificando um modelo de computação? Se, por exemplo, usarmos uma gramática simples, livre de contexto, como
G ::= '1' -> '0' '+' '1'
'1' -> '1' '+' '0'
'2' -> '2' '+' '0'
'2' -> '1' '+' '1'
'2' -> '0' '+' '2'
'3' -> '3' '+' '0'
'3' -> '2' '+' '1'
'3' -> '1' '+' '2'
'3' -> '1' '+' '2'
Assumindo que o analisador não diferenciar entre terminais e não terminais símbolos como tenho demonstrado aqui, então é possível realizar operações aritméticas simples para números até 3.
Por exemplo, pegue a string
"2 + 0 + 1"
A execução de um analisador LR (1) nessa cadeia de caracteres deve fornecer a seguinte árvore de sintaxe concreta, na qual o resultado da computação é armazenado na raiz da árvore:
'3'
/ | \
/ | \
'2' '+' '1'
/ | \
/ | \
'2' '+' '0'
Assim, se considerarmos uma gramática um programa e um gerador de analisador um compilador , poderemos ver a linguagem de especificação gramatical como uma linguagem de programação ?
Além disso, poderíamos criar programas completos de Turing especificando gramáticas semelhantes a como você pode criar programas completos de turing com autômatos celulares ou o cálculo lambda ?
Em outras palavras, sabe-se que, no sentido de reconhecer uma linguagem, linguagens regulares correspondem a autômatos de estados finitos , linguagens livres de contexto correspondem a autômatos push-down e linguagens sensíveis a contexto correspondem a autômatos limitados lineares . No entanto, se considerarmos as gramáticas como dispositivos computacionais (ou seja, programas no sentido do exemplo acima), como classificamos a força computacional de cada classe de gramática na hierarquia de Chomsky?
- Gramáticas regulares
- Gramáticas sem contexto
- Gramáticas sensíveis ao contexto
- Gramáticas irrestritas (para idiomas recursivamente enumeráveis )
Além disso, que tal as subclasses menos conhecidas de gramáticas, como
- Gramáticas determinísticas livres de contexto (também LR (k) / LL (k) / SLR / LALR etc)
- Gramáticas de palavras aninhadas
- Gramáticas adjacentes à árvore
- Gramáticas indexadas
EDIT: A propósito, este é um detalhe na minha própria pergunta, mas eu não mencionei que não dei nenhum símbolo inicial para a gramática de exemplo e acenei com a mão na necessidade de distinguir entre terminais e não terminais. Tecnicamente ou tradicionalmente, acho que a gramática provavelmente teria que ser escrita de uma forma mais complicada como esta (onde S é o símbolo inicial e $ representa o terminal de final de fluxo):
G ::= S -> R0 '$'
S -> R1 '$'
S -> R2 '$'
R0 -> '0'
R0 -> R0 '+' '0'
R1 -> '1'
R1 -> R0 '+' '1'
R1 -> '1' '+' R0
R1 -> R0 '+' '1' '+' R0
R2 -> '2'
R2 -> R0 '+' '2'
R2 -> '2' '+' R0
R2 -> R0 '+' '2' '+' R0
R2 -> R1 '+' '1'
R2 -> R1 '+' '1' '+' R0
... não que isso realmente mude alguma coisa, mas achei que deveria mencionar.
Edição: Outra coisa que me veio à mente quando li a resposta de Gasche é que cada ramo da árvore no meu exemplo representa uma sub-computação. Se você observar cada regra de produção como uma função em que o LHS representa o resultado e o RHS representa seus argumentos, a estrutura da gramática determina como as funções são compostas.
Em outras palavras, o contexto do analisador, juntamente com seu mecanismo de orientação, ajuda a determinar não apenas quais funções aplicar ('como' um polimorfismo paramétrico), mas como elas devem ser compostas para formar novas funções.
Pelo menos, eu acho que você poderia olhar desta maneira para CFGs inequívocos, para outras gramáticas a ginástica mental é um pouco demais para mim agora.