Notação BNF no projeto do compilador
BNF significa Backus Naur Form notation. É um método formal para descrever a sintaxe da linguagem de programação que é entendida como Backus Naur Formas introduzido por John Bakus e Peter Naur em 1960. BNF e CFG (Context Free Grammar) eram quase idênticos. BNF pode ser uma meta-linguagem (uma linguagem que não pode descrever outra linguagem) para línguas primárias.
Para o consumo humano, uma notação adequada para codificação de gramáticas é pretendida e denominada Backus Naur Form (BNF). Idiomas diferentes têm descrições e regras diferentes, mas a estrutura geral do BNF é fornecida abaixo -
name ::= expansion
O símbolo::= significa “pode expandir para” e “pode ser substituído por.” Em alguns textos, uma reputação é adicionalmente chamada de símbolo não terminal.
- Cada nome na forma Backus-Naur é cercado por colchetes angulares, <>, quer apareça no lado esquerdo ou direito da regra.
- Uma expansão é uma expressão que contém símbolos terminais e não terminais, unidos por sequenciamento e seleção.
- Um símbolo de terminal pode ser um literal como (“+” ou “função”) ou uma categoria de literais (como inteiro).
- A simples justaposição de expressões indica sequenciamento.
- Uma barra vertical | indica escolha.
Exemplos :
<expr> ::= <term> "+" <expr> | <term> <term> ::= <factor> "*" <term> | <factor> <factor> ::= "(" <expr> ")" | <const> <const> ::= integer
Regras para fazer BNF:
Naturalmente, vamos definir uma gramática para regras em BNF -
rule → name ::= expansion name → < identifier > expansion → expansion expansion expansion → expansion | expansion expansion → name expansion → terminal
- Podemos definir identificadores como usando a expressão regular [-A-Za-z_0-9] +.
- Um terminal pode ser um literal entre aspas (como “+”, “switch” ou ”“ << = ”) ou o nome de uma categoria de literais (como inteiro).
- O nome de uma categoria de literais é normalmente definido por outros meios, como uma expressão diária ou talvez prosa.
É comum buscar operações semelhantes a expressões regulares dentro de gramáticas. como exemplo, a especificação lexical Python os usa. Nessas gramáticas:
postfix * means "repeated 0 or more times" postfix + means "repeated 1 or more times" postfix ? means "0 or 1 times"
A definição de literais de ponto flutuante em Python pode ser um exemplo de mistura de várias notações -
floatnumber ::= pointfloat | exponentfloat pointfloat ::= [intpart] fraction | intpart "." exponentfloat ::= (intpart | pointfloat) exponent intpart ::= digit+ fraction ::= "." digit+ exponent ::= ("e" | "E") ["+" | "-"] digit+
Ele não usa colchetes angulares em torno dos nomes (como muitas notações EBNF e ABNF), mas usa::= (como BNF). Ele mistura operações regulares como + para repetição não vazia com convenções EBNF como [] para opção. A gramática para toda a linguagem Python usa uma notação bastante diferente (mas ainda regular).
As postagens do blog Acervo Lima te ajudaram? Nos ajude a manter o blog no ar!
Faça uma doação para manter o blog funcionando.
70% das doações são no valor de R$ 5,00...
Diógenes Lima da Silva