MENU

《两周自制脚本语言》——第二天(程序设计语言)

December 15, 2018 • Read: 577 • 编译原理

笔记、源码同步在github上,欢迎 Star,蟹蟹~


麻雀虽小、五脏俱全的程序设计语言

Stone语言应该具备哪些语法功能呢?四则运算必不可少,还有字符串处理以及对变量提供支持。if、while语句等一些基本的控制语句也必需。Stone语言姑且算是一种脚本语言,因此不需要制定静态数据类型,用户在使用时也不必事先声明变量。只是这样一来,如果程序中出现字符串变量相加减的语句,就会引起运行错误并终止

和java语言一样,Stone语言的句末也需要使用分号,不过如果正巧在句末换行,分号也可省略。例如,下面的代码是合法的

sum = 0
i = 1
while i < 10 {
    sum = sum + i
    i = i + 1
}
sum

这段程序是计算1~9的和,最后一行只写了一个sum,Stone语言会把变量sum也视为一条语句,该语句将读取变量sum的值

接下来看一个使用if语句的程序示例。这段程序的计算内容和前一个程序相同,都是计算1~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,它将把求和结果作为程序的执行结果输出

语句的分号

如果同一行中写有多句语句,各句句尾的分号则不能省略。此时分号用于区分不同的语句。

此外,{}括起来的代码块中的最后一条语句的句尾分号能够省略,也就是说,如果句尾直接跟着},就不必是用分号

{x = 1;y = 2}

上面代码中,y = 2之后没有分号,分号并不是一句语句结束的标识,而是代码块中语句之间的分隔符。因此下面的代码块中含有3条语句,而不是2条

{x = 1;y = 2;}

其中第三条应该被视为一条空语句。空语句指的是没有内容的语句。

Stone语言中,行末的句尾分号也能被省略。也就是说,如果该语句之后是换行符,就不需要另外添加分号。因此,空行也应被视为一句空语句,只不过省略了句尾的分号

x = 1

y = 2

在上面的代码中,第1与第3行之间的空行是一句空语句

由于Stone语言的句尾分号能够省略,换行与否将会大有不同。因此,Stone语言的表达式和语句不能中途换行。只有语句的句尾,或ifwhile等语句的语句体之前的{后能换行。}else之间,或else{不能换行。例如

if i % 2 == 0 // error
{
    even = even + i
}             // error
else          // error
{
    odd = odd + i
}

只有下面的格式才是唯一正确的写法

if i % 2 == 0 {
    even = even + i
} else {
    odd = odd + i
}

含糊不得的语言

Stone语言中的while语句体必须由大括号{}包围。if语句也是如此。如果像java语言那样,语句体仅含一条语句时可以不是用括号,就会出现下面这样的歧义

if 0 < x - y - z

这条if语句有两种解读方式

if 0 < x - y { -z }
if 0 < x { -y - z}

为了避免这种模棱两可的语法,Stone语言的语句体必须用{}括起来

if语句的dangling-else问题是一个著名的二义语法。例如,Java语言允许下面这样的if语句

if (x > 0)
    if(y > 0)
        return x + y;
else
    return -x;

这段代码的问题在于判断else应当对应哪一个if。java语言当然做了规定,在这种情况下,else与最近的一个if对应,因此不存在歧义。如果在设计语言时欠考虑,就很容易出现这类dangling-else问题,使语言变得模棱两可。

不支持else if

if x > 0 {
    y = 1
} else { // line 3
    if x == 0 { // line4
        y = 0
    } else {
        y = -1
    }
}

因为一定要用括号括起来,所以第3行的else与第四行的if之间不得不插入一个{

第二天的思维导图

Archives Tip
QR Code for this page
Tipping QR Code
Leave a Comment

已有 2 条评论
  1. pluvet pluvet

    简直太棒了, 不用我买书了(笑
    总之非常感谢!!!

    1. mathor mathor

      @pluvet@(捂嘴笑)我也没买书,我看的电子版