📜  编译器设计中的BNF表示法

📅  最后修改于: 2021-06-28 07:01:20             🧑  作者: Mango

BNF代表Backus Naur Form表示法。这是一种描述程序设计语言语法的正式方法,John Bakus和Peter Naur于1960年提出了Backus Naur Formas,即Backus NaurFormas。BNF和CFG(上下文无关语法)几乎相同。 BNF可能是主要语言的元语言(一种无法描述另一种语言的语言)。

对于人类食用,一种用于编码语法的适当符号是预期的,称为Backus Naur Form(BNF)。不同的语言具有不同的描述和规则,但BNF的一般结构如下所示–

name ::= expansion

符号:: =表示“可以扩展为”和“可以替换为”。在某些文本中,信誉还称为非终结符。

  • Backus-Naur格式的每个名称都用尖括号<>包围,无论它出现在规则的左侧还是右侧。
  • 扩展是一个包含末端符号和非末端符号的表达式,通过排序和选择将它们连接在一起。
  • 终端符号可以是像(“+”或“函数”)或字面量的类别(如整数)字面量。
  • 简单地将表达式并列表示测序。
  • 竖条|表示选择。

例子 :

 ::=  "+" 
        |  

 ::=  "*" 
        |  

 ::= "("  ")"
          |  

 ::= integer

制作BNF的规则:
自然地,我们将为BNF中的规则定义语法-

rule → name ::= expansion
name → < identifier >
expansion → expansion expansion
expansion → expansion | expansion
expansion → name
expansion → terminal
  • 我们可能会使用正则表达式[-A-Za-z_0-9] +来定义标识符。
  • 终端可以是带引号的字面量(例如“ +”,“ switch”或“ << =”),也可以是字面量类别的名称(例如整数)。
  • 字面量类别的名称通常是通过其他方式定义的,例如日常表达或散文。

在语法内部寻找类似正则表达式的操作是很常见的。例如, Python词汇规范使用了它们。在这些语法中:

postfix * means "repeated 0 or more times"
postfix + means "repeated 1 or more times"
postfix ? means "0 or 1 times"

Python的浮点字面量定义可能是混合几种符号的范例–

floatnumber   ::=  pointfloat | exponentfloat
pointfloat    ::=  [intpart] fraction | intpart "."
exponentfloat ::=  (intpart | pointfloat) exponent
intpart       ::=  digit+
fraction      ::=  "." digit+
exponent      ::=  ("e" | "E") ["+" | "-"] digit+

它不使用名称周围的尖括号(像许多EBNF表示法和ABNF一样),但是使用:: =(例如BNF)。它将常规操作(如+表示非空重复)与EBNF约定(如[]用作选项)混合在一起。整个Python语言的语法使用了一种相当不同的(但仍是常规的)表示法。