Gramática afixa
# Gramática afixa

Uma gramática afixa ou linguagem afixa é um tipo de gramática formal; É usado para descrever a sintaxe das linguagens, primordialmente utilizado para linguagens de computação, usando uma bordagem baseada em como uma linguagem natural é tipicamente descrita.
As regras gramaticais de uma gramatica afixa são as de uma gramatica livre de contexto, exceto algumas partes nos não-terminais ( os afixos) que são usados como argumentos. Se o mesmo afixo ocorrer diversas vezes em uma única regra, seu valor deve ser o mesmo. Algumas vezes dependendo da gramática em que se está trabalhando, relações mais complexas entre valores de afixos são possíveis.

## Exemplo

Nós podemos descrever um fragmento simples do Português da seguinte maneira:
Verbo → ajudam
Nesta gramatica livre de contexto descrevemos orações simples como:
Com mais substantivos e verbos e mais regras para introduzir outras partes da linguagem, um maior ramo de orações do português podem ser descritas; Então esta é uma abordagem para descrever a sintaxe de português.
No entanto, a gramatica dada também descreve orações como
Estas orações estão erradas: Em português o sujeito e o verbo tem um numero gramatical que eles devem concordar.
Uma gramática afixa pode expressar isso diretamente:
Oração → (Sujeito + numero) Auxiliar (Predicado+numero)
Substantivo + singular → João
Esta gramática apenas descreve orações corretas em português. Apesar de ainda poder possuir alguns erros como:
Ainda está errado já que este ajuda não pedia preposição neste caso. Deveria ser:
Isto também pode ser corrigido usando afixos, se os meios para descrever as relações entre os valores de diferentes afixos são fortes o suficiente. Como dito acima, estes meios dependem muito do tipo de gramatica afixa escolhida.

## Tipos de gramáticas afixas

No tipo mais simples de gramáticas afixas, os afixos só podem pegar valores de um domínio finito, e estes valores só podem ser relacionados usando 'acordos' como foi feito no exemplo acima. Aplicando desta forma, os afixos aumentam a compactabilidade das gramáticas, porém não aumentam a expressão de força da linguagem.
Outra abordagem é permitir que os afixos peguem omo valores Strings quaisquer e permitam que concatenações de afixos possam ser usadas nas regras. Os limites dos valores permitidos para os afixos podem ser descritos com regras de linguagens livre de contexto. Isto produz o formalismo de gramaticas de dois niveis, também conhecidas como Van Wijngaarden grammars ou gramáticas 2VW . Estes formalismos tem sido usados com sucesso, para descrever linguagens complicadas, em particular, a sintaxe do Algol 68 programming language. Apesar disso, mesmo sabendo que os valores dos afixos só podem ser manipulado com concatenações de strings, este formalismo é Turing complete; Por isso até as perguntas mais básicas sobre a linguagem descrita por uma gramatica 2VW qualquer são indecidíveis no geral.
As Gramáticas Afixas Estendidas, desenvolvidas por volta da década de 1980, são uma versão mais restrita da mesma ideia. Elas foram criadas com o principal objetivo de descrever a gramatica de uma linguagem natural como inglês ou português.
Outra possibilidade é permitir que os valores dos afixos sejam computados por um código escrito em alguma linguagem de programação. Duas abordagens básicas foram usadas:
* Em gramáticas de atributo, os afixos( chamados de atributos) podem ter valores de quaisquer domínios (exemplo: Números inteiros ou reais, estrutura de dados complexa ) e funções arbitrarias que podem ser especificadas, escritas em um linguagem qualquer, para descrever como os valores dos afixos são derivadas uma do outro nas regras.
* Em CDL (O Compilador de Linguagens Descritivas) e seu sucessor CDL2, desenvolvido na década de 1970, fragmentos do código fonte (geralmente na linguagem assembly) podem ser usados em regras, em vez dos normais 'right-hand sides', os lados da mão direita, permitindo que se expresse diretamente primitivos para a digitalização de entrada e computações para os valores dos afixos. Concebido como uma base para a construção prática compilador, esta abordagem foi usada para escrever compiladores e outros softwares, como por exemplo, um editor de texto.