diff --git a/src/SUMMARY.md b/src/SUMMARY.md index faca237..1306853 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -6,6 +6,7 @@ - [Go 语言简介](./preguide/intro.md) - [环境安装与配置](./preguide/installation.md) - [不一样的编程思路](./preguide/codex.md) + - [Extended Backus-Naur Form](./preguide/enbf.md) - [基本命令](./basic-cmd/index.md) - [go mod](./basic-cmd/mod.md) - [go get](./basic-cmd/get.md) @@ -13,10 +14,13 @@ - [go build](./basic-cmd/build.md) - [go install](./basic-cmd/install.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 基本语法]() - [基本数据类型]() - [表达式]() diff --git a/src/preguide/enbf.md b/src/preguide/enbf.md new file mode 100644 index 0000000..be47c97 --- /dev/null +++ b/src/preguide/enbf.md @@ -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`这样的结构。