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
}

猜你喜欢

转载自blog.csdn.net/No_Game_No_Life_/article/details/84398985