(二)单词处理:设计脚本语言的词法

战前回顾

上一篇在《(一)字符处理:简单虚拟机的实现》文章中,我们实现了一个简单的虚拟机,又或者可以说它是一个简单的解释器。因为它功能有限,实际上,除了计算加法和输出,它不具备其他更高级的功能,比如类似 if 语句这种分支结构、类似 while 语句的循环结构,甚至更高级的,函数定义与调用都是没有实现的。这些功能对于第一个例子未免过于复杂。我们必须重新审视我们的工作,去完成一个更高级的解释器,它应该被设计成就像某些脚本语言(如 JavaScript、Basic 或者 Python)一样。

MyScript

我们为了后续工作能够有条理地进行下去,最好需要我们现在就直接定义(构思)一个编程语言。在本文中,我们定义的编程语言名字叫做 MyScript。顾名思义,这个编程语言至少在语法上将会设计得和 JavaScript 语言类似(当然有很多都不一样)。比如下面是一段 MyScript 编程语言的示例程序,用户将输入圆的半径,程序计算出圆的面积并显示出来。

func area(r) {
    return r * r * 3.14159;
}
var a;
input a;
if (a < 0) {
    print "半径不能小于0";
} else {
    print area(a);
}

词法规则

既然设计编程语言,首先得需要制定一套完备的、能够避免语法发生冲突的规则。

大多数语言都有一些「保留字」(或者也可以说是关键字,但是我建议还是用保留字这个说法比较好),它们用于控制编程语言的最基本功能,比如定义变量、函数、或者定义分支、循环结构。必然地,我们将给 MyScript 也制定一套保留字规则:

func
var
return
if
else
while
break
continue
input
print

如你所见,相较于 C 语言而言,MyScript 的关键字少之又少,比如没有 do、for,但是麻雀虽小五脏俱全,利用这几个保留字就能构造出三种基本结构(顺序、分支、循环),这样至少已经足够用于构造一个图灵完备的、结构化的编程语言了,即便这样做会减少很多基本功能,对编程开发很不方便。

除了保留字之外,我们的编程语言还有一个重要的组成部分,那就是「标点符号」(我不知道怎么把运算符和花括号、圆括号之类的放在一起说,这里我就擅自统一称作「标点符号」)。比如表达式里面出现的各类运算符,以及分号、成对出现的各类花括号、方括号、圆括号等……。这里我们也把它们列举出来:

;
+
+=
-
-=
*
*=
/
/=
%
%=
&&
||
!
[
]
(
)
{
}
=
==
!=
<
<=
>
>=
.

除了保留字和标点符号之外,代码里面可能还会出现什么呢?

对,「字面量」和「标识符」。标识符的规则比较简单,只要遵循「由字母数字和下划线组成,且不能以数字开头」的原则就可以了。但是对字面量而言就复杂很多,我们需要制定一个规则出来,否则编写处理程序的工作就无法进行下去。于是,我们可以暂且定义以下规则:

  • 实数字面量:以十进制数字字符(0~9)组成数字串,并且可以包含并且仅可以包含一个小数点,小数点可以在数字串开头出现,与 0.XXXXX 等价,也可在结尾出现,与 XXXXX.0 等价。数字串必须以 f 或者 F 结尾
  • 整数字面量:以十进制数字字符(0~9)组成的数字串。
  • 字符字面量:以单引号开头、以单引号结尾的一个字符,可以是转义字符。
  • 字符串字面量:以双引号开头、以双引号结尾的一串字符,可包含转义字符。

关于转义字符,其组成规则将严格按照下表:

此外还需注意几点,MyScript 语言的数值类型将只有实数型和整数型,实数型运算操作都定义在计算机浮点运算之上,整数型将按常规运算进行。字符字面量在运算过程中若碰到整数或者实数将被转换成对应的 ASCII 码值参与运算,若碰到字符串则视为串的合并操作,整数或者浮点碰到字符串则直接「字符串化」。当然,这些操作本章内容不会涉及到,这是语法(语义)分析过程中需要考虑的问题。

关于缺失的特性

这个世界上没有完美的编程语言,而且编程语言本身也是需要不断完善、更新的。纵观主流的编程语言,其诸多特性并不是一开始就存在于语言中的,一般都是后来随着时间推移进一步补充并且完善的。本教程全篇为了可读性,设计过程将会牺牲很多主流编程语言当中的特性,以换取你沿着「如何编写语言处理程序」这一目标笔直向前进的动力,这样读者就无须在意编程语言设计过程中细枝末节的问题。若有一天你有心继续深挖下去,实现属于你自己的编程语言,便可随意添加自己想实现的特性,岂不美哉!

准备好动手

现在我们拥有一个保留字列表,一个标点符号列表。还有一套识别标识符字面量的规则,多么好的食材。下一章节我们将重心放在整理设计思路并且编程实现我们的单词处理程序 —— 词法分析器。作为厨师的你,应当将这些现有食材做成美味菜肴。

发表评论

电子邮件地址不会被公开。 必填项已用*标注