BNF(Backus-Naur Form,巴科斯-诺尔范式)简介
BNF 是一种用于描述编程语言或其他形式语言语法的符号表示法。它通过一组产生式规则来定义语言的结构。BNF被广泛应用于编译原理中,用于精确地描述语言的文法。
BNF的基本组成
-
非终结符(Non-terminal symbols):
- 表示语法规则中的符号,通常用尖括号
< >
括起来。例如:<Expression>
、<Term>
等。 - 非终结符通常在文法定义中递归出现,代表一个语法结构。
- 表示语法规则中的符号,通常用尖括号
-
终结符(Terminal symbols):
- 终结符是文法中不能再被分解的基本符号,表示具体的字符或符号。
- 比如在编程语言中,可能是关键字、操作符、数字、标识符等。
-
产生式规则(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中的递归定义来实现对语法的解析。