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:
twelve = "1", "2" ; two hundred one = "2", "0", "1" ; three hundred twelve = "3", twelve ; twelve thousand two hundred one = twelve, two hundred one ;
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.
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" ;
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
symbol = "[" | "]" | "{" | "}" | "(" | ")" | "<" | ">"
| "'" | '"' | "=" | "|" | "." | "," | ";" ;
character = letter | digit | symbol | "_" ;
identifier = letter , { letter | digit | "_" } ;
terminal = "'" , character , { character } , "'"
| '"' , character , { character } , '"' ;
lhs = identifier ;
rhs = identifier
| terminal
| "[" , rhs , "]"
| "{" , rhs , "}"
| "(" , rhs , ")"
| rhs , "|" , rhs
| rhs , "," , rhs ;
rule = lhs , "=" , rhs , ";" ;
grammar = { rule } ;
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.
Ver também
- Expressão regular
- Spirit Parser Framework
- Regras de estrutura frasal, o direto equivalente a EBNF nas linguagens naturais.
Ligações externas
- Niklaus Wirth: What can we do about the unnecessary diversity of notation for syntactic definitions? CACM, Vol. 20, Issue 11, November 1977, pp. 822–823.
- Roger S. Scowen: Extended BNF — A generic base standard. Software Engineering Standards Symposium 1993.
- A ISO 14977que define a EBNF está disponível como arquivo PDF comprimido.