1// Copyright (c) 2016, Daniel MartΓ <mvdan@mvdan.cc>
2// See LICENSE for licensing information
3
4package syntax
5
6//go:generate stringer -type token -linecomment -trimprefix _
7
8type token uint32
9
10// The list of all possible tokens.
11const (
12 illegalTok token = iota
13
14 _EOF
15 _Newl
16 _Lit
17 _LitWord
18 _LitRedir
19
20 sglQuote // '
21 dblQuote // "
22 bckQuote // `
23
24 and // &
25 andAnd // &&
26 orOr // ||
27 or // |
28 orAnd // |&
29
30 dollar // $
31 dollSglQuote // $'
32 dollDblQuote // $"
33 dollBrace // ${
34 dollBrack // $[
35 dollParen // $(
36 dollDblParen // $((
37 leftBrack // [
38 dblLeftBrack // [[
39 leftParen // (
40 dblLeftParen // ((
41
42 rightBrace // }
43 rightBrack // ]
44 rightParen // )
45 dblRightParen // ))
46 semicolon // ;
47
48 dblSemicolon // ;;
49 semiAnd // ;&
50 dblSemiAnd // ;;&
51 semiOr // ;|
52
53 exclMark // !
54 tilde // ~
55 addAdd // ++
56 subSub // --
57 star // *
58 power // **
59 equal // ==
60 nequal // !=
61 lequal // <=
62 gequal // >=
63
64 addAssgn // +=
65 subAssgn // -=
66 mulAssgn // *=
67 quoAssgn // /=
68 remAssgn // %=
69 andAssgn // &=
70 orAssgn // |=
71 xorAssgn // ^=
72 shlAssgn // <<=
73 shrAssgn // >>=
74
75 rdrOut // >
76 appOut // >>
77 rdrIn // <
78 rdrInOut // <>
79 dplIn // <&
80 dplOut // >&
81 clbOut // >|
82 hdoc // <<
83 dashHdoc // <<-
84 wordHdoc // <<<
85 rdrAll // &>
86 appAll // &>>
87
88 cmdIn // <(
89 cmdOut // >(
90
91 plus // +
92 colPlus // :+
93 minus // -
94 colMinus // :-
95 quest // ?
96 colQuest // :?
97 assgn // =
98 colAssgn // :=
99 perc // %
100 dblPerc // %%
101 hash // #
102 dblHash // ##
103 caret // ^
104 dblCaret // ^^
105 comma // ,
106 dblComma // ,,
107 at // @
108 slash // /
109 dblSlash // //
110 colon // :
111
112 tsExists // -e
113 tsRegFile // -f
114 tsDirect // -d
115 tsCharSp // -c
116 tsBlckSp // -b
117 tsNmPipe // -p
118 tsSocket // -S
119 tsSmbLink // -L
120 tsSticky // -k
121 tsGIDSet // -g
122 tsUIDSet // -u
123 tsGrpOwn // -G
124 tsUsrOwn // -O
125 tsModif // -N
126 tsRead // -r
127 tsWrite // -w
128 tsExec // -x
129 tsNoEmpty // -s
130 tsFdTerm // -t
131 tsEmpStr // -z
132 tsNempStr // -n
133 tsOptSet // -o
134 tsVarSet // -v
135 tsRefVar // -R
136
137 tsReMatch // =~
138 tsNewer // -nt
139 tsOlder // -ot
140 tsDevIno // -ef
141 tsEql // -eq
142 tsNeq // -ne
143 tsLeq // -le
144 tsGeq // -ge
145 tsLss // -lt
146 tsGtr // -gt
147
148 globQuest // ?(
149 globStar // *(
150 globPlus // +(
151 globAt // @(
152 globExcl // !(
153)
154
155type RedirOperator token
156
157const (
158 RdrOut = RedirOperator(rdrOut) + iota // >
159 AppOut // >>
160 RdrIn // <
161 RdrInOut // <>
162 DplIn // <&
163 DplOut // >&
164 ClbOut // >|
165 Hdoc // <<
166 DashHdoc // <<-
167 WordHdoc // <<<
168 RdrAll // &>
169 AppAll // &>>
170)
171
172type ProcOperator token
173
174const (
175 CmdIn = ProcOperator(cmdIn) + iota // <(
176 CmdOut // >(
177)
178
179type GlobOperator token
180
181const (
182 GlobZeroOrOne = GlobOperator(globQuest) + iota // ?(
183 GlobZeroOrMore // *(
184 GlobOneOrMore // +(
185 GlobOne // @(
186 GlobExcept // !(
187)
188
189type BinCmdOperator token
190
191const (
192 AndStmt = BinCmdOperator(andAnd) + iota // &&
193 OrStmt // ||
194 Pipe // |
195 PipeAll // |&
196)
197
198type CaseOperator token
199
200const (
201 Break = CaseOperator(dblSemicolon) + iota // ;;
202 Fallthrough // ;&
203 Resume // ;;&
204 ResumeKorn // ;|
205)
206
207type ParNamesOperator token
208
209const (
210 NamesPrefix = ParNamesOperator(star) // *
211 NamesPrefixWords = ParNamesOperator(at) // @
212)
213
214type ParExpOperator token
215
216const (
217 AlternateUnset = ParExpOperator(plus) + iota // +
218 AlternateUnsetOrNull // :+
219 DefaultUnset // -
220 DefaultUnsetOrNull // :-
221 ErrorUnset // ?
222 ErrorUnsetOrNull // :?
223 AssignUnset // =
224 AssignUnsetOrNull // :=
225 RemSmallSuffix // %
226 RemLargeSuffix // %%
227 RemSmallPrefix // #
228 RemLargePrefix // ##
229 UpperFirst // ^
230 UpperAll // ^^
231 LowerFirst // ,
232 LowerAll // ,,
233 OtherParamOps // @
234)
235
236type UnAritOperator token
237
238const (
239 Not = UnAritOperator(exclMark) + iota // !
240 BitNegation // ~
241 Inc // ++
242 Dec // --
243 Plus = UnAritOperator(plus) // +
244 Minus = UnAritOperator(minus) // -
245)
246
247type BinAritOperator token
248
249const (
250 Add = BinAritOperator(plus) // +
251 Sub = BinAritOperator(minus) // -
252 Mul = BinAritOperator(star) // *
253 Quo = BinAritOperator(slash) // /
254 Rem = BinAritOperator(perc) // %
255 Pow = BinAritOperator(power) // **
256 Eql = BinAritOperator(equal) // ==
257 Gtr = BinAritOperator(rdrOut) // >
258 Lss = BinAritOperator(rdrIn) // <
259 Neq = BinAritOperator(nequal) // !=
260 Leq = BinAritOperator(lequal) // <=
261 Geq = BinAritOperator(gequal) // >=
262 And = BinAritOperator(and) // &
263 Or = BinAritOperator(or) // |
264 Xor = BinAritOperator(caret) // ^
265 Shr = BinAritOperator(appOut) // >>
266 Shl = BinAritOperator(hdoc) // <<
267
268 AndArit = BinAritOperator(andAnd) // &&
269 OrArit = BinAritOperator(orOr) // ||
270 Comma = BinAritOperator(comma) // ,
271 TernQuest = BinAritOperator(quest) // ?
272 TernColon = BinAritOperator(colon) // :
273
274 Assgn = BinAritOperator(assgn) // =
275 AddAssgn = BinAritOperator(addAssgn) // +=
276 SubAssgn = BinAritOperator(subAssgn) // -=
277 MulAssgn = BinAritOperator(mulAssgn) // *=
278 QuoAssgn = BinAritOperator(quoAssgn) // /=
279 RemAssgn = BinAritOperator(remAssgn) // %=
280 AndAssgn = BinAritOperator(andAssgn) // &=
281 OrAssgn = BinAritOperator(orAssgn) // |=
282 XorAssgn = BinAritOperator(xorAssgn) // ^=
283 ShlAssgn = BinAritOperator(shlAssgn) // <<=
284 ShrAssgn = BinAritOperator(shrAssgn) // >>=
285)
286
287type UnTestOperator token
288
289const (
290 TsExists = UnTestOperator(tsExists) + iota // -e
291 TsRegFile // -f
292 TsDirect // -d
293 TsCharSp // -c
294 TsBlckSp // -b
295 TsNmPipe // -p
296 TsSocket // -S
297 TsSmbLink // -L
298 TsSticky // -k
299 TsGIDSet // -g
300 TsUIDSet // -u
301 TsGrpOwn // -G
302 TsUsrOwn // -O
303 TsModif // -N
304 TsRead // -r
305 TsWrite // -w
306 TsExec // -x
307 TsNoEmpty // -s
308 TsFdTerm // -t
309 TsEmpStr // -z
310 TsNempStr // -n
311 TsOptSet // -o
312 TsVarSet // -v
313 TsRefVar // -R
314 TsNot = UnTestOperator(exclMark) // !
315 TsParen = UnTestOperator(leftParen) // (
316)
317
318type BinTestOperator token
319
320const (
321 TsReMatch = BinTestOperator(tsReMatch) + iota // =~
322 TsNewer // -nt
323 TsOlder // -ot
324 TsDevIno // -ef
325 TsEql // -eq
326 TsNeq // -ne
327 TsLeq // -le
328 TsGeq // -ge
329 TsLss // -lt
330 TsGtr // -gt
331 AndTest = BinTestOperator(andAnd) // &&
332 OrTest = BinTestOperator(orOr) // ||
333 TsMatchShort = BinTestOperator(assgn) // =
334 TsMatch = BinTestOperator(equal) // ==
335 TsNoMatch = BinTestOperator(nequal) // !=
336 TsBefore = BinTestOperator(rdrIn) // <
337 TsAfter = BinTestOperator(rdrOut) // >
338)
339
340func (o RedirOperator) String() string { return token(o).String() }
341func (o ProcOperator) String() string { return token(o).String() }
342func (o GlobOperator) String() string { return token(o).String() }
343func (o BinCmdOperator) String() string { return token(o).String() }
344func (o CaseOperator) String() string { return token(o).String() }
345func (o ParNamesOperator) String() string { return token(o).String() }
346func (o ParExpOperator) String() string { return token(o).String() }
347func (o UnAritOperator) String() string { return token(o).String() }
348func (o BinAritOperator) String() string { return token(o).String() }
349func (o UnTestOperator) String() string { return token(o).String() }
350func (o BinTestOperator) String() string { return token(o).String() }