欢迎来到计算机语法世界!
你有没有想过,计算机是如何知道 "print('Hello')" 这样的程序代码是正确的,但 "print Hello'" 却是错误的呢?就像英文有语法规则一样,编程语言也有语法 (Syntax) 规则。在本章中,我们将学习描述这些规则的两种方式:语法图 (Syntax Diagrams)(可视化方式)和 巴科斯-诺尔范式 (Backus-Naur Form, 简称 BNF)(文字化方式)。
如果一开始觉得有点棘手,别担心!把这些想象成语言的「食谱」。一旦你学会了这些秘密符号,你就能像专业人士一样轻松阅读和编写这些规则了。
预备概念:语法 (Syntax) 指的仅仅是「游戏规则」,即规定如何在特定语言中排列单词和符号。
1. 语法图 (Syntax Diagrams)
语法图是一种以可视化方式呈现编程语言规则的方法,就像地图或流程图一样。你只需要从左到右跟着箭头走,就能知道什么是合法的结构。
如何阅读地图
你需要认识两种主要的图形:
1. 圆形或椭圆形: 这些代表终结符 (Terminals)。这是「路的尽头」,也就是出现在程序代码中的实际字符或单词(例如分号 ; 或单词 IF)。
2. 矩形: 这些代表非终结符 (Non-terminals)。这是其他规则的「占位符」。如果你看到一个标示为「数字 (Digit)」的矩形,这意味着你需要去查看「数字」这条规则,看看该填入什么内容。
类比:想象一张制作三明治的地图。
- 圆形可能写着 "番茄"(你只需要在那里放上番茄)。
- 矩形可能写着 "面包"(你必须根据另一条规则来决定要用哪种面包)。
路径与选择
- 直线: 你必须按照这个顺序进行。
- 分支: 如果线路分岔,你可以选择走哪条路。这代表一种 OR(或)的选择。
- 循环: 如果线路在图形上方往回绕,这意味着你可以随意重复该部分内容。
快速回顾:
- 椭圆形/圆形: 实际值(终结符)。
- 矩形: 另一条规则(非终结符)。
- 箭头: 你必须行进的方向。
2. 巴科斯-诺尔范式 (BNF)
如果语法图是「图片」,那么 BNF 就是「教科书描述」。它使用特定的符号来定义语言规则。这也是你在考试中最常用到的格式。
关键符号
要理解 BNF,你只需要记住四个特殊符号:
1. \( ::= \) : 这代表「定义为」或「由...组成」。
2. \( | \) : 这代表「或 (OR)」。当有多个选择时使用它。
3. \( < > \) : 这些括号包围着非终结符(规则的名称)。
4. 纯文本: 任何不在括号内的内容都是终结符(实际的值)。
简单示例
让我们用 BNF 定义一个数字 (Digit) 和一个二进制数字 (Binary Digit):
\(
\(
这就是在告诉计算机:「二进制数字定义为 0 或 1。」
记忆小撇步:符号 \( ::= \) 看起来像是一对眼睛和一张嘴,它正在「告诉」你规则是什么!
重点总结:BNF 是一套文字规则,我们将复杂项目(如整个程序)拆解为较小的项目(如语句),最后拆解为最小的项目(如字母和数字)。
3. 终结符 vs. 非终结符
这是一个很容易混淆的地方,让我们来理清它!
非终结符 \( (<...>) \):
这些是「标签」。它们不是最终结果,就像购物清单上的「水果」一词一样。「水果」不是你吃的特定东西,它是一个包含苹果、香蕉等的类别。
终结符:
这些是「最终产品」。它们是实际的字符,例如 "A"、"5" 或 "+"。一旦你到达终结符,规则就结束了。
要避免的常见错误:千万别忘记在非终结符周围加上 \( < > \) 括号!没有它们,计算机以为你在讨论程序代码中的实际单词,而不是规则名称。
4. 递归 (Recursion):「无限」规则
我们该如何定义长度不固定的事物,例如整数 (Integer)(可能是 5、50 或 500)?我们使用递归 (Recursion)。这就是一条规则引用它自身的情况。
整数规则
看看这条 BNF 规则:
\(
逐步解释:
1. 整数可以只是一个单一的 \(
2. 或者它可以是一个 \(
3. 因为 \(
你知道吗?这就是计算机科学家如何定义任何长度的「列表」,而不必编写数百万条个别规则的方法。
快速回顾框:
- 单一项目: \(
- 项目列表(递归): \(
5. 在语法图与 BNF 之间转换
你可能会被要求将语法图转换为 BNF,反之亦然。请遵循这些简单的「翻译」技巧:
如果你在图中看到分支... 在 BNF 中使用 \( | \) 符号。
如果你在图中看到矩形... 在 BNF 中使用 \( <...>) \) 括号。
如果你在图中看到向后走的循环... 在你的 BNF 规则中使用递归。
重点总结:
语法图和 BNF 的作用相同:它们都定义了语言的语法 (syntax)。语法图是使用圆形(终结符)和矩形(非终结符)的可视化地图。BNF 是一个文字系统,使用 \( ::= \)(定义为)、\( | \)(或)以及用于规则的括号。递归是我们用来实现重复或不限长度的秘密武器。
最后鼓励:练习画画看!试着为你自己的名字或简单的电话号码编写 BNF 规则。你可以做到的!