MENU

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

December 15, 2018 • Read: 6848 • 编译原理阅读设置

笔记、源码同步在 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 之间不得不插入一个 {

第二天的思维导图展开目录

Last Modified: February 2, 2020
Archives Tip
QR Code for this page
Tipping QR Code
Leave a Comment

2 Comments
  1. pluvet pluvet

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

    1. mathor mathor

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