BNF(Backus-Naur Form,巴科斯-诺尔范式)简介

BNF 是一种用于描述编程语言或其他形式语言语法的符号表示法。它通过一组产生式规则来定义语言的结构。BNF被广泛应用于编译原理中,用于精确地描述语言的文法。

BNF的基本组成

  1. 非终结符(Non-terminal symbols)

    • 表示语法规则中的符号,通常用尖括号 < > 括起来。例如:<Expression><Term> 等。
    • 非终结符通常在文法定义中递归出现,代表一个语法结构。
  2. 终结符(Terminal symbols)

    • 终结符是文法中不能再被分解的基本符号,表示具体的字符或符号。
    • 比如在编程语言中,可能是关键字、操作符、数字、标识符等。
  3. 产生式规则(Production Rules)

    • 定义了非终结符如何被其他符号(包括终结符和非终结符)替换。
    • 产生式通常的表示形式为:
      <非终结符> ::= <表达式>
      其中 ::= 读作“定义为”,即将左侧的非终结符展开为右侧的内容。

BNF符号说明

  • 尖括号 < >:用来标识非终结符。
  • 引号 " ":用来标识终结符。
  • 递归定义:非终结符可以在其右侧的产生式中再次出现,允许递归表达复杂结构。
  • |:表示“或”,用于列出多个替代选项。
  • *:表示重复零次或多次。
    例如,<Expression> ::= <Expression> "+" <Term> | <Expression> "-" <Term> 表示表达式可以是加法或减法。
  • +:表示至少一次。
    例如,<Expression> ::= <Term> "+" <Term>+ 表示表达式至少有一个加法。

JavaScript的BNF示例

虽然 JavaScript 的完整 BNF 定义非常复杂,但可以通过一个简单的四则运算表达式示例来说明其结构。

四则运算表达式的BNF示例:

<Expression> ::= <AdditiveExpression>

<AdditiveExpression> ::= <MultiplicativeExpression>
                      | <AdditiveExpression> "+" <MultiplicativeExpression>
                      | <AdditiveExpression> "-" <MultiplicativeExpression>

<MultiplicativeExpression> ::= <Number>
                              | <MultiplicativeExpression> "*" <Number>
                              | <MultiplicativeExpression> "/" <Number>

<Number> ::= [0-9]+

解析

在这个例子中:

  • <Expression><AdditiveExpression><MultiplicativeExpression> 是非终结符,它们代表更高层次的语法结构。
  • +-*/ 是终结符,代表运算符。
  • <Number> 是终结符,表示数字。
  • 每条规则定义了如何从非终结符逐步展开为具体的表达式。

例如, <AdditiveExpression> 可以是一个 MultiplicativeExpression,也可以是一个加法或减法操作符连接的两个 MultiplicativeExpression,这展示了递归和组合的特性。

BNF的核心作用

  • 递归定义:通过递归的方式,BNF能够清晰地定义语言的语法结构。例如,一个表达式可以包含其他表达式,这使得BNF能够处理层次结构复杂的语言。
  • 语言规范化:通过产生式规则,BNF提供了一种规范化的方式来精确描述编程语言的语法,便于编译器或解释器的实现。
  • 递归下降解析:BNF广泛应用于解析器的构造,尤其是递归下降解析方法,它直接利用BNF中的递归定义来实现对语法的解析。