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 editar

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

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

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

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

Ver também editar

Ligações externas editar