词法元素
注释
注释用作文档。注释以字符序列 //
开始,到行尾结束。
注释不能在字符串或正则表达式字面量中开始。注释的作用类似于换行符。
标记
Flux 由标记构成。标记分为四类
- 标识符
- 关键字
- 运算符
- 字面量
由空格、水平制表符、回车符和换行符组成的空白字符将被忽略,除非它分隔了原本会组合成单个标记的标记。在将输入分解为标记时,下一个标记是构成有效标记的最长字符序列。
标识符
标识符命名程序中的实体。标识符是一个或多个字母和数字的序列。标识符必须以字母开头。
identifier = letter { letter | unicode_digit } .
标识符示例
a
_x
longIdentifierName
αβ
关键字
以下关键字是保留字,不能用作标识符
and import option if
or package builtin then
not return testcase else exists
运算符
以下字符序列表示运算符
+ == != ( ) =>
- < !~ [ ] ^
* > =~ { } ?
/ <= = , : "
% >= <- . |> @
整数文字
整数文字是表示整数值的数字序列。仅支持十进制整数。
int_lit = "0" | decimal_lit .
decimal_lit = ( "1" … "9" ) { decimal_digit } .
整数文字示例
0
42
317316873
浮点文字
浮点文字是浮点值的十进制表示形式。它具有整数部分、小数点和小数部分。整数部分和小数部分包含十进制数字。整数部分或小数部分之一可以省略。
float_lit = decimals "." [ decimals ]
| "." decimals .
decimals = decimal_digit { decimal_digit } .
浮点文字示例
0.
72.40
072.40 // == 72.40
2.71828
.26
持续时间文字
持续时间文字是时间长度的表示形式。它具有整数部分和持续时间单位部分。整数部分必须是有效的 Flux 整数,并且不应包含前导零。可以一起指定多个持续时间,结果持续时间是每个较小部分的总和。当一起指定多个持续时间时,较大的单位必须出现在较小的单位之前,并且不能有重复的单位。
duration_lit = { int_lit duration_unit } .
duration_unit = "y" | "mo" | "w" | "d" | "h" | "m" | "s" | "ms" | "us" | "µs" | "ns" .
单位 | 含义 |
---|---|
y | 年(12 个月) |
mo | 月 |
w | 周(7 天) |
d | 天 |
h | 小时(60 分钟) |
m | 分钟(60 秒) |
s | 秒 |
ms | 毫秒(千分之一秒) |
us 或 µs | 微秒(百万分之一秒) |
ns | 纳秒(十亿分之一秒) |
持续时间表示时间长度。时间长度取决于它们发生的特定时间瞬间,因此,持续时间不表示固定的时间量。没有等于一个月的天数,因为月份的天数各不相同。持续时间是由正整数组成的元组,表示持续时间和持续时间的符号(正或负)。持续时间以这种方式实现,因此可以确定持续时间是正数还是负数。由于持续时间值取决于其上下文,因此只有当所有量级都具有相同的符号时,才能知道持续时间是正数还是负数。在规范实现中,这实现为月份和纳秒的元组以及一个指示它是正数还是负数的布尔值。规范没有规定特定的实现,其他实现可能会使用不同的内部表示形式。
持续时间不能通过加法和减法组合。元组中的所有量级都必须是正整数,当使用加法和减法时,无法保证这一点。持续时间可以乘以任何整数值。一元负运算符等效于将持续时间乘以 -1。这些运算独立地对每个时间单位执行。
持续时间文字示例
1s
10d
1h15m // 1 hour and 15 minutes
5w
1mo5d // 1 month and 5 days
-1mo5d // negative 1 month and 5 days
持续时间可以添加到日期时间以生成新的日期时间。持续时间与日期时间的加法和减法按月份和纳秒的顺序应用。当月份添加到日期时间,并且结果日期超过月底时,日期将回滚到该月的最后一天。值得注意的是,持续时间与日期时间的加法和减法不可交换。
持续时间文字示例
import "date"
date.add(d: 1d, to: 2018-01-01T00:00:00Z) // 2018-01-02T00:00:00Z
date.add(d: 1mo, to: 2018-01-01T00:00:00Z) // 2018-02-01T00:00:00Z
date.add(d: 2mo, to: 2018-01-01T00:00:00Z) // 2018-03-01T00:00:00Z
date.add(d: 2mo, to: 2018-01-31T00:00:00Z) // 2018-03-31T00:00:00Z
date.add(d: 2mo, to: 2018-02-28T00:00:00Z) // 2018-04-28T00:00:00Z
date.add(d: 1mo, to: 2018-01-31T00:00:00Z) // 2018-02-28T00:00:00Z, February 31th is rolled back to the last day of the month, February 28th in 2018.
date.add(d: 1d, to: date.add(d: 1mo, to: 2018-02-28T00:00:00Z)) // 2018-03-29T00:00:00Z
date.add(d: 1mo, to: date.add(d: 1d, to: 2018-02-28T00:00:00Z)) // 2018-04-01T00:00:00Z
date.sub(d: 1d, from: date.add(d: 2mo, to: 2018-01-01T00:00:00Z)) // 2018-02-28T00:00:00Z
date.add(d: 3mo, to: date.sub(d: 1d, from: 2018-01-01T00:00:00Z)) // 2018-03-31T00:00:00Z
date.add(d: 1mo, to: date.add(d: 1mo, to: 2018-01-31T00:00:00Z)) // 2018-03-28T00:00:00Z
date.add(d: 2mo, to: 2018-01-31T00:00:00Z) // 2018-03-31T00:00:00Z
// Addition and subtraction of durations to date times applies months and nanoseconds in that order.
date.add(d: 2d, to: date.add(d: 1mo, to: 2018-01-28T00:00:00Z)) // 2018-03-02T00:00:00Z
date.add(d: 1mo2d, to: 2018-01-28T00:00:00Z) // 2018-03-02T00:00:00Z
date.add(d: 1mo, to: date.add(d: 2d, to: 2018-01-28T00:00:00Z)) // 2018-02-28T00:00:00Z, explicit add of 2d first changes the result
date.add(d: 2mo2d, to: 2018-02-01T00:00:00Z) // 2018-04-03T00:00:00Z
date.add(d: 1mo30d, to: 2018-01-01T00:00:00Z) // 2018-03-03T00:00:00Z, Months are applied first to get February 1st, then days are added resulting in March 3 in 2018.
date.add(d: 1mo1d, to: 2018-01-31T00:00:00Z) // 2018-03-01T00:00:00Z, Months are applied first to get February 28th, then days are added resulting in March 1 in 2018.
// Multiplication and addition of durations to date times
date.add(d: date.scale(d:1mo, n:1), to: 2018-01-01T00:00:00Z) // 2018-02-01T00:00:00Z
date.add(d: date.scale(d:1mo, n:2), to: 2018-01-01T00:00:00Z) // 2018-03-01T00:00:00Z
date.add(d: date.scale(d:1mo, n:3), to: 2018-01-01T00:00:00Z) // 2018-04-01T00:00:00Z
date.add(d: date.scale(d:1mo, n:1), to: 2018-01-31T00:00:00Z) // 2018-02-28T00:00:00Z
date.add(d: date.scale(d:1mo, n:2), to: 2018-01-31T00:00:00Z) // 2018-03-31T00:00:00Z
date.add(d: date.scale(d:1mo, n:3), to: 2018-01-31T00:00:00Z) // 2018-04-30T00:00:00Z
日期和时间文字
日期和时间文字表示时间中的特定时刻。它具有日期部分、时间部分和时区偏移部分。格式遵循 RFC 3339 规范。时间是可选的。省略时间时,时间假定为 UTC 午夜。
date_time_lit = date [ "T" time ] .
date = year "-" month "-" day .
year = decimal_digit decimal_digit decimal_digit decimal_digit .
month = decimal_digit decimal_digit .
day = decimal_digit decimal_digit .
time = hour ":" minute ":" second [ fractional_second ] time_offset .
hour = decimal_digit decimal_digit .
minute = decimal_digit decimal_digit .
second = decimal_digit decimal_digit .
fractional_second = "." { decimal_digit } .
time_offset = "Z" | ("+" | "-" ) hour ":" minute .
日期和时间文字示例
1952-01-25T12:35:51Z
2018-08-15T13:36:23-07:00
2018-01-01 // midnight on January 1st 2018 UTC
字符串文字
字符串文字表示用双引号括起来的字符序列。在引号内,可以出现任何字符,但不能出现未转义的双引号。字符串文字支持多个转义序列。
\n U+000A line feed or newline
\r U+000D carriage return
\t U+0009 horizontal tab
\" U+0022 double quote
\\ U+005C backslash
\${ U+0024 U+007B dollar sign and opening curly bracket
此外,可以使用以 \x
为前缀的十六进制编码来指定任何字节值。值的十六进制编码必须生成有效的 UTF-8 序列。
string_lit = `"` { unicode_value | byte_value | StringExpression | newline } `"` .
byte_value = `\` "x" hex_digit hex_digit .
hex_digit = "0" … "9" | "A" … "F" | "a" … "f" .
unicode_value = unicode_char | escaped_char .
escaped_char = `\` ( "n" | "r" | "t" | `\` | `"` ) .
StringExpression = "${" Expression "}" .
字符串文字示例
"abc"
"string with double \" quote"
"string with backslash \\"
"日本語"
"\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e" // the explicit UTF-8 encoding of the previous line
字符串文字也为嵌入式表达式进行插值,以便将其评估为字符串。嵌入式表达式用美元符号和花括号 (${}
) 括起来。表达式在包含字符串文字的作用域中求值。表达式的结果格式化为字符串,并替换花括号之间的字符串内容。所有类型都根据其文字表示形式格式化为字符串。要在字符串中包含文字 ${
,必须对其进行转义。
示例:插值
n = 42
"the answer is ${n}" // the answer is 42
"the answer is not ${n+1}" // the answer is not 43
"dollar sign opening curly bracket \${" // dollar sign opening curly bracket ${
正则表达式文字
正则表达式文字表示正则表达式模式,用正斜杠括起来。在正斜杠内,可以出现任何 Unicode 字符,但不能出现未转义的正斜杠。字符串文字中的 \x
十六进制字节值表示形式也可能存在。
除了标准转义序列外,正则表达式文字还支持以下转义序列
\/ U+002f forward slash
regexp_lit = "/" regexp_char { regexp_char } "/" .
regexp_char = unicode_char | byte_value | regexp_escape_char .
regexp_escape_char = `\/`
正则表达式文字示例
/.*/
/http:\/\/localhost:8086/
/^\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e(ZZ)?$/
/^日本語(ZZ)?$/ // the above two lines are equivalent
/a\/b\s\w/ // escape sequences and character class shortcuts are supported
/(?:)/ // the empty regular expression
正则表达式语法由 RE2 定义。
此页面是否对您有帮助?
感谢您的反馈!