-
Notifications
You must be signed in to change notification settings - Fork 1
/
value.mdtlbl
60 lines (59 loc) · 2.72 KB
/
value.mdtlbl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#*
* Value是Bang语言中的重要结构, 它是一个枚举,
* 可用值为:
* Var
* 一个基本单元 (1234)
* DExp
* 有一个返回句柄与一系列行 ((res: res = 2;))
* ResultHandle
* 当前层的DExp返回句柄 ($)
* ReprVar
* 不会被常量替换的Var (`foo`)
* ValueBind (abc.def)
* 将一个Var用特定格式绑定到Value的句柄
*
* DExp和ResultHandle的介绍请移步至dexp.mdtlbl
* Var是一个基本值单元, 它可以是一个变量, 一个字符串, 一个数字, 一个由@紧贴开头的变量
* 它有几个匹配分支:
* 普通标识符: 由一个下划线或者XID_Start开头, 0个及以上XID_Continue紧随其后
* 使用XID可以完成如中文标识符 日文标识符等
* 对象标识符: 在普通标识符的前方先匹配一个@, 同时XID_Continue部分可以匹配`-`符号
* 这是为了适应原游戏中的@开头的很多值如物品 环境变量 选项 枚举
* 短横线(`-`)符号是为了适应部分格式如`@abc-def`的值
* 原始标识符: 这种标识符的存在是为了适应mdt中奇葩的标识符界定的
* mdt中标识符是连续的一段非空字符, 且不匹配内置值、字面量等即为标识符
* 所以使用原始标识符来适应这种奇葩, 格式为单引号包裹的一段连续非空字符
* 例如`'@abc%d*ef$ghi'`
* 数字: 普通数字, 除开头部分(小数部分开头也算)可以用下划线组成, 它会被忽略
* 格式为:
* 整数(`123`), 浮点数(`123.456`), 二进制数(`0b1011`), 十六进制数(`0x1f`),
* 负整数(`-123`), 负浮点数(`-123.456`), 负二进制数(`0b-1011`), 负十六进制数(`0x-1f`)
* 与mdt中数字格式基本相符
* 字符串: 由一个双引号起始, 一个双引号终止, 中间为0至若干个非双引号字符组成
* 如果其中包含换行, 将会被替换为一个字面量反斜杠接一个ASCII字符n
*
* 还有一种特殊数字, LiteralUInt, 这种数字会被真正编译时识别使用.
* 例如switch-case中, 必须是一个无符号非负不越界整数
* 这种数字并不被包含在Value中
*#
set a 2;
set @b 3;
set @c-d 4;
set 值 5;
set _y 6;
set 'ab%$&!@' 7;
set str "8";
set str_1 "9
10"; # 跨行字符串
set float 100_010.223_959;
set n_float -100_010.223_959;
set int 123_456;
set n_int -123_456;
set bin 0b1001_0010;
set n_bin 0b-1001_0010;
set x 'abc"def'; # 其中的双引号会被替换为单引号
set y `y`; # 这里`y`会被编译为y
set z `"z"`; # 这里`"z"`会被编译为"z"
set pown1 2e8; # 科学计数法语法, 可惜mdt并没有解析其小数形式, bang也暂时没对其扩展
set pown2 1e+9;
set pown3 3e-4;