BNF
O Formalismo de Backus-Naur (BNF, do inglês Backus-Naur Form ou Backus Normal Form) é uma metassintaxe usada para expressar gramáticas livres de contexto, isto é, um modo formal de descrever linguagens formais.
O que é uma linguagem formal?
O formalismo de Backus-Naur é um sistema formal que foi desenvolvido para descrever a gramática e a sintaxe de uma linguagem de programação. Ele é usado para definir as regras que governam a estrutura dos códigos escritos na linguagem, incluindo os elementos básicos da linguagem (como palavras-chave e operadores) e como eles podem ser combinados para formar sentenças válidas. O formalismo de Backus-Naur é usado para descrever a gramática e a sintaxe de uma ampla variedade de linguagens de programação, incluindo linguagens de alto nível como Python e Java, bem como linguagens de baixo nível como o código de máquina. Ele é um sistema formal útil para descrever a estrutura de uma linguagem de programação de forma precisa e concisa.
O que é uma gramática livre de contexto?
A gramática livre de contexto é uma classe de gramáticas formais que não dependem do contexto em que as palavras aparecem. Isso significa que a gramática livre de contexto pode ser usada para descrever a estrutura de uma linguagem de programação sem se preocupar com o significado das palavras.
Exemplo BNF
A função abaixo é um exemplo de uma função em JavaScript:
function add(a, b) {
return a + b;
}A função acima pode ser descrita em BNF da seguinte forma:
<function> ::= function <identifier> ( <parameter list> ) { <function body> }
<parameter list> ::= <identifier> | <identifier> , <parameter list>
<function body> ::= <statement> | <statement> <function body>
<statement> ::= <assignment statement> | <return statement>Neste exemplo, o símbolo "::=" é usado para indicar a definição de uma regra. As regras são escritas na forma "nome da regra ::= definição da regra". A regra "function" descreve a sintaxe de uma função em JavaScript. Ela começa com a palavra-chave "function", seguida pelo nome da função (que é um identificador), seguida por uma lista de parâmetros entre parênteses e, por fim, pelo corpo da função entre chaves. A regra "parameter list" descreve a sintaxe da lista de parâmetros da função e a regra "function body" descreve a sintaxe do corpo da função. Outros exemplos de BNF:
<assignment statement> ::= <identifier> = <expression> ;
<return statement> ::= return <expression> ;
<expression> ::= <identifier> | <literal> | <operator> ( <expression> , <expression> )
<identifier> ::= <letter> | <identifier> <letter or digit><letter> ::= a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z
<letter or digit> ::= <letter> | <digit>
<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<literal> ::= <integer literal> | <floating point literal> | <string literal> | <boolean literal>
<integer literal> ::= <digit> | <digit> <integer literal>
<floating point literal> ::= <digit> . <digit> <digit> <digit> <digit> <digit> <digit>
<string literal> ::= " <character> " | " <character> <string literal>
<character> ::= <letter> | <digit> | <special character>
<special character> ::= ! | @ | # | $ | % | ^ | & | * | ( | ) | - | _ | + | = | [ | ] | { | } | ; | : | ' | " | , | . | < | > | ? | / | \ | | | ~
<boolean literal> ::= true | false
<operator> ::= + | - | * | / | % | == | != | > | < | >= | <= | && | ||