《Go编程语言规范》第二章,Notation 表示法中提到提到的EBNF是什么?
- for语句的EBNF示例
- EBNF
- 原始 BNF(巴科斯 - 瑙尔范式)是什么
- 对 BNF 的 “扩展” 内容
- Go编程语言规范基于 EBNF
for语句的EBNF示例
在Go语言中对For语句语法的说明如下:
ForStmt = "for" [ Condition | ForClause | RangeClause ] Block .
Condition = Expression .
其中各个符号的具体含义如下:
ForStmt = "for" [ Condition | ForClause | RangeClause ] Block .
ForStmt For语句产生式
= 是(等同)
"for" 终结符for,终结符表示不可拆解的意思,换句话说,就是for是个独立的关键字
[] 可选项,0或1项
| 或
[ Condition | ForClause | RangeClause ] Condition,ForClause,RangeClause中三选一
Condition 条件
ForClause For子句
RangeClause Range子句
Block 代码块
.
Condition = Expression .
Condition 条件产生式
= 是(等同)
Expression 表达式
从定义可以看出来For语句开始于for关键字,后跟条件表达式、或for子句、或Range子句,然后是代码块。
这种描述语言语法的语言称为:EBNF,Extended Backus-Naur Form,扩展巴科斯 - 瑙尔范式。
EBNF
扩展巴科斯 - 瑙尔范式,顾名思义,就是在巴科斯 - 瑙尔范式的基础上,进行扩展,而得到EBNF。
原始 BNF(巴科斯 - 瑙尔范式)是什么
BNF 是 1959 年由约翰・巴科斯(John Backus)和彼得・瑙尔(Peter Naur)提出的,是第一个标准化的语法描述工具,核心用于定义编程语言的语法规则(最早用于描述 Algol 60 语言)。
原始 BNF 只有最基础的符号,表达能力有限。原始 BNF 没有描述 “重复”“可选”“分组” 的符号,只能通过递归或冗余规则实现,代码冗余且可读性差。
对 BNF 的 “扩展” 内容
EBNF(最早由 Niklaus Wirth 定义,后被 ISO 14977 标准化)在 BNF 基础上新增了5 类核心符号,解决了 BNF 的表达能力不足问题。包括 {}(重复)、[](可选)、()(分组)等符号。
Go编程语言规范基于 EBNF
// 语法是使用Extended Backus-Naur形式(EBNF)的变体描述
Syntax = { Production } .
Production = production_name "=" [ Expression ] "." .
Expression = Term { "|" Term } .
Term = Factor { Factor } .
Factor = production_name | token [ "…" token ] | Group | Option | Repetition .
Group = "(" Expression ")" .
Option = "[" Expression "]" .
Repetition = "{" Expression "}" .
// 产生式是由术语和以下操作符构造的表达式,优先级依次递增
| alternation
() grouping
[] option (0 or 1 times)
{} repetition (0 to n times)
其中,Production,产生式,在编程语言语法定义 中,产生式(Production) 是描述语法规则的最基本单元—— 简单说,产生式就是一条 “符号替换规则”,定义了 “一个语法结构可以由哪些成分组成”。
有了这些,在描述Go语法时,就有了标准,不用完全依赖自然语言。