Emteoria das linguagens formais, umagramática formal (algumas vezes simplesmente chamada degramática) é um conjunto deregras de produção decadeias em umalinguagem formal, ou seja, um objeto que permite especificar uma linguagem ou língua. As regras descrevem como formar cadeias ― a partir doalfabeto da linguagem ― que são válidas de acordo com asintaxe da linguagem. Uma gramática não descrevesignificado das cadeias ou o que pode ser feito com elas em um contexto ― apenas suas formas.
A expressão "gramática formal" pode ter os sentidos:
ATeoria da Linguagem Formal, disciplina que estuda gramáticas e linguagens formais, é um ramo daMatemática Aplicada. Suas aplicações podem ser encontradas naCiência da Computação Teórica,Linguística Teórica,Semântica Formal,Matemática Lógica, entre outras áreas.
Uma gramática formal é um conjunto de regras para se reescrever cadeias, tomando como partida um símbolo inicial, do qual se começa a reescrita. Portanto, uma gramática é normalmente encarada como um gerador de linguagem. Entretanto, ela também pode ser usada como uma base para umreconhecedor ― uma função em computação que determina se uma dada cadeia pertence à linguagem ou está gramaticalmente incorreta. Para descrever tais reconhecedores, a teoria da linguagem formal usa formalismos distintos, conhecidos comoTeoria dos Autômatos. Um dos resultados mais interessantes da teoria dos autômatos é que não é possível desenhar um reconhecedor para certas linguagens formais.
Análise sintática é o processo de reconhecer uma elocução (cadeia emlinguagem natural) quebrando-a em um conjunto de símbolos e analisando cada um de acordo com a gramática da linguagem. O significado das elocuções da maioria das linguagens está estruturado conforme a sintaxe de tal linguagem — prática conhecida comosemântica composicional. Como resultado, o primeiro passo para descrever o significado de uma elocução de uma linguagem é quebrá-la parte por parte, e verificar a sua forma analítica (conhecida como "árvore de análise" em Ciência da Computação, e como "estrutura profunda" emgramática gerativa).
Uma gramática consiste, principalmente, de um conjunto de regras para transformação de cadeias. (Se elaapenas consistisse dessas regras, ela seria considerada umsistema semi-Thue). Para gerar uma cadeia na linguagem, começa-se com uma cadeia que consiste em apenas umsímbolo inicial. Asregras de produção são, então, aplicadas em uma ordem qualquer, até que uma cadeia que não contenha nem osímbolo inicial, nem os chamadossímbolos não terminais, seja produzida. Uma regra de produção é aplicada a uma cadeia substituindo-se uma ocorrência do lado esquerdo da gramática por uma do lado direito. A linguagem formada pela gramática consiste em todas as cadeias distintas que podem ser geradas dessa forma. Qualquer sequência particular de regras de produção sobre o símbolo inicial produz uma cadeia distinta na linguagem. Se existem várias maneiras de gerar a mesma cadeia, a gramática é chamada deambígua.
Por exemplo, assumimos que o alfabeto consiste dea eb, o símbolo inicial éS, e temos as seguintes regras de produção:
Então começamos comS, e podemos escolher uma regra para aplicar a ele. Se nós escolhermos a regra 1, obteríamos a cadeiaaSb. Se nós escolhermos a regra 1 outra vez, nós substituiríamos oSdoaSbporaSb, e obteríamos a cadeiaaaSbb. Se agora nós escolhermos a regra 2, nós substituiríamos oS doaaSbb porba e obteríamos a cadeiaaababb,terminando o processo. Nós podemos escrever essa série de escolhas mais sucintamente, usando símbolos:. A linguagem da gramática é, então, o conjunto infinito, em queak éa repetidok vezes (en, em particular, representa o número de vezes que a regra de produção 1 foi aplicada).
Na formalização de gramáticas generativas primeiramente proposta porNoam Chomsky nos anos de 1950,[1][2] uma gramáticaG era composta pelos seguintes componentes:
Uma gramática é formalmente definida como umatupla. Tal gramática formal é, às vezes,chamada de sistema de reescrita ou de gramática de estrutura de frase na Literatura.[3][4]
A operação sobre uma gramática pode ser definida em termos das relações entre cadeias:
Note que a gramática é efetivamente umsistema semi-Thue, pois reescreve cadeias exatamente do mesmo jeito; a única diferença está no fato de que nós distinguimos especificamente símbolos não terminais que devem ser reescritos nas regras de reescrita, e estamos apenas interessados em reescritas a partir do símbolo inicial designado para cadeias sem símbolos não terminais.
Para esses exemplos, as linguagens formais estão especificadas utilizando a notação de construção de conjuntos.
Considere a gramática onde,, é o símbolo inicial, e é composto pelas seguintes regras de produção:
Essa gramática define a linguagem onde denota uma cadeia formada porn consecutivos's. Dessa forma, a linguagem é o conjunto de cadeias que é composta por um ou mais's, seguidos pelo mesmo número de's, seguidos pelo mesmo número de's.
Alguns exemplos de derivação de cadeias em são:
QuandoNoam Chomsky formalizou as gramáticas generativas pela primeira vez em 1956,[1] ele as classificou em tipos hoje conhecidos como pertencentes à hierarquia de Chomsky. A diferença entre esses tipos é que eles têm cada vez mais rigorosas regras de produção e podem expressar menos linguagens formais. Dois importantes tipos sãogramáticas livres de contexto (Tipo 2) egramáticas regulares (Tipo 3). As linguagens que podem ser descritas com tais gramáticas são chamadaslinguagens livres de contexto elinguagens regulares, respectivamente. Apesar de menos poderosas quegramáticas irrestritas (Tipo 0), que podem, na verdade, expressar qualquer linguagem que pode ser aceita por umaMáquina de Turing, esses dois tipos restritos de gramática são mais frequentemente usados porque analisadores para eles podem ser eficientemente implementados.[5] Por exemplo, todas linguagens regulares podem ser reconhecidas por umamáquina de estados finitos, e para alguns subconjuntos úteis de gramáticas de livre-contexto existem algoritmos bem conhecidos para gerar analisadores sintáticos eficientes para reconhecer as linguagens correspondentes às gramáticas geradas.
Umagramática livre de contexto é uma gramática em que o lado esquerdo de cada regra de produção é formado apenas por um único símbolo não terminal. Essa restrição é não trivial; nem todas as linguagens podem ser geradas por gramáticas livre de contexto. As que podem são chamadas delinguagens livre de contexto.
A linguagem definida abaixo não é uma linguagem livre de contexto, e isso pode ser rigorosamente provado utilizando olema do bombeamento para linguagens livres de contexto, mas, por exemplo, a linguagem (pelo menos 1 seguido pelo mesmo número de's) é livre de contexto, pois pode ser definida por uma gramática com,, símbolo inicial, e as seguintes regras de produção:
Uma linguagem livre de contexto pode ser reconhecida em tempo (veja:notação Big O) por um algoritmo comoalgoritmo de Earley. Isso significa que, para toda linguagem livre de contexto, uma máquina cuja entrada é uma cadeia pode ser construída, determinando em tempo se a cadeia é membro da linguagem, onde é o comprimento da cadeia.[6] Linguagens determinísticas livres de contexto são umsubconjunto de linguagens livres de contexto que podem ser reconhecidas em tempo linear.[7] Existem vários algoritmos que se focam nesse conjunto de linguagens ou algum subconjunto dele.
Nasgramáticas regulares, o lado esquerdo é composto unicamente por símbolos não terminais, mas o lado direito também é restrito. O lado direito pode ser a cadeia vazia, ou um simples símbolo terminal, ou um símbolo terminal seguido de um símbolo não terminal e nada mais. (às vezes é usada uma definição mais ampla: pode-se permitir cadeias mais longas de terminais ou únicos não terminais sem nada mais, tornando as linguagens mais fáceis de se denotar).
A linguagem definida abaixo não é regular, mas a linguagem (pelo menos um seguido por pelo menos um, onde os números podem ser diferentes) é, já que pode ser definida pela gramática com,, o símbolo inicial, e as seguintes regras de produção:
Todas as linguagens geradas por gramáticas regulares podem ser reconhecidas em tempo linear por umamáquina de estados finitos. Contudo, na prática, gramáticas regulares são comumente expressas usandoexpressões regulares. Algumas formas de expressão regular usadas na prática não geram rigorosamente linguagens regulares e não apresentam performance linear de reconhecimento devido a aquelas divergências.
Muitas extensões e variações sobre a hierarquia original de Chomsky de gramáticas formais têm sido desenvolvidas, tanto pelos linguistas quanto pelos cientistas da computação, usualmente com o objetivo de aumentar seu poder de expressividade ou de torná-las mais facilmente analisáveis. Algumas formas de gramática desenvolvidas incluem:
Não se confunda comlinguagem recursiva
Uma gramática recursiva é uma gramática que contém regras de produção que sãorecursivas. Por exemplo, uma gramática para umalinguagem livre de contexto é recursiva à esquerda se existe símbolo não terminalA que pode ser colocado através das regras de produção para produzir uma cadeia comA como o símbolo mais à esquerda.[12] Todos os tipos de gramática daHierarquia de Chomsky podem ser recursivas.
Apesar de haver um enorme estoque de literatura sobrealgoritmos deanálise sintática, a maioria desses algoritmos assume que a linguagem a ser analisada é, inicialmente,descrita por meio de uma gramática formalgenerativa, e que o objetivo é transformar essa gramática em um analisador sintático que funciona. Ou seja, uma gramática generativa não corresponde, de maneira alguma, ao algoritmo usado para analisar uma linguagem, e vários algoritmos têm restrições diferentes sobre a forma de regras de produção que são consideradas bem formadas.
Uma abordagem alternativa é formalizar a linguagem em termos de uma gramática analítica, o que corresponderia mais diretamente à estrutura e semântica de um analisador sintático para a linguagem. Exemplos de formalismos de gramática analítica incluem os seguintes: