词法元素
注释
注释作为文档。注释以字符序列 //
开始,并在行尾结束。
注释不能在字符串或正则表达式文字中开始。注释的行为就像换行符。
词素
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 | 毫秒(1/1000秒) |
us 或 µs | 微秒(1/1000000秒) |
ns | 纳秒(1/1000000000秒) |
持续时间表示时间的长度。时间的长度依赖于它们发生的时间的具体时刻,因此持续时间不表示固定的时间量。月份的天数不同,因此没有等于一个月的天数。持续时间是一个表示持续时间和持续时间符号(正或负)的正整数元组。持续时间以这种方式实现,可以确定持续时间是正数还是负数。由于持续时间值依赖于它们的上下文,确定持续时间是正数还是负数的方法是,如果所有幅度都具有相同的符号。在规范实现中,这表示为一个月份和纳秒的元组以及一个指示它是否为正数的布尔值。规范没有规定具体的实现,其他实现可能使用不同的内部表示。
持续时间不能通过加法和减法组合。元组中的所有幅度都必须是正整数,而使用加法和减法无法保证这一点。持续时间可以乘以任何整数值。一元负操作符相当于将持续时间乘以-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 定义。
这个页面有帮助吗?
感谢您的反馈!