1. 程式人生 > >Graduation Project——設計程式設計語言

Graduation Project——設計程式設計語言

整理我們的需求

  1. 首先這是一個針對架子鼓的編譯器,架子鼓有7個組成部分,比如bass drum、snare drum等等。使用者能夠根據指令碼程式碼來呼叫這幾個鼔的打擊。
  2. 而打擊也分為節奏,使用者指定一個BPM來指定節奏的快慢,預設為60bpm。
  3. 當然也分節拍,預設60bpm的話,如果一小節4拍,就是4/4。當然也分節拍,預設60bpm的話,如果一小節4拍,就是4/4。
  4. 在每一拍,我們7個鼔可以打擊,也可以不打擊。
  5. 每一節是一個迴圈,這個迴圈可以隨時開啟或者終止。
  6. 假設有一節稱為A,另一節稱為B。這兩節不完全相同,我們可以ABAB…這樣敲擊,也可以AABAABABAB…這樣敲擊。(也可以叫迴圈套迴圈,只不過外圈的大迴圈不一定是4個一節,也許是235等等…)
  7. 節拍可以隨時改變,可以遞增比如60bpm,每次迴圈遞增10bpm,以應對越來越快的敲擊。

ps: 綜合3-6,我覺得可以有一個簡單的迴圈系統,來統一大迴圈和小迴圈

Stone語言設計

先拋開我們的程式特定需求不看,一種程式設計語言至少需要具備哪些語法功能呢,整數的四則運算之類的功能自然必不可少,同時,這種語言應該對變數提供支援if語句while語句等一些基本的控制語句也是必須的(或許我們這裡可以根據需求將while改為我們需要的while,而不是常理的while)。
Stone姑且算指令碼語言,因此不需要指定靜態資料型別,使用者在使用的時候不需要實現宣告變數,這樣它的語法才夠簡潔。
不必這樣使用int i=0

,而是i=0,我們預設它是int型別,不接受其他型別。
和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
}

為了簡化語言,我們規定必須使用{}

設計符合場景的語言

基本的語法已經交代清楚,但是我們還是需要一個符合場景的語言的,否則我們的鼔怎麼敲響呢?
首先,我們先設定幾個關鍵字:

  1. bpm,整數型別。表示節奏速度,如果不進行設定,按預設60處理。
  2. snare(sn)、floor(fl)、hihat(hi)、bigrack(bi)、smallrack(sm)、kick(ki)、crash(cr)來分別代表7個鼔。
  3. rhy(rhythm)表示呼叫一次鼔(即敲擊一次),後面接要敲擊的鼔名。
  4. loop表示一直迴圈,不跳出。
  5. 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
}