Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/river/token/token.go
4096 views
1
// Package token defines the lexical elements of a River config and utilities
2
// surrounding their position.
3
package token
4
5
// Token is an individual River lexical token.
6
type Token int
7
8
// List of all lexical tokens and examples that represent them.
9
//
10
// LITERAL is used by token/builder to represent literal strings for writing
11
// tokens, but never used for reading (so scanner never returns a
12
// token.LITERAL).
13
const (
14
ILLEGAL Token = iota // Invalid token.
15
LITERAL // Literal text.
16
EOF // End-of-file.
17
COMMENT // // Hello, world!
18
19
literalBeg
20
IDENT // foobar
21
NUMBER // 1234
22
FLOAT // 1234.0
23
STRING // "foobar"
24
literalEnd
25
26
keywordBeg
27
BOOL // true
28
NULL // null
29
keywordEnd
30
31
operatorBeg
32
OR // ||
33
AND // &&
34
NOT // !
35
36
ASSIGN // =
37
38
EQ // ==
39
NEQ // !=
40
LT // <
41
LTE // <=
42
GT // >
43
GTE // >=
44
45
ADD // +
46
SUB // -
47
MUL // *
48
DIV // /
49
MOD // %
50
POW // ^
51
52
LCURLY // {
53
RCURLY // }
54
LPAREN // (
55
RPAREN // )
56
LBRACK // [
57
RBRACK // ]
58
COMMA // ,
59
DOT // .
60
operatorEnd
61
62
TERMINATOR // \n
63
)
64
65
var tokenNames = [...]string{
66
ILLEGAL: "ILLEGAL",
67
LITERAL: "LITERAL",
68
EOF: "EOF",
69
COMMENT: "COMMENT",
70
71
IDENT: "IDENT",
72
NUMBER: "NUMBER",
73
FLOAT: "FLOAT",
74
STRING: "STRING",
75
BOOL: "BOOL",
76
NULL: "NULL",
77
78
OR: "||",
79
AND: "&&",
80
NOT: "!",
81
82
ASSIGN: "=",
83
EQ: "==",
84
NEQ: "!=",
85
LT: "<",
86
LTE: "<=",
87
GT: ">",
88
GTE: ">=",
89
90
ADD: "+",
91
SUB: "-",
92
MUL: "*",
93
DIV: "/",
94
MOD: "%",
95
POW: "^",
96
97
LCURLY: "{",
98
RCURLY: "}",
99
LPAREN: "(",
100
RPAREN: ")",
101
LBRACK: "[",
102
RBRACK: "]",
103
COMMA: ",",
104
DOT: ".",
105
106
TERMINATOR: "TERMINATOR",
107
}
108
109
// Lookup maps a string to its keyword token or IDENT if it's not a keyword.
110
func Lookup(ident string) Token {
111
switch ident {
112
case "true", "false":
113
return BOOL
114
case "null":
115
return NULL
116
default:
117
return IDENT
118
}
119
}
120
121
// String returns the string representation corresponding to the token.
122
func (t Token) String() string {
123
if int(t) >= len(tokenNames) {
124
return "ILLEGAL"
125
}
126
127
name := tokenNames[t]
128
if name == "" {
129
return "ILLEGAL"
130
}
131
return name
132
}
133
134
// GoString returns the %#v format of t.
135
func (t Token) GoString() string { return t.String() }
136
137
// IsKeyword returns true if the token corresponds to a keyword.
138
func (t Token) IsKeyword() bool { return t > keywordBeg && t < keywordEnd }
139
140
// IsLiteral returns true if the token corresponds to a literal token or
141
// identifier.
142
func (t Token) IsLiteral() bool { return t > literalBeg && t < literalEnd }
143
144
// IsOperator returns true if the token corresponds to an operator or
145
// delimiter.
146
func (t Token) IsOperator() bool { return t > operatorBeg && t < operatorEnd }
147
148
// BinaryPrecedence returns the operator precedence of the binary operator t.
149
// If t is not a binary operator, the result is LowestPrecedence.
150
func (t Token) BinaryPrecedence() int {
151
switch t {
152
case OR:
153
return 1
154
case AND:
155
return 2
156
case EQ, NEQ, LT, LTE, GT, GTE:
157
return 3
158
case ADD, SUB:
159
return 4
160
case MUL, DIV, MOD:
161
return 5
162
case POW:
163
return 6
164
}
165
166
return LowestPrecedence
167
}
168
169
// Levels of precedence for operator tokens.
170
const (
171
LowestPrecedence = 0 // non-operators
172
UnaryPrecedence = 7
173
HighestPrecedence = 8
174
)
175
176