文档文档

词法元素

注释

注释用作文档。注释以字符序列 // 开始,并在行尾结束。

注释不能在字符串或正则表达式字面量内部开始。注释的作用类似于换行符。

标记

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

浮点数字面量

浮点数字面量是浮点值的十进制表示形式。它具有整数部分、小数点和 fractional 部分。整数部分和 fractional 部分包含十进制数字。整数部分或 fractional 部分之一可以省略。

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 定义。


此页内容是否有帮助?

感谢您的反馈!


Flux 的未来

Flux 即将进入维护模式。您可以继续像当前一样使用它,而无需对代码进行任何更改。

阅读更多

现已全面上市

InfluxDB 3 Core 和 Enterprise

快速启动。更快扩展。

获取更新

InfluxDB 3 Core 是一个开源、高速、近实时数据引擎,可实时收集和处理数据,并将其持久化到本地磁盘或对象存储。InfluxDB 3 Enterprise 构建在 Core 的基础上,增加了高可用性、读取副本、增强的安全性以及数据压缩,从而实现更快的查询和优化的存储。InfluxDB 3 Enterprise 的免费层可供非商业家庭或业余爱好者使用。

有关更多信息,请查看