| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332 |
- package influxql
- import (
- "strings"
- )
- // Token is a lexical token of the InfluxQL language.
- type Token int
- // These are a comprehensive list of InfluxQL language tokens.
- const (
- // ILLEGAL Token, EOF, WS are Special InfluxQL tokens.
- ILLEGAL Token = iota
- EOF
- WS
- COMMENT
- literalBeg
- // IDENT and the following are InfluxQL literal tokens.
- IDENT // main
- BOUNDPARAM // $param
- NUMBER // 12345.67
- INTEGER // 12345
- DURATIONVAL // 13h
- STRING // "abc"
- BADSTRING // "abc
- BADESCAPE // \q
- TRUE // true
- FALSE // false
- REGEX // Regular expressions
- BADREGEX // `.*
- literalEnd
- operatorBeg
- // ADD and the following are InfluxQL Operators
- ADD // +
- SUB // -
- MUL // *
- DIV // /
- MOD // %
- BITWISE_AND // &
- BITWISE_OR // |
- BITWISE_XOR // ^
- AND // AND
- OR // OR
- EQ // =
- NEQ // !=
- EQREGEX // =~
- NEQREGEX // !~
- LT // <
- LTE // <=
- GT // >
- GTE // >=
- operatorEnd
- LPAREN // (
- RPAREN // )
- COMMA // ,
- COLON // :
- DOUBLECOLON // ::
- SEMICOLON // ;
- DOT // .
- keywordBeg
- // ALL and the following are InfluxQL Keywords
- ALL
- ALTER
- ANALYZE
- ANY
- AS
- ASC
- BEGIN
- BY
- CARDINALITY
- CREATE
- CONTINUOUS
- DATABASE
- DATABASES
- DEFAULT
- DELETE
- DESC
- DESTINATIONS
- DIAGNOSTICS
- DISTINCT
- DROP
- DURATION
- END
- EVERY
- EXACT
- EXPLAIN
- FIELD
- FOR
- FROM
- GRANT
- GRANTS
- GROUP
- GROUPS
- IN
- INF
- INSERT
- INTO
- KEY
- KEYS
- KILL
- LIMIT
- MEASUREMENT
- MEASUREMENTS
- NAME
- OFFSET
- ON
- ORDER
- PASSWORD
- POLICY
- POLICIES
- PRIVILEGES
- QUERIES
- QUERY
- READ
- REPLICATION
- RESAMPLE
- RETENTION
- REVOKE
- SELECT
- SERIES
- SET
- SHOW
- SHARD
- SHARDS
- SLIMIT
- SOFFSET
- STATS
- SUBSCRIPTION
- SUBSCRIPTIONS
- TAG
- TO
- USER
- USERS
- VALUES
- WHERE
- WITH
- WRITE
- keywordEnd
- )
- var tokens = [...]string{
- ILLEGAL: "ILLEGAL",
- EOF: "EOF",
- WS: "WS",
- IDENT: "IDENT",
- NUMBER: "NUMBER",
- DURATIONVAL: "DURATIONVAL",
- STRING: "STRING",
- BADSTRING: "BADSTRING",
- BADESCAPE: "BADESCAPE",
- TRUE: "TRUE",
- FALSE: "FALSE",
- REGEX: "REGEX",
- ADD: "+",
- SUB: "-",
- MUL: "*",
- DIV: "/",
- MOD: "%",
- BITWISE_AND: "&",
- BITWISE_OR: "|",
- BITWISE_XOR: "^",
- AND: "AND",
- OR: "OR",
- EQ: "=",
- NEQ: "!=",
- EQREGEX: "=~",
- NEQREGEX: "!~",
- LT: "<",
- LTE: "<=",
- GT: ">",
- GTE: ">=",
- LPAREN: "(",
- RPAREN: ")",
- COMMA: ",",
- COLON: ":",
- DOUBLECOLON: "::",
- SEMICOLON: ";",
- DOT: ".",
- ALL: "ALL",
- ALTER: "ALTER",
- ANALYZE: "ANALYZE",
- ANY: "ANY",
- AS: "AS",
- ASC: "ASC",
- BEGIN: "BEGIN",
- BY: "BY",
- CARDINALITY: "CARDINALITY",
- CREATE: "CREATE",
- CONTINUOUS: "CONTINUOUS",
- DATABASE: "DATABASE",
- DATABASES: "DATABASES",
- DEFAULT: "DEFAULT",
- DELETE: "DELETE",
- DESC: "DESC",
- DESTINATIONS: "DESTINATIONS",
- DIAGNOSTICS: "DIAGNOSTICS",
- DISTINCT: "DISTINCT",
- DROP: "DROP",
- DURATION: "DURATION",
- END: "END",
- EVERY: "EVERY",
- EXACT: "EXACT",
- EXPLAIN: "EXPLAIN",
- FIELD: "FIELD",
- FOR: "FOR",
- FROM: "FROM",
- GRANT: "GRANT",
- GRANTS: "GRANTS",
- GROUP: "GROUP",
- GROUPS: "GROUPS",
- IN: "IN",
- INF: "INF",
- INSERT: "INSERT",
- INTO: "INTO",
- KEY: "KEY",
- KEYS: "KEYS",
- KILL: "KILL",
- LIMIT: "LIMIT",
- MEASUREMENT: "MEASUREMENT",
- MEASUREMENTS: "MEASUREMENTS",
- NAME: "NAME",
- OFFSET: "OFFSET",
- ON: "ON",
- ORDER: "ORDER",
- PASSWORD: "PASSWORD",
- POLICY: "POLICY",
- POLICIES: "POLICIES",
- PRIVILEGES: "PRIVILEGES",
- QUERIES: "QUERIES",
- QUERY: "QUERY",
- READ: "READ",
- REPLICATION: "REPLICATION",
- RESAMPLE: "RESAMPLE",
- RETENTION: "RETENTION",
- REVOKE: "REVOKE",
- SELECT: "SELECT",
- SERIES: "SERIES",
- SET: "SET",
- SHOW: "SHOW",
- SHARD: "SHARD",
- SHARDS: "SHARDS",
- SLIMIT: "SLIMIT",
- SOFFSET: "SOFFSET",
- STATS: "STATS",
- SUBSCRIPTION: "SUBSCRIPTION",
- SUBSCRIPTIONS: "SUBSCRIPTIONS",
- TAG: "TAG",
- TO: "TO",
- USER: "USER",
- USERS: "USERS",
- VALUES: "VALUES",
- WHERE: "WHERE",
- WITH: "WITH",
- WRITE: "WRITE",
- }
- var keywords map[string]Token
- func init() {
- keywords = make(map[string]Token)
- for tok := keywordBeg + 1; tok < keywordEnd; tok++ {
- keywords[strings.ToLower(tokens[tok])] = tok
- }
- for _, tok := range []Token{AND, OR} {
- keywords[strings.ToLower(tokens[tok])] = tok
- }
- keywords["true"] = TRUE
- keywords["false"] = FALSE
- }
- // String returns the string representation of the token.
- func (tok Token) String() string {
- if tok >= 0 && tok < Token(len(tokens)) {
- return tokens[tok]
- }
- return ""
- }
- // Precedence returns the operator precedence of the binary operator token.
- func (tok Token) Precedence() int {
- switch tok {
- case OR:
- return 1
- case AND:
- return 2
- case EQ, NEQ, EQREGEX, NEQREGEX, LT, LTE, GT, GTE:
- return 3
- case ADD, SUB, BITWISE_OR, BITWISE_XOR:
- return 4
- case MUL, DIV, MOD, BITWISE_AND:
- return 5
- }
- return 0
- }
- // isOperator returns true for operator tokens.
- func (tok Token) isOperator() bool { return tok > operatorBeg && tok < operatorEnd }
- // tokstr returns a literal if provided, otherwise returns the token string.
- func tokstr(tok Token, lit string) string {
- if lit != "" {
- return lit
- }
- return tok.String()
- }
- // Lookup returns the token associated with a given string.
- func Lookup(ident string) Token {
- if tok, ok := keywords[strings.ToLower(ident)]; ok {
- return tok
- }
- return IDENT
- }
- // Pos specifies the line and character position of a token.
- // The Char and Line are both zero-based indexes.
- type Pos struct {
- Line int
- Char int
- }
|