笔记、源码同步在github上,欢迎 Star,蟹蟹~
### 麻雀虽小、五脏俱全的程序设计语言 Stone语言应该具备哪些语法功能呢?四则运算必不可少,还有字符串处理以及对变量提供支持。if、while语句等一些基本的控制语句也必需。Stone语言姑且算是一种脚本语言,因此不需要制定静态数据类型,用户在使用时也不必事先声明变量。只是这样一来,如果程序中出现字符串变量相加减的语句,就会引起运行错误并终止
和java语言一样,Stone语言的句末也需要使用分号,不过如果正巧在句末换行,分号也可省略。例如,下面的代码是合法的
sum = 0
i = 1
while i < 10 {sum = sum + ii = 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 = 1y = 2
在上面的代码中,第1与第3行之间的空行是一句空语句
由于Stone语言的句尾分号能够省略,换行与否将会大有不同。因此,Stone语言的表达式和语句不能中途换行。只有语句的句尾,或if
、while
等语句的语句体之前的{
后能换行。}
与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;
elsereturn -x;
这段代码的问题在于判断else应当对应哪一个if。java语言当然做了规定,在这种情况下,else与最近的一个if对应,因此不存在歧义。如果在设计语言时欠考虑,就很容易出现这类dangling-else问题,使语言变得模棱两可。
不支持else if
if x > 0 {y = 1
} else { // line 3if x == 0 { // line4y = 0} else {y = -1}
}
因为一定要用括号括起来,所以第3行的else与第四行的if之间不得不插入一个{