从本章开始,我们将逐步实现一种名为Stone语言的程序设计语言。在具体实现之前,我们必须设计Stone语言的语法。本章将讨论如何设计Stone语言。如果想要从零开始设计一种新颖实用的语言,结果往往是半途而废。即使设计成功,也可能由于过于复杂难以实现等原因而最终不了了之。因此,本书将首先设计一种极为简单的语言,并开发相应的语言处理器,确保程序能够正确运行。之后,再慢慢向其中添加诸如面向对象等一些复杂的语言功能。也就是说,先设计出一个简化的成品,再逐步改良。 2.1 麻雀虽小、五脏俱全的程序设计语言 一种程序设计语言至少需要具备哪些语法功能呢?整数四则运算之类的功能自然必不可少,最好还能支持字符串处理。同时,这种语言应该对变量提供支持,不然就和计算器没什么区别了。if语句及while语句等一些基本的控制语句也是必需的。Stone语言姑且算是一种脚本语言,因此不需要指定静态数据类型,用户在使用时也不必事先声明变量,这样它的语法能较为简洁。像Java语言那样必须静态地指定数据类型的语言,用户在使用变量及参数前必须先进行声明,并指定数据类型。例如,以 int i = 0; 的方式声明了变量i之后,它就成为了一个int类型的变量。虽然这种限制确实有用,但目前的Stone语言还不需要。Stone语言既不需要在使用变量前事先声明,也不需要指定变量的类型。用户可以将变量任意赋值为整数或字符串。只是这样一来,如果程序中出现字符串变量相减的语句,就会引起运行错误并终止。 和Java语言一样,Stone语言的句末需要使用分号(;)。不过如果正巧在句末换行,分号也可省略。例如,下面这样的代码也是合法的。 sum = 0 i = 1 while i < 10 { sum = sum + i i = i + 1 } sum 这段程序是计算1至9这9个数字的和,并输出结果。在执行这段程序时,最后一条语句将显示计算结果,之后程序结束。Stone语言不支持类似于Java语言中return语句的功能,最后一条语句的计算结果就是整个程序的运行结果。在上面的例子中,最后一行只写了一个sum。Stone语言会把变量sum也视为一条语句,该语句将读取变量sum的值。执行完这条语句后程序就会结束。于是,上面这段含有while语句的程序的运行结果是得到一个值为45的变量sum。 F 这段程序和Ruby语言很像呢。它和Ruby语言唯一的不同在于,while语句体是通过{}括起来的,而Ruby语言则是使用do和end。 A 而且不同于Java语言,这段程序中while语句的条件表达式1<10两侧没有括号。 C 没错,因此语句体必须由{}括起来才行。 F 在书写Java代码时,如果语句体中仅有一条语句,这对大括号就能省略了。 上面的例子没有使用if语句,接下来让我们来看一个使用if语句的程序示例。这段程序的计算内容与前一个程序相同,都是计算1 ~ 9这9个数字的和。不过,这里将分别计算其中奇数与偶数的和,最后再将两者相加。 even = 0 odd = 0 i = 1 while i < 10 { if i % 2 == 0 { // even number? even = even + i } else { odd = odd + i } i = i + 1 } even + odd 在上面的代码中,//之后直至该行末尾的内容都是注释。最后一句语句为even+odd,它将会把求和结果作为程序的执行结果输出。 该例中,变量i的值被用于奇偶分支判断。条件表达式无需用括号括起来,不过完成判断后执行的语句体需要使用{}括起来。和Java等语言一样,else及之后的代码可有可无。