Skip to content

Commit d7f3606

Browse files
committed
添加了一些语法示例文件
1 parent db80a50 commit d7f3606

File tree

3 files changed

+110
-0
lines changed

3 files changed

+110
-0
lines changed

examples/dexp.mdtlbl

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#*
2+
* 这是bang语言中重要的组成部分, `DExp`
3+
* 它是一个特殊的表达式, 在其中可以有多个语句, 然后提供一个句柄来当返回值
4+
* 这个句柄在未手动指定时, 由获取该表达式的语句结构指定
5+
*
6+
* 例如我们熟知的op
7+
* op a b oper c; 或者 op oper a b c; 或者 op oper a b; 或者 op a oper b; 中
8+
* b和c的类型是一个DExp, 它们的句柄分别为`_0`和`_1`
9+
* 也就是说, 我们在使用op x (...) + (...); 时,
10+
* 其实是隐式的 op x (_0: ...) + (_1: ...),
11+
*
12+
* 以下是一些常见的默认句柄:
13+
* Cmp: _0 cmp _1 或 cmp _0, 此结构常见于 while, if, goto, do_while
14+
* Other: cmd _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _ _ _,
15+
* 那些没有被枚举的语句都会是这个结构, 例如print就是print _0
16+
* cmd是一个Var
17+
*
18+
* 此处没有列出的可以到源码中`syntax_def.lalrpop`中
19+
* 寻找如Value_0 Value_1 Value_x等结构的使用来查看句柄定义
20+
*#
21+

examples/insert_sort.mdtlbl

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#*
2+
* 这是提供的一个示例程序
3+
* 这是一个插入排序算法
4+
*#
5+
6+
do { # 按钮弹起时等待按钮被按下
7+
wait 0.1;
8+
} while (sensor _0 switch1 @enabled;);
9+
10+
read length cell1 0; # 被排序的数组长
11+
set i 1;
12+
while i < length {
13+
read num bank1 i;
14+
set j i;
15+
while (j: set c j; op j j - 1;) >= 0 {
16+
read num_1 bank1 j;
17+
goto :break1 num_1 <= num;
18+
write num_1 bank1 c;
19+
} :break1 # 跳出循环用的标记
20+
write num bank1 c;
21+
op i i + 1;
22+
}
23+
control enabled switch1 true 0 0 0;
24+
25+
#* 以上程序会生成的代码
26+
wait 0.1
27+
sensor _0 switch1 @enabled
28+
jump 0 notEqual _0 false
29+
read length cell1 0
30+
set i 1
31+
jump 20 greaterThanEq i length
32+
read num bank1 i
33+
set j i
34+
set c j
35+
op sub j j 1
36+
jump 17 lessThan j 0
37+
read num_1 bank1 j
38+
jump 17 lessThanEq num_1 num
39+
write num_1 bank1 c
40+
set c j
41+
op sub j j 1
42+
jump 11 greaterThanEq j 0
43+
write num bank1 c
44+
op add i i 1
45+
jump 6 lessThan i length
46+
control enabled switch1 true 0 0 0
47+
*#

examples/value.mdtlbl

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#*
2+
* Value是Bang语言中的重要结构, 它是一个枚举, 可用值为一个Var或者一个DExp
3+
* DExp的介绍请移步至dexp.mdtlbl
4+
* Var是一个基本值单元, 它可以是一个变量, 一个字符串, 一个数字, 一个由@紧贴开头的变量
5+
* 它有几个匹配分支:
6+
* 普通标识符: 由一个下划线或者XID_Start开头, 0个及以上XID_Continue紧随其后
7+
* 使用XID可以完成如中文标识符 日文标识符等
8+
* 对象标识符: 在普通标识符的前方先匹配一个@, 同时XID_Continue部分可以匹配`-`符号
9+
* 这是为了适应原游戏中的@开头的很多值如物品 环境变量 选项 枚举
10+
* 短横线(`-`)符号是为了适应部分格式如`@abc-def`的值
11+
* 原始标识符: 这种标识符的存在是为了适应mdt中奇葩的标识符界定的
12+
* mdt中标识符是连续的一段非空字符, 且不匹配内置值、字面量等即为标识符
13+
* 所以使用原始标识符来适应这种奇葩, 格式为单引号包裹的一段连续非空字符
14+
* 例如`'@abc%d*ef$ghi'`
15+
* 数字: 普通数字, 除开头部分(小数部分开头也算)可以用下划线组成, 它会被忽略
16+
* 格式为:
17+
* 整数(`123`), 浮点数(`123.456`), 二进制数(`0b1011`), 十六进制数(`0x1f`),
18+
* 负整数(`-123`), 负浮点数(`-123.456`), 负二进制数(`0b-1011`), 负十六进制数(`0x-1f`)
19+
* 与mdt中数字格式基本相符
20+
* 字符串: 由一个双引号起始, 一个双引号终止, 中间为0至若干个非双引号字符组成
21+
* 如果其中包含换行, 将会被替换为一个字面量反斜杠接一个ASCII字符n
22+
*
23+
* 还有一种特殊数字, LiteralUInt, 这种数字会被真正编译时识别使用.
24+
* 例如switch-case中, 必须是一个无符号非负不越界整数
25+
* 这种数字并不被包含在Value中
26+
*#
27+
28+
set a 2;
29+
set @b 3;
30+
set @c-d 4;
31+
set 值 5;
32+
set _y 6;
33+
set 'ab%$&!@' 7;
34+
set str "8";
35+
set str_1 "9
36+
10"; # 跨行字符串
37+
set float 100_010.223_959;
38+
set n_float -100_010.223_959;
39+
set int 123_456;
40+
set n_int -123_456;
41+
set bin 0b1001_0010;
42+
set n_bin 0b-1001_0010;

0 commit comments

Comments
 (0)