《兩週自制指令碼語言》——第二天(程式設計語言)
麻雀雖小、五臟俱全的程式設計語言
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語言的表示式和語句不能中途換行。只有語句的句尾,或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; 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之間不得不插入一個{