1 %{
2 #include "stdio.h"  // for fileno() prototype
3 #include "string.h" // for strdup() prototype
4 #include "mlr_dsl_parse.h"
5 #include "../dsl/mlr_dsl_ast.h"
6 // http://flex.sourceforge.net/manual/Extra-Data.html
7 
8 // NOTE: any new keywords defined here should also be documented
9 // in dsl/mlr_dsl_cst.c's mlr_dsl_keyword_usage() et al.
10 %}
11 
12 %option reentrant
13 %option noyywrap
14 %option extra-type="struct _mlr_dsl_ast_node_t **"
15 
16 %%
17 
18 ";" {
19 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY);
20 	return MD_TOKEN_SEMICOLON;
21 }
22 "{" {
23 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY);
24 	return MD_TOKEN_LBRACE;
25 }
26 "}" {
27 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY);
28 	return MD_TOKEN_RBRACE;
29 }
30 
31 "=" {
32 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_SREC_ASSIGNMENT);
33 	return MD_TOKEN_ASSIGN;
34 }
35 "filter" {
36 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_FILTER);
37 	return MD_TOKEN_FILTER;
38 }
39 "unset" {
40 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_UNSET);
41 	return MD_TOKEN_UNSET;
42 }
43 "tee" {
44 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_TEE);
45 	return MD_TOKEN_TEE;
46 }
47 "emitf" {
48 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_EMITF);
49 	return MD_TOKEN_EMITF;
50 }
51 "emitp" {
52 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_EMITP);
53 	return MD_TOKEN_EMITP;
54 }
55 "emit" {
56 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_EMIT);
57 	return MD_TOKEN_EMIT;
58 }
59 "dump" {
60 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_DUMP);
61 	return MD_TOKEN_DUMP;
62 }
63 "edump" {
64 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_EDUMP);
65 	return MD_TOKEN_EDUMP;
66 }
67 "print" {
68 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_PRINT);
69 	return MD_TOKEN_PRINT;
70 }
71 "printn" {
72 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_PRINTN);
73 	return MD_TOKEN_PRINTN;
74 }
75 "eprint" {
76 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_EPRINT);
77 	return MD_TOKEN_EPRINT;
78 }
79 "eprintn" {
80 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_EPRINTN);
81 	return MD_TOKEN_EPRINTN;
82 }
83 "stdout" {
84 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STDOUT);
85 	return MD_TOKEN_STDOUT;
86 }
87 "stderr" {
88 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STDERR);
89 	return MD_TOKEN_STDERR;
90 }
91 
92 "func" {
93 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY);
94 	return MD_TOKEN_FUNC_DEF;
95 }
96 "subr" {
97 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY);
98 	return MD_TOKEN_SUBR_DEF;
99 }
100 "call" {
101 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY);
102 	return MD_TOKEN_SUBR_CALL;
103 }
104 "return" {
105 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY);
106 	return MD_TOKEN_RETURN;
107 }
108 "begin" {
109 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY);
110 	return MD_TOKEN_BEGIN;
111 }
112 "end" {
113 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY);
114 	return MD_TOKEN_END;
115 }
116 "all" {
117 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_ALL);
118 	return MD_TOKEN_ALL;
119 }
120 
121 "do" {
122 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_DO_WHILE);
123 	return MD_TOKEN_DO;
124 }
125 "while" {
126 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_WHILE);
127 	return MD_TOKEN_WHILE;
128 }
129 "for" {
130 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY);
131 	return MD_TOKEN_FOR;
132 }
133 "in" {
134 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_IN);
135 	return MD_TOKEN_IN;
136 }
137 "break" {
138 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_BREAK);
139 	return MD_TOKEN_BREAK;
140 }
141 "continue" {
142 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_CONTINUE);
143 	return MD_TOKEN_CONTINUE;
144 }
145 "if" {
146 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_IF_ITEM);
147 	return MD_TOKEN_IF;
148 }
149 "elif" {
150 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_IF_ITEM);
151 	return MD_TOKEN_ELIF;
152 }
153 "else" {
154 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_IF_ITEM);
155 	return MD_TOKEN_ELSE;
156 }
157 
158 "?" {
159 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
160 	return MD_TOKEN_QUESTION_MARK;
161 }
162 
163 ":" {
164 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
165 	return MD_TOKEN_COLON;
166 }
167 
168 "||" {
169 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
170 	return MD_TOKEN_LOGICAL_OR;
171 }
172 "||=" {
173 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
174 	return MD_TOKEN_LOGICAL_OR_EQUALS;
175 }
176 "^^" {
177 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
178 	return MD_TOKEN_LOGICAL_XOR;
179 }
180 "^^=" {
181 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
182 	return MD_TOKEN_LOGICAL_XOR_EQUALS;
183 }
184 "&&" {
185 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
186 	return MD_TOKEN_LOGICAL_AND;
187 }
188 "&&=" {
189 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
190 	return MD_TOKEN_LOGICAL_AND_EQUALS;
191 }
192 
193 "=~" {
194 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
195 	return MD_TOKEN_MATCHES;
196 }
197 "!=~" {
198 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
199 	return MD_TOKEN_DOES_NOT_MATCH;
200 }
201 "==" {
202 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
203 	return MD_TOKEN_EQ;
204 }
205 "!=" {
206 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
207 	return MD_TOKEN_NE;
208 }
209 
210 ">" {
211 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
212 	return MD_TOKEN_GT;
213 }
214 ">=" {
215 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
216 	return MD_TOKEN_GE;
217 }
218 "<" {
219 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
220 	return MD_TOKEN_LT;
221 }
222 "<=" {
223 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
224 	return MD_TOKEN_LE;
225 }
226 
227 "|" {
228 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
229 	return MD_TOKEN_BITWISE_OR;
230 }
231 "|=" {
232 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
233 	return MD_TOKEN_BITWISE_OR_EQUALS;
234 }
235 
236 "^" {
237 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
238 	return MD_TOKEN_BITWISE_XOR;
239 }
240 "^=" {
241 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
242 	return MD_TOKEN_BITWISE_XOR_EQUALS;
243 }
244 
245 "&" {
246 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
247 	return MD_TOKEN_BITWISE_AND;
248 }
249 "&=" {
250 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
251 	return MD_TOKEN_BITWISE_AND_EQUALS;
252 }
253 
254 "<<" {
255 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
256 	return MD_TOKEN_BITWISE_LSH;
257 }
258 "<<=" {
259 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
260 	return MD_TOKEN_BITWISE_LSH_EQUALS;
261 }
262 ">>" {
263 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
264 	return MD_TOKEN_BITWISE_RSH;
265 }
266 ">>=" {
267 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
268 	return MD_TOKEN_BITWISE_RSH_EQUALS;
269 }
270 
271 "+" {
272 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
273 	return MD_TOKEN_PLUS;
274 }
275 "+=" {
276 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
277 	return MD_TOKEN_PLUS_EQUALS;
278 }
279 "-" {
280 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
281 	return MD_TOKEN_MINUS;
282 }
283 "-=" {
284 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
285 	return MD_TOKEN_MINUS_EQUALS;
286 }
287 "\." {
288 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
289 	return MD_TOKEN_DOT;
290 }
291 "\.=" {
292 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
293 	return MD_TOKEN_DOT_EQUALS;
294 }
295 "*" {
296 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
297 	return MD_TOKEN_TIMES;
298 }
299 "*=" {
300 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
301 	return MD_TOKEN_TIMES_EQUALS;
302 }
303 "/" {
304 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
305 	return MD_TOKEN_DIVIDE;
306 }
307 "/=" {
308 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
309 	return MD_TOKEN_DIVIDE_EQUALS;
310 }
311 "//" {
312 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
313 	return MD_TOKEN_INT_DIVIDE;
314 }
315 "//=" {
316 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
317 	return MD_TOKEN_INT_DIVIDE_EQUALS;
318 }
319 
320 "\.+" {
321 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
322 	return MD_TOKEN_OPLUS;
323 }
324 "\.+=" {
325 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
326 	return MD_TOKEN_OPLUS_EQUALS;
327 }
328 "\.-" {
329 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
330 	return MD_TOKEN_OMINUS;
331 }
332 "\.-=" {
333 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
334 	return MD_TOKEN_OMINUS_EQUALS;
335 }
336 "\.*" {
337 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
338 	return MD_TOKEN_OTIMES;
339 }
340 "\.*=" {
341 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
342 	return MD_TOKEN_OTIMES_EQUALS;
343 }
344 "\./" {
345 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
346 	return MD_TOKEN_ODIVIDE;
347 }
348 "\./=" {
349 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
350 	return MD_TOKEN_ODIVIDE_EQUALS;
351 }
352 "\.//" {
353 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
354 	return MD_TOKEN_INT_ODIVIDE;
355 }
356 "\.//=" {
357 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
358 	return MD_TOKEN_INT_ODIVIDE_EQUALS;
359 }
360 
361 "%" {
362 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
363 	return MD_TOKEN_MOD;
364 }
365 "%=" {
366 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
367 	return MD_TOKEN_MOD_EQUALS;
368 }
369 
370 "!" {
371 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
372 	return MD_TOKEN_LOGICAL_NOT;
373 }
374 
375 "~" {
376 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
377 	return MD_TOKEN_BITWISE_NOT;
378 }
379 
380 "**" {
381 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
382 	return MD_TOKEN_POW;
383 }
384 "**=" {
385 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_OPERATOR);
386 	return MD_TOKEN_POW_EQUALS;
387 }
388 
389 \$\* {
390 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_FULL_SREC);
391 	return MD_TOKEN_FULL_SREC;
392 }
393 \$ {
394 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY);
395 	return MD_TOKEN_DOLLAR_SIGN;
396 }
397 
398 \$[a-zA-Z_0-9]+ {
399 	// Note: the parser depends on the dollar sign being here. If this is changed,
400 	// that needs to be changed as well.
401 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_FIELD_NAME);
402 	return MD_TOKEN_FIELD_NAME;
403 }
404 \$\{([^\}]|\\.)*\} {
405 	// Note: the parser depends on the dollar sign being here. If this is changed,
406 	// that needs to be changed as well.
407 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_FIELD_NAME);
408 	return MD_TOKEN_BRACED_FIELD_NAME;
409 }
410 
411 @[a-zA-Z_0-9]+ {
412 	// Note: the parser depends on the at-sign being here. If this is changed,
413 	// that needs to be changed as well.
414 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRING_LITERAL);
415 	return MD_TOKEN_UNBRACED_OOSVAR_NAME;
416 }
417 @\{([^\}]|\\.)*\} {
418 	// Note: the parser depends on the percent-sign being here. If this is changed,
419 	// that needs to be changed as well.
420 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRING_LITERAL);
421 	return MD_TOKEN_BRACED_OOSVAR_NAME;
422 }
423 @ {
424 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY);
425 	return MD_TOKEN_AT_SIGN;
426 }
427 \@\* {
428 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_FULL_OOSVAR);
429 	return MD_TOKEN_FULL_OOSVAR;
430 }
431 
432 "\[" {
433 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY);
434 	return MD_TOKEN_LEFT_BRACKET;
435 }
436 "\]" {
437 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY);
438 	return MD_TOKEN_RIGHT_BRACKET;
439 }
440 
441 [0-9]+|[0-9]+\.[0-9]*|[0-9]*\.[0-9]+|[0-9]+[eE][0-9]+|[0-9]+[eE]-[0-9]+|[0-9]+\.[0-9]*[eE][0-9]+|[0-9]+\.[0-9]*[eE]-[0-9]+|[0-9]*\.[0-9]+[eE][0-9]+|[0-9]*\.[0-9]+[eE]-[0-9]+ {
442 	// Leading minus sign is handled via the unary-minus operator, not here.
443 	// 123
444 	// 123. 123.4
445 	// .234
446 	// 1e2
447 	// 1e-2
448 	// 1.2e3 1.e3
449 	// 1.2e-3 1.e-3
450 	// .2e3
451 	// .2e-3 1.e-3
452 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_NUMERIC_LITERAL);
453 	return MD_TOKEN_NUMBER;
454 }
455 0x[0-9a-fA-F]+ {
456 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_NUMERIC_LITERAL);
457 	return MD_TOKEN_NUMBER;
458 }
459 
460 \"([^\\\"]|\\.)*\" {
461 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRING_LITERAL);
462 	return MD_TOKEN_STRING;
463 }
464 
465 \"([^\\\"]|\\.)*\"\i {
466 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_REGEXI);
467 	return MD_TOKEN_REGEXI;
468 }
469 
470 "map" {
471 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY);
472 	return MD_TOKEN_MAP;
473 }
474 "var" {
475 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY);
476 	return MD_TOKEN_VAR;
477 }
478 "num" {
479 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_NUMERIC_LOCAL_DEFINITION);
480 	return MD_TOKEN_NUMERIC;
481 }
482 "int" {
483 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_INT_LOCAL_DEFINITION);
484 	return MD_TOKEN_INT;
485 }
486 "float" {
487 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_FLOAT_LOCAL_DEFINITION);
488 	return MD_TOKEN_FLOAT;
489 }
490 "bool" {
491 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_BOOLEAN_LOCAL_DEFINITION);
492 	return MD_TOKEN_BOOLEAN;
493 }
494 "str" {
495 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRING_LOCAL_DEFINITION);
496 	return MD_TOKEN_STRING;
497 }
498 
499 "true" {
500 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_BOOLEAN_LITERAL);
501 	return MD_TOKEN_TRUE;
502 }
503 "false" {
504 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_BOOLEAN_LITERAL);
505 	return MD_TOKEN_FALSE;
506 }
507 
508 "IPS" {
509 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_CONTEXT_VARIABLE);
510 	return MD_TOKEN_CONTEXT_VARIABLE;
511 }
512 "IFS" {
513 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_CONTEXT_VARIABLE);
514 	return MD_TOKEN_CONTEXT_VARIABLE;
515 }
516 "IRS" {
517 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_CONTEXT_VARIABLE);
518 	return MD_TOKEN_CONTEXT_VARIABLE;
519 }
520 "OPS" {
521 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_CONTEXT_VARIABLE);
522 	return MD_TOKEN_CONTEXT_VARIABLE;
523 }
524 "OFS" {
525 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_CONTEXT_VARIABLE);
526 	return MD_TOKEN_CONTEXT_VARIABLE;
527 }
528 "ORS" {
529 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_CONTEXT_VARIABLE);
530 	return MD_TOKEN_CONTEXT_VARIABLE;
531 }
532 
533 "NF" {
534 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_CONTEXT_VARIABLE);
535 	return MD_TOKEN_CONTEXT_VARIABLE;
536 }
537 "NR" {
538 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_CONTEXT_VARIABLE);
539 	return MD_TOKEN_CONTEXT_VARIABLE;
540 }
541 "FNR" {
542 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_CONTEXT_VARIABLE);
543 	return MD_TOKEN_CONTEXT_VARIABLE;
544 }
545 "FILENAME" {
546 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_CONTEXT_VARIABLE);
547 	return MD_TOKEN_CONTEXT_VARIABLE;
548 }
549 "FILENUM" {
550 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_CONTEXT_VARIABLE);
551 	return MD_TOKEN_CONTEXT_VARIABLE;
552 }
553 "M_PI" {
554 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_CONTEXT_VARIABLE);
555 	return MD_TOKEN_CONTEXT_VARIABLE;
556 }
557 "M_E" {
558 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_CONTEXT_VARIABLE);
559 	return MD_TOKEN_CONTEXT_VARIABLE;
560 }
561 "ENV" {
562 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_ENV);
563 	return MD_TOKEN_ENV;
564 }
565 
566 [a-zA-Z_][a-zA-Z_0-9]* {
567 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_NON_SIGIL_NAME);
568 	return MD_TOKEN_NON_SIGIL_NAME;
569 }
570 
571 "(" {
572 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY);
573 	return MD_TOKEN_LPAREN;
574 }
575 ")" {
576 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY);
577 	return MD_TOKEN_RPAREN;
578 }
579 
580 "," {
581 	*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY);
582 	return MD_TOKEN_COMMA;
583 }
584 
585 #.*\n { }
586 
587 [ \t\r\n] { }
588 
589 . {
590 	return -1;
591 }
592 %%
593