Formalismo de Backus-Naur Estendido

Origem: Wikipédia, a enciclopédia livre.

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[editar | editar código-fonte]

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[editar | editar código-fonte]

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[editar | editar código-fonte]

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[editar | editar código-fonte]

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[editar | editar código-fonte]

Ver também[editar | editar código-fonte]

Ligações externas[editar | editar código-fonte]