# Formalismo de Backus-Naur Estendido

Em ciência da computação, Formalismo de Backus-Naur Estendido (também conhecido como EBNF) é uma família de notações meta-sintaxe, qualquer que pode ser usado para expressar uma gramática livre de contexto. EBNF é usado para fazer uma descrição formal de uma linguagem formal que pode ser uma linguagem de programação. Eles são extensões da meta-sintaxe do Formalismo de Backus-Naur básico (BNF).
A primeira EBNF foi originalmente desenvolvida por Niklaus Wirth incorporando alguns dos conceitos (com uma sintaxe e notação diferente) de notação de sintaxe Wirth. No entanto, muitas variantes de EBNF estão em uso. A Organização Internacional de Normalização adotou um padrão EBNF (ISO / IEC 14977). Este artigo usa EBNF conforme especificado pela ISO para exemplos aplicáveis a todos os EBNFs. Outras variantes de EBNF usam convenções sintáticas de algum modo diferentes.

## Noções básicas

EBNF é um código que expressa a gramática de uma língua formal. Uma EBNF consiste símbolos terminais e regras de produção não-terminais que são as restrições relativas como símbolos terminais podem ser combinados em uma sequência válida. Exemplos de símbolos terminais incluem caracteres alfanuméricos, sinais de pontuação e caracteres de espaço em branco.
O EBNF define regras de produção, onde sequências de símbolos são, respectivamente, atribuídos a um não-terminal:
digit excluding zero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ; digit = "0" | digit excluding zero ;
Esta regra de produção define o dígito não terminal que está no lado esquerdo da atribuição. A barra vertical representa uma alternativa e os símbolos terminais são colocados entre aspas, seguido por um ponto e vírgula como caractere de terminação. Assim, um dígito é um 0 ou um dígito excluindo zero, que pode ser 1, 2 ou 3 e assim sucessivamente até 9.
A regra de produção também pode incluir uma sequência de terminais ou não-terminais, cada um separado por uma vírgula:
Expressões que podem ser omitidas ou repetidas pode ser representadas através de chaves {... }:
natural number = digit excluding zero, { digit } ;
Neste caso, as cadeias 1, 2, ..., 10, ..., 12345, ... são expressões corretas.Para representar isso, tudo o que é definido dentro das chaves pode ser repetido muitas vezes arbitrariamente, incluindo de modo nenhum.
Uma opção pode ser representada através de suportes quadrados [... ]. Ou seja, tudo o que for definido dentro dos colchetes pode estar presente apenas uma vez, ou de modo nenhum:
integer = "0" | [ "-" ], natural number ;
Portanto um inteiro é um zero (0) ou um número natural que pode ser precedido por um sinal de menos opcional. EBNF também fornece, entre outras coisas, a sintaxe para descrever as repetições de um determinado número de vezes, de excluir uma parte de uma produção, ou para inserir comentários em uma gramática EBNF.

### Tabela de símbolos

| Uso | Notação |
| definição | = |
| concatenação | , |
| terminação | ; |
| alternância | | |
| opção | [ ... ] |
| repetição | { ... } |
| agrupamento | ( ... ) |
| string terminal | " ... " |
| string terminal | ' ... ' |
| comentário | (* ... *) |
| sequência especial | ? ... ? |
| exceção | - |

### Exemplos

Até mesmo a EBNF pode ser descrita em EBNF. Considere o exemplo a seguir, que representa uma proposta de norma ISO / IEC 14977, por RS Scowen, página 3, tabela 1.

## Vantagens sobre BNF

Qualquer gramática definida na EBNF também pode ser representado em BNF embora representações em que nestes são geralmente mais longas. Por exemplo, as opções e as repetições não podem ser expressas diretamente em BNF e exigem o uso de um intermediário ou de produção regra alternativa definida para ser nada ou a produção opcional para a opção, ou seja a produção em si ou repetida, de forma recursiva, por repetição. As mesmas construções podem ainda ser utilizadas em EBNF.
A BNF usa os símbolos ( "<",">", "|", "::" "=" ) para si, mas não inclui aspas nas cadeias de caracteres terminais. Isso evita que esses caracteres sejam usadas nas linguagens, e requer um símbolo especial para a cadeia vazia. Em EBNF, terminais são estritamente entre aspas — "..." ou '...'. Os símbolos "<...>" para não-terminais podem ser omitidos. A Sintaxe BNF só pode representar uma regra em uma linha, enquanto que em EBNF um caractere de terminação, o ponto e vírgula, marca o fim de uma regra. Além disso, EBNF inclui mecanismos para melhorias, definindo o número de repetições, excluindo alternativas, comentários, etc.

## Trabalhos relacionados

* A W3C usou uma EBNF distinta para especificar a sintaxe da XML.
* O British Standards Institution publicou um padrão para uma EBNF: BS 6154 em 1981.
* A IETF usa a Augmented BNF (ABNF) specified in RFC 5234.