Graduation Project——設計程式設計語言
阿新 • • 發佈:2018-11-26
整理我們的需求
- 首先這是一個針對架子鼓的編譯器,架子鼓有7個組成部分,比如bass drum、snare drum等等。使用者能夠根據指令碼程式碼來呼叫這幾個鼔的打擊。
- 而打擊也分為節奏,使用者指定一個BPM來指定節奏的快慢,預設為60bpm。
- 當然也分節拍,預設60bpm的話,如果一小節4拍,就是4/4。當然也分節拍,預設60bpm的話,如果一小節4拍,就是4/4。
- 在每一拍,我們7個鼔可以打擊,也可以不打擊。
- 每一節是一個迴圈,這個迴圈可以隨時開啟或者終止。
- 假設有一節稱為A,另一節稱為B。這兩節不完全相同,我們可以ABAB…這樣敲擊,也可以AABAABABAB…這樣敲擊。(也可以叫迴圈套迴圈,只不過外圈的大迴圈不一定是4個一節,也許是235等等…)
- 節拍可以隨時改變,可以遞增比如60bpm,每次迴圈遞增10bpm,以應對越來越快的敲擊。
ps: 綜合3-6,我覺得可以有一個簡單的迴圈系統,來統一大迴圈和小迴圈
Stone語言設計
先拋開我們的程式特定需求不看,一種程式設計語言至少需要具備哪些語法功能呢,整數的四則運算之類的功能自然必不可少,同時,這種語言應該對變數提供支援,if語句和while語句等一些基本的控制語句也是必須的(或許我們這裡可以根據需求將while改為我們需要的while,而不是常理的while)。
Stone姑且算指令碼語言,因此不需要指定靜態資料型別,使用者在使用的時候不需要實現宣告變數,這樣它的語法才夠簡潔。
不必這樣使用int i=0
和java一樣,Stone語言的句末也需要使用分號
;
,不過如果正巧在句末換行,分號也可以省略。下面的程式碼也是合法的:
sum=0
i=1
while i<10{
sum=sum+i
i=i+1
}
這段程式是計算1到9的和。
ps:突然的靈感是,有一個程式入口,假定為main{},每一個迴圈像彙編那樣命名,比如迴圈{…}命名為A,另一個命名為B,在main中又有個迴圈包含AB
上面沒有if語句,我們來看看if語句的程式示例。
ps:我們也許可以通過if語句實現原本需要ABAB的迴圈變為一個迴圈。比如利用取餘的特性。
even=0 odd=0 while i<10{ if i%2==0{ // even number? even=even+1 }else{ odd=odd+1 } i=i+1 }
句尾的分號
Stone語言為了簡化語法,省去了if語句和while語句的條件表示式兩側的括號,並允許使用者省略可以省略的句尾分號。如果同一行寫有多個語句,句尾分號則不可省略。此外括號{}
括起來的最後一條語句分號可以省略。
比如:
{x=1;y=2}
而如果這樣寫:
{x=1;y=2;}
這是3條語句,而不是2條。第三條應該被視為一個空語句。
因此下面這條語句:
if i%2==0 //error
{
even=even+1
} //error
else //error
{
odd=odd+1
}
上面的語句是錯誤的,不能夠隨意的換行,應該這樣寫:
if i%2==0{
even=even+1
}else{
odd=odd+1
}
為了簡化語言,我們規定必須使用{}
設計符合場景的語言
基本的語法已經交代清楚,但是我們還是需要一個符合場景的語言的,否則我們的鼔怎麼敲響呢?
首先,我們先設定幾個關鍵字:
- bpm,整數型別。表示節奏速度,如果不進行設定,按預設60處理。
- snare(sn)、floor(fl)、hihat(hi)、bigrack(bi)、smallrack(sm)、kick(ki)、crash(cr)來分別代表7個鼔。
- rhy(rhythm)表示呼叫一次鼔(即敲擊一次),後面接要敲擊的鼔名。
- loop表示一直迴圈,不跳出。
- while 表示迴圈條件值。if表判斷。
我們嘗試寫幾個程式來試試:
bpm=60
i=10
while i>0{
rhy{sn;fl;hi}
rhy{sn}
rhy{cr}
rhy{bi}
bpm=bpm+10
i=i-1
}
bpm=120
i=0
loop{
if i%2==0{
rhy{cr;hi}
}else{
rhy{sn;sm}
}
i=i+1
}