词法元素
评论
注释作为文档说明。 注释以字符序列 // 开始,并在行尾结束。
注释不能在字符串或正则表达式字面量内部开始。
注释的作用类似于换行。
令牌
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
持续时间文字
A duration literal 是时间长度的表示。 它具有一个整数部分和一个持续时间单位部分。 整数部分必须是有效的 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 | 微秒(1百万分之一秒) |
| 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
日期和时间字面量
A 日期和时间文字 表示特定时间的时刻。 它包含日期部分、时间部分和时间偏移部分。 格式遵循 RFC 3339 规范。 时间是可选的。当省略时,时间假定为协调世界时的午夜。
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
字符串字面量
A string literal 表示一个用双引号括起来的字符序列。 在引号内,可以出现任何字符,除了未转义的双引号。 字符串字面量支持几种转义序列。
\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 ${
正则表达式字面量
A 正则表达式字面量 表示一个正则表达式模式,包含在斜杠中。
在斜杠内,可以出现任何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 定义。