Backus-Naur Form (BNF) é uma sintaxe para descrever uma sintaxe. É usado para escrever uma representação formal de uma gramática livre de contexto. Se ele não soar abstrato o suficiente para você, uma gramática não tem que ser uma linguagem de programação, ou até uma linguagem humana – ela pode ser qualquer sintaxe que você queira descrever.
Eu descobri o BNF pela primeira vez ao trabalhar no padrão ANSI de 1992 para DBOL, que continha uma especificação sintática BNF completa para aquela linguagem (eram 11 páginas). O exercício para definir a linguagem em BNF ajudou o comitê a rigorosamente definir os detalhes da sua sintaxe. Um dos implentadores da linguagem também alimentou este BNF para outro Yet Another Compiler Compiler (yacc) para ajudar a construir seu compilador para sua próxima versão, para que eles pudessem garantir que ele fosse compilado sintaticamente com a especificação. É aí que o BNF se destaca: uma vez que você tem uma definição sintática bastante sólida em BNF, você pode usar ferramentas para analisar rigorosamente a sintaxe que ele descreve, sem ter que inventar o código que implementa a especificação, ou se apoiar em expressões regulares.
O BNF usa uma sintaxe declarativa que permite que você defina seus temos via “regras de produção’. Cada regra contém termos em que cada um deles tem mais regras concretas, até que você chegue nos “terminais”, que são termos em que você somente pode descrever como caracteres específicos (valores literais). Assim, por exemplos, se quiséssemos descrever a sintaxe para chamar uma shell de comandos chamada “fred”, que precisa de um valor numérico não negativo como seu argumento, poderíamos expressá-lo assim: