post:增加ENBF语法规则定义说明。
This commit is contained in:
parent
07d49fbdd3
commit
1f2303bd25
@ -6,6 +6,7 @@
|
|||||||
- [Go 语言简介](./preguide/intro.md)
|
- [Go 语言简介](./preguide/intro.md)
|
||||||
- [环境安装与配置](./preguide/installation.md)
|
- [环境安装与配置](./preguide/installation.md)
|
||||||
- [不一样的编程思路](./preguide/codex.md)
|
- [不一样的编程思路](./preguide/codex.md)
|
||||||
|
- [Extended Backus-Naur Form](./preguide/enbf.md)
|
||||||
- [基本命令](./basic-cmd/index.md)
|
- [基本命令](./basic-cmd/index.md)
|
||||||
- [go mod](./basic-cmd/mod.md)
|
- [go mod](./basic-cmd/mod.md)
|
||||||
- [go get](./basic-cmd/get.md)
|
- [go get](./basic-cmd/get.md)
|
||||||
@ -13,10 +14,13 @@
|
|||||||
- [go build](./basic-cmd/build.md)
|
- [go build](./basic-cmd/build.md)
|
||||||
- [go install](./basic-cmd/install.md)
|
- [go install](./basic-cmd/install.md)
|
||||||
- [go generate](./basic-cmd/generate.md)
|
- [go generate](./basic-cmd/generate.md)
|
||||||
- [项目基本结构]()
|
- [项目基本结构](./project-structure/index.md)
|
||||||
- [创建一个项目]()
|
- [创建一个项目](./project-structure/create.md)
|
||||||
- [用包来组织代码]()
|
- [用包来组织代码](./project-structure/package.md)
|
||||||
- [可见性]()
|
- [可见性](./project-structure/visiblity.md)
|
||||||
|
- [Go Module]()
|
||||||
|
- [go.mod 的组织]()
|
||||||
|
- [依赖版本的发布]()
|
||||||
- [Go 基本语法]()
|
- [Go 基本语法]()
|
||||||
- [基本数据类型]()
|
- [基本数据类型]()
|
||||||
- [表达式]()
|
- [表达式]()
|
||||||
|
45
src/preguide/enbf.md
Normal file
45
src/preguide/enbf.md
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
# Extended Backus-Naur Form (ENBF)
|
||||||
|
|
||||||
|
Backus-Naur Form (BNF)是一种用于描述编程语言语法的元语言。Extended Backus-Naur Form 是它的一个扩展版本。Go 采用 ENBF 来定义它的语言规范,在 Go 语言官网的语言规范中可以大量的看到 ENBF 的定义。本书中也将直接利用 Go 语言规范中的 ENBF 定义,来说明 Go 中各个语言功能的使用,以确保所有说明的准确。
|
||||||
|
|
||||||
|
## ENBF 的基本语法
|
||||||
|
|
||||||
|
以下是 ENBF 的一个基本语法列表,这个列表也是使用 ENBF 语法定义的。
|
||||||
|
|
||||||
|
```
|
||||||
|
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 "}" .
|
||||||
|
```
|
||||||
|
|
||||||
|
这个基本语法列表其实不难理解。`=`定义了左侧这个标识所代表的含义,结尾的`.`表示一条规则定义的结束。其中的`|`符号表示可能性的组合,意为左侧的内容可能是被`|`组合的其中一项。`()`符号表示分组,`[]`表示可选项,即 0 或 1 的选择,`{}`表示循环,即反复出现 0 到 n 次。
|
||||||
|
|
||||||
|
例如上面这个定义中的`Syntax`就是由`Production`内容连续重复多次形成的。
|
||||||
|
|
||||||
|
定义中使用`""`包裹起来的内容都是字符串,是需要原封不动的用在语言中的。
|
||||||
|
|
||||||
|
这里从最基础的单元开始简单解释一下上面这个定义中的内容。
|
||||||
|
|
||||||
|
1. 最基础的单元是`Factor`,它可以是一下这么几种内容:定义规则名称(`production_name`)、标识序列(`token`或者`toekn ... token`)、分组内容、可选内容和重复内容。
|
||||||
|
1. `Term`是由至少一个`Factor`组成的。
|
||||||
|
1. `Expression`是由至少一个`Term`或者多个`Term`通过`|`符号连接起来的。
|
||||||
|
1. 分组内容就是用`()`包裹`Expression`。
|
||||||
|
1. 可选内容就是用`[]`包裹`Expression`。
|
||||||
|
1. 重复内容就是用`{}`包裹`Expression`。
|
||||||
|
1. 每一个规则定义`Production`都是使用`=`定义的,`=`左侧是规则的名称,右侧可以是`Expression`,整个定义使用`.`结束。
|
||||||
|
1. 整个语法规则`Syntax`是由若干的`Production`组合起来的。
|
||||||
|
|
||||||
|
以下借用 Go 中对于整型数值的定义来详细说明 ENBF 在 Go 语言规范定义中是如何使用的。
|
||||||
|
|
||||||
|
```
|
||||||
|
decimal_lit = "0" | ( "1" ... "9" ) [ [ "_" ] decimal_digits ] .
|
||||||
|
decimal_digits = decimal_digit { [ "_" ] decimal_digit } .
|
||||||
|
decimal_digit = "0" ... "9" .
|
||||||
|
```
|
||||||
|
|
||||||
|
首先看其中第一条规则,`decimal_lit`按照规则,可以是`0`或者`1`到`9`的数字开头的,可以由`_`分隔的数字。而组成`decimal_lit`的`decimal_degits`则是由数字和`_`循环组成的。所以在 Go 中,一个整型数字可以是`0_382_3453_25`这样的结构。
|
Loading…
x
Reference in New Issue
Block a user