BNF significa Backus Naur Form notation. É um método formal para descrever a sintaxe da linguagem de programação que é entendida como Backus Naur Formas introduzido por John Bakus e Peter Naur em 1960. BNF e CFG (Context Free Grammar) eram quase idênticos. BNF pode ser uma meta-linguagem (uma linguagem que não pode descrever outra linguagem) para línguas primárias. 

Para o consumo humano, uma notação adequada para codificação de gramáticas é pretendida e denominada Backus Naur Form (BNF). Idiomas diferentes têm descrições e regras diferentes, mas a estrutura geral do BNF é fornecida abaixo - 

name ::= expansion

O símbolo::= significa “pode expandir para” e “pode ser substituído por.” Em alguns textos, uma reputação é adicionalmente chamada de símbolo não terminal. 

  • Cada nome na forma Backus-Naur é cercado por colchetes angulares, <>, quer apareça no lado esquerdo ou direito da regra. 

     

  • Uma expansão é uma expressão que contém símbolos terminais e não terminais, unidos por sequenciamento e seleção. 

     

  • Um símbolo de terminal pode ser um literal como (“+” ou “função”) ou uma categoria de literais (como inteiro). 

     

  • A simples justaposição de expressões indica sequenciamento. 

     

  • Uma barra vertical | indica escolha. 

    Exemplos :  

<expr> ::= <term> "+" <expr>
        |  <term>

<term> ::= <factor> "*" <term>
        |  <factor>

<factor> ::= "(" <expr> ")"
          |  <const>

<const> ::= integer

Regras para fazer BNF: 
Naturalmente, vamos definir uma gramática para regras em BNF - 
 

rule → name ::= expansion
name → < identifier >
expansion → expansion expansion
expansion → expansion | expansion
expansion → name
expansion → terminal
  • Podemos definir identificadores como usando a expressão regular [-A-Za-z_0-9] +. 

     

  • Um terminal pode ser um literal entre aspas (como “+”, “switch” ou ”“ << = ”) ou o nome de uma categoria de literais (como inteiro). 

     

  • O nome de uma categoria de literais é normalmente definido por outros meios, como uma expressão diária ou talvez prosa. 

    É comum buscar operações semelhantes a expressões regulares dentro de gramáticas. como exemplo, a especificação lexical Python os usa. Nessas gramáticas: 
     

postfix * means "repeated 0 or more times"
postfix + means "repeated 1 or more times"
postfix ? means "0 or 1 times"

A definição de literais de ponto flutuante em Python pode ser um exemplo de mistura de várias notações - 

floatnumber   ::=  pointfloat | exponentfloat
pointfloat    ::=  [intpart] fraction | intpart "."
exponentfloat ::=  (intpart | pointfloat) exponent
intpart       ::=  digit+
fraction      ::=  "." digit+
exponent      ::=  ("e" | "E") ["+" | "-"] digit+

Ele não usa colchetes angulares em torno dos nomes (como muitas notações EBNF e ABNF), mas usa::= (como BNF). Ele mistura operações regulares como + para repetição não vazia com convenções EBNF como [] para opção. A gramática para toda a linguagem Python usa uma notação bastante diferente (mas ainda regular).