1 // vim: set filetype=none:
2 // (Lemon files have .y extensions like Yacc files but are not Yacc.)
3 
4 %include {
5 #include <stdio.h>
6 #include <string.h>
7 #include <math.h>
8 #include "../lib/mlrutil.h"
9 #include "../dsl/mlr_dsl_ast.h"
10 #include "../containers/sllv.h"
11 
12 // ================================================================
13 // AST:
14 // * parens, commas, semis, line endings, whitespace are all stripped away
15 // * variable names and literal values remain as leaf nodes of the AST
16 // * = + - * / ** {function names} remain as non-leaf nodes of the AST
17 // CST: See mlr_dsl_cst.c
18 //
19 // Note: This parser accepts many things that are invalid, e.g.
20 //
21 // * begin{end{}} -- begin/end not at top level
22 // * begin{$x=1} -- references to stream records at begin/end
23 // * break/continue outside of for/while/do-while
24 // * return outside of a function definition
25 // * $x=x -- boundvars outside of for-loop variable bindings
26 //
27 // All of the above are enforced by the CST builder's semantic-analysis logic,
28 // which takes this parser's output AST as input.  This is done (a) to keep this
29 // grammar from being overly complex, and (b) so we can get much more
30 // informative error messages in C than in Lemon ('syntax error').
31 //
32 // The parser hooks all build up an abstract syntax tree specifically for the CST builder.
33 // For clearer visuals on what the ASTs look like:
34 // * See mlr_dsl_cst.c
35 // * See reg_test/run's filter -v and put -v outputs, e.g. in reg_test/expected/out
36 // * Do "mlr -n put -v 'your expression goes here'"
37 // ================================================================
38 
39 }
40 
41 %token_type     {mlr_dsl_ast_node_t*}
42 %default_type   {mlr_dsl_ast_node_t*}
43 %extra_argument {mlr_dsl_ast_t* past}
44 
45 //void token_destructor(mlr_dsl_ast_node_t t) {
46 //	printf("In token_destructor t->text(%s)=t->type(%lf)\n", t->text, t->type);
47 //}
48 //%token_destructor {token_destructor($$);}
49 
50 %parse_accept {
51 }
52 
53 // The caller is expected to provide more context.
54 %syntax_error {
55 	fprintf(stderr, "mlr DSL: syntax error at \"%s\"\n", TOKEN->text);
56 
57 //	This is confusing and (as is) worse than nothing.
58 //	Ideally we want to show the position within the input of the syntax error.
59 //
60 //	int n = sizeof(yyTokenName) / sizeof(yyTokenName[0]);
61 //	for (int i = 0; i < n; ++i) {
62 //			int a = yy_find_shift_action(pparser, (YYCODETYPE)i);
63 //			if (a < YYNSTATE + YYNRULE) {
64 //				fprintf(stderr, "Possible token \"%s\"\n", yyTokenName[i]);
65 //			}
66 //	}
67 
68 }
69 
70 // ================================================================
md_statement_block(B)71 md_body ::= md_statement_block(B). {
72 	past->proot = B;
73 }
74 
75 // ----------------------------------------------------------------
76 // Given "$a=1;$b=2;$c=3": since this is a bottom-up parser, we get first the "$a=1", then
77 // "$a=1;$b=2", then "$a=1;$b=2;$c=3", then finally realize that's the top level, or it's embedded
78 // within a cond-block, or for-loop body, etc.
79 
80 // * On the "$a=1" we make a sub-AST called "list" with child $a=1.
81 // * On the "$b=2" we append the next argument to get "list" having children $a=1 and $b=2.
82 // * On the "$c=3" we append the next argument to get "list" having children $a=1, $b=2, and $c=3.
83 //
84 // We handle statements of the form ' ; ; ' by parsing the empty spaces around the semicolons as NOP nodes.
85 // But, the NOP nodes are immediately stripped here and are not included in the AST we return.
86 
md_statement_block(A)87 md_statement_block(A) ::= md_statement_braceless(B). {
88 	if (B->type == MD_AST_NODE_TYPE_NOP) {
89 		mlr_dsl_ast_node_free(B);
90 		A = mlr_dsl_ast_node_alloc_zary("block", MD_AST_NODE_TYPE_STATEMENT_BLOCK);
91 	} else {
92 		A = mlr_dsl_ast_node_alloc_unary("block", MD_AST_NODE_TYPE_STATEMENT_BLOCK, B);
93 	}
94 }
95 
md_statement_block(A)96 md_statement_block(A) ::= md_statement_braceful(B). {
97 	if (B->type == MD_AST_NODE_TYPE_NOP) {
98 		mlr_dsl_ast_node_free(B);
99 		A = mlr_dsl_ast_node_alloc_zary("block", MD_AST_NODE_TYPE_STATEMENT_BLOCK);
100 	} else {
101 		A = mlr_dsl_ast_node_alloc_unary("block", MD_AST_NODE_TYPE_STATEMENT_BLOCK, B);
102 	}
103 }
104 
105 // This could also be done with the list on the left and statement on the right. However,
106 // curly-brace-terminated statements *end* with a semicolon; they don't start with one. So this seems
107 // to be the right way to differentiate.
md_statement_block(A)108 md_statement_block(A) ::= md_statement_braceless(B) MD_TOKEN_SEMICOLON md_statement_block(C). {
109 	if (B->type == MD_AST_NODE_TYPE_NOP) {
110 		mlr_dsl_ast_node_free(B);
111 		A = C;
112 	} else {
113 		A = mlr_dsl_ast_node_prepend_arg(C, B);
114 	}
115 }
116 
md_statement_block(A)117 md_statement_block(A) ::= md_statement_braceful(B) md_statement_block(C). {
118 	if (B->type == MD_AST_NODE_TYPE_NOP) {
119 		mlr_dsl_ast_node_free(B);
120 		A = C;
121 	} else {
122 		A = mlr_dsl_ast_node_prepend_arg(C, B);
123 	}
124 }
125 
126 // This allows for trailing semicolon, as well as empty string (or whitespace) between semicolons:
md_statement_braceless(A)127 md_statement_braceless(A) ::= . {
128 	A = mlr_dsl_ast_node_alloc_zary("nop", MD_AST_NODE_TYPE_NOP);
129 }
130 
131 // Local-variable definitions at the current scope
md_statement_braceless(A)132 md_statement_braceless(A) ::= md_untyped_local_definition(B).    { A = B; }
md_statement_braceless(A)133 md_statement_braceless(A) ::= md_numeric_local_definition(B).    { A = B; }
md_statement_braceless(A)134 md_statement_braceless(A) ::= md_int_local_definition(B).        { A = B; }
md_statement_braceless(A)135 md_statement_braceless(A) ::= md_float_local_definition(B).      { A = B; }
md_statement_braceless(A)136 md_statement_braceless(A) ::= md_boolean_local_definition(B).    { A = B; }
md_statement_braceless(A)137 md_statement_braceless(A) ::= md_string_local_definition(B).     { A = B; }
md_statement_braceless(A)138 md_statement_braceless(A) ::= md_map_local_definition(B).        { A = B; }
md_statement_braceless(A)139 md_statement_braceless(A) ::= md_nonindexed_local_assignment(B). { A = B; }
md_statement_braceless(A)140 md_statement_braceless(A) ::= md_indexed_local_assignment(B).    { A = B; }
141 
142 // For user-defined functions
md_statement_braceless(A)143 md_statement_braceless(A) ::= MD_TOKEN_RETURN md_rhs(B). {
144 	A = mlr_dsl_ast_node_alloc_unary("return_value", MD_AST_NODE_TYPE_RETURN_VALUE, B);
145 }
md_statement_braceless(A)146 md_statement_braceless(A) ::= MD_TOKEN_RETURN md_map_literal(B). {
147 	A = mlr_dsl_ast_node_alloc_unary("return_value", MD_AST_NODE_TYPE_RETURN_VALUE, B);
148 }
md_statement_braceless(A)149 md_statement_braceless(A) ::= MD_TOKEN_RETURN MD_TOKEN_FULL_SREC(B). {
150 	A = mlr_dsl_ast_node_alloc_unary("return_value", MD_AST_NODE_TYPE_RETURN_VALUE, B);
151 }
md_statement_braceless(A)152 md_statement_braceless(A) ::= MD_TOKEN_RETURN MD_TOKEN_FULL_OOSVAR(B). {
153 	A = mlr_dsl_ast_node_alloc_unary("return_value", MD_AST_NODE_TYPE_RETURN_VALUE, B);
154 }
155 // For user-defined subroutines
md_statement_braceless(A)156 md_statement_braceless(A) ::= MD_TOKEN_RETURN. {
157 	A = mlr_dsl_ast_node_alloc_zary("return_void", MD_AST_NODE_TYPE_RETURN_VOID);
158 }
159 
160 // Begin/end
md_statement_braceful(A)161 md_statement_braceful(A) ::= md_func_block(B).  { A = B; }
md_statement_braceful(A)162 md_statement_braceful(A) ::= md_subr_block(B).  { A = B; }
md_statement_braceful(A)163 md_statement_braceful(A) ::= md_begin_block(B). { A = B; }
md_statement_braceful(A)164 md_statement_braceful(A) ::= md_end_block(B).   { A = B; }
165 
166 // Nested control structures:
md_statement_braceful(A)167 md_statement_braceful(A) ::= md_cond_block(B).                    { A = B; }
md_statement_braceful(A)168 md_statement_braceful(A) ::= md_while_block(B).                   { A = B; }
md_statement_braceful(A)169 md_statement_braceful(A) ::= md_for_loop_full_srec(B).            { A = B; }
md_statement_braceful(A)170 md_statement_braceful(A) ::= md_for_loop_full_srec_key_only(B).   { A = B; }
md_statement_braceful(A)171 md_statement_braceful(A) ::= md_for_loop_full_oosvar(B).          { A = B; }
md_statement_braceful(A)172 md_statement_braceful(A) ::= md_for_loop_full_oosvar_key_only(B). { A = B; }
md_statement_braceful(A)173 md_statement_braceful(A) ::= md_for_loop_oosvar(B).               { A = B; }
md_statement_braceful(A)174 md_statement_braceful(A) ::= md_for_loop_oosvar_key_only(B).      { A = B; }
md_statement_braceful(A)175 md_statement_braceful(A) ::= md_for_loop_local_map(B).            { A = B; }
md_statement_braceful(A)176 md_statement_braceful(A) ::= md_for_loop_local_map_key_only(B).   { A = B; }
md_statement_braceful(A)177 md_statement_braceful(A) ::= md_for_loop_map_literal(B).          { A = B; }
md_statement_braceful(A)178 md_statement_braceful(A) ::= md_for_loop_map_literal_key_only(B). { A = B; }
md_statement_braceful(A)179 md_statement_braceful(A) ::= md_for_loop_func_retval(B).            { A = B; }
md_statement_braceful(A)180 md_statement_braceful(A) ::= md_for_loop_func_retval_key_only(B).   { A = B; }
md_statement_braceful(A)181 md_statement_braceful(A) ::= md_triple_for(B).                    { A = B; }
md_statement_braceful(A)182 md_statement_braceful(A) ::= md_if_chain(B).                      { A = B; }
183 
md_statement_braceless(A)184 md_statement_braceless(A) ::= MD_TOKEN_SUBR_CALL md_fcn_or_subr_call(B). {
185 	A = mlr_dsl_ast_node_alloc_unary("subr_call", MD_AST_NODE_TYPE_SUBR_CALLSITE, B);
186 }
187 
188 // Not valid in begin/end since they refer to srecs:
md_statement_braceless(A)189 md_statement_braceless(A) ::= md_srec_assignment(B).                  { A = B; }
md_statement_braceless(A)190 md_statement_braceless(A) ::= md_srec_indirect_assignment(B).         { A = B; }
md_statement_braceless(A)191 md_statement_braceless(A) ::= md_srec_positional_name_assignment(B).  { A = B; }
md_statement_braceless(A)192 md_statement_braceless(A) ::= md_srec_positional_value_assignment(B). { A = B; }
md_statement_braceless(A)193 md_statement_braceless(A) ::= md_oosvar_from_full_srec_assignment(B). { A = B; }
md_statement_braceless(A)194 md_statement_braceless(A) ::= md_full_srec_assignment(B).             { A = B; }
md_statement_braceless(A)195 md_statement_braceless(A) ::= md_env_assignment(B).                   { A = B; }
196 
197 // Valid in begin/end since they don't refer to srecs (although the RHSs might):
md_statement_braceless(A)198 md_statement_braceless(A) ::= md_do_while_block(B).         { A = B; }
md_statement_braceless(A)199 md_statement_braceless(A) ::= md_bare_boolean(B).           { A = B; }
md_statement_braceless(A)200 md_statement_braceless(A) ::= md_oosvar_assignment(B).      { A = B; }
md_statement_braceless(A)201 md_statement_braceless(A) ::= md_full_oosvar_assignment(B). { A = B; }
md_statement_braceless(A)202 md_statement_braceless(A) ::= md_filter(B).                 { A = B; }
md_statement_braceless(A)203 md_statement_braceless(A) ::= md_unset(B).                  { A = B; }
204 
md_statement_braceless(A)205 md_statement_braceless(A) ::= md_tee_write(B).              { A = B; }
md_statement_braceless(A)206 md_statement_braceless(A) ::= md_tee_append(B).             { A = B; }
md_statement_braceless(A)207 md_statement_braceless(A) ::= md_tee_pipe(B).               { A = B; }
md_statement_braceless(A)208 md_statement_braceless(A) ::= md_emitf(B).                  { A = B; }
md_statement_braceless(A)209 md_statement_braceless(A) ::= md_emitf_write(B).            { A = B; }
md_statement_braceless(A)210 md_statement_braceless(A) ::= md_emitf_append(B).           { A = B; }
md_statement_braceless(A)211 md_statement_braceless(A) ::= md_emitf_pipe(B).             { A = B; }
md_statement_braceless(A)212 md_statement_braceless(A) ::= md_emitp(B).                  { A = B; }
md_statement_braceless(A)213 md_statement_braceless(A) ::= md_emitp_write(B).            { A = B; }
md_statement_braceless(A)214 md_statement_braceless(A) ::= md_emitp_append(B).           { A = B; }
md_statement_braceless(A)215 md_statement_braceless(A) ::= md_emitp_pipe(B).             { A = B; }
md_statement_braceless(A)216 md_statement_braceless(A) ::= md_emit(B).                   { A = B; }
md_statement_braceless(A)217 md_statement_braceless(A) ::= md_emit_write(B).             { A = B; }
md_statement_braceless(A)218 md_statement_braceless(A) ::= md_emit_append(B).            { A = B; }
md_statement_braceless(A)219 md_statement_braceless(A) ::= md_emit_pipe(B).              { A = B; }
md_statement_braceless(A)220 md_statement_braceless(A) ::= md_emitp_lashed(B).           { A = B; }
md_statement_braceless(A)221 md_statement_braceless(A) ::= md_emitp_lashed_write(B).     { A = B; }
md_statement_braceless(A)222 md_statement_braceless(A) ::= md_emitp_lashed_append(B).    { A = B; }
md_statement_braceless(A)223 md_statement_braceless(A) ::= md_emitp_lashed_pipe(B).      { A = B; }
md_statement_braceless(A)224 md_statement_braceless(A) ::= md_emit_lashed(B).            { A = B; }
md_statement_braceless(A)225 md_statement_braceless(A) ::= md_emit_lashed_write(B).      { A = B; }
md_statement_braceless(A)226 md_statement_braceless(A) ::= md_emit_lashed_append(B).     { A = B; }
md_statement_braceless(A)227 md_statement_braceless(A) ::= md_emit_lashed_pipe(B).       { A = B; }
228 
md_statement_braceless(A)229 md_statement_braceless(A) ::= md_dump(B).                   { A = B; }
md_statement_braceless(A)230 md_statement_braceless(A) ::= md_dump_write(B).             { A = B; }
md_statement_braceless(A)231 md_statement_braceless(A) ::= md_dump_append(B).            { A = B; }
md_statement_braceless(A)232 md_statement_braceless(A) ::= md_dump_pipe(B).              { A = B; }
md_statement_braceless(A)233 md_statement_braceless(A) ::= md_edump(B).                  { A = B; }
md_statement_braceless(A)234 md_statement_braceless(A) ::= md_print(B).                  { A = B; }
md_statement_braceless(A)235 md_statement_braceless(A) ::= md_eprint(B).                 { A = B; }
md_statement_braceless(A)236 md_statement_braceless(A) ::= md_print_write(B).            { A = B; }
md_statement_braceless(A)237 md_statement_braceless(A) ::= md_print_append(B).           { A = B; }
md_statement_braceless(A)238 md_statement_braceless(A) ::= md_print_pipe(B).             { A = B; }
md_statement_braceless(A)239 md_statement_braceless(A) ::= md_printn(B).                 { A = B; }
md_statement_braceless(A)240 md_statement_braceless(A) ::= md_eprintn(B).                { A = B; }
md_statement_braceless(A)241 md_statement_braceless(A) ::= md_printn_write(B).           { A = B; }
md_statement_braceless(A)242 md_statement_braceless(A) ::= md_printn_append(B).          { A = B; }
md_statement_braceless(A)243 md_statement_braceless(A) ::= md_printn_pipe(B).            { A = B; }
244 
245 // Valid only within for/while, but we accept them here syntactically and reject them in the AST-to-CST
246 // conversion, where we can produce much more informative error messages:
md_statement_braceless(A)247 md_statement_braceless(A) ::= MD_TOKEN_BREAK(O). {
248 	A = mlr_dsl_ast_node_alloc(O->text, MD_AST_NODE_TYPE_BREAK);
249 }
md_statement_braceless(A)250 md_statement_braceless(A) ::= MD_TOKEN_CONTINUE(O). {
251 	A = mlr_dsl_ast_node_alloc(O->text, MD_AST_NODE_TYPE_CONTINUE);
252 }
253 
254 // ================================================================
255 // Given "f(a,b,c)": since this is a bottom-up parser, we get first the "a",
256 // then "a,b", then "a,b,c", then finally "f(a,b,c)". So:
257 // * On the "a" we make a function sub-AST called "anon(a)".
258 // * On the "b" we append the next argument to get "anon(a,b)".
259 // * On the "c" we append the next argument to get "anon(a,b,c)".
260 // * On the "f" we change the function name to get "f(a,b,c)".
261 
md_func_block(C)262 md_func_block(C) ::= MD_TOKEN_FUNC_DEF
263 	MD_TOKEN_NON_SIGIL_NAME(F) MD_TOKEN_LPAREN md_func_or_subr_parameter_list(A) MD_TOKEN_RPAREN
264 	MD_TOKEN_LBRACE md_statement_block(B) MD_TOKEN_RBRACE.
265 {
266 	A = mlr_dsl_ast_node_set_function_name(A, F->text);
267 	mlr_dsl_ast_node_replace_text(B, "func_block");
268 	C = mlr_dsl_ast_node_alloc_binary(F->text, MD_AST_NODE_TYPE_FUNC_DEF, A, B);
269 }
270 
md_func_block(C)271 md_func_block(C) ::= MD_TOKEN_FUNC_DEF
272 	MD_TOKEN_NON_SIGIL_NAME(F) MD_TOKEN_LPAREN md_func_or_subr_parameter_list(A) MD_TOKEN_RPAREN
273 	MD_TOKEN_COLON md_typedecl(M)
274 	MD_TOKEN_LBRACE md_statement_block(B) MD_TOKEN_RBRACE.
275 {
276 	A = mlr_dsl_ast_node_set_function_name(A, F->text);
277 	mlr_dsl_ast_node_replace_text(B, "func_block");
278 	C = mlr_dsl_ast_node_alloc_ternary(F->text, MD_AST_NODE_TYPE_FUNC_DEF, A, B, M);
279 }
280 
md_subr_block(C)281 md_subr_block(C) ::= MD_TOKEN_SUBR_DEF
282 	MD_TOKEN_NON_SIGIL_NAME(F) MD_TOKEN_LPAREN md_func_or_subr_parameter_list(A) MD_TOKEN_RPAREN
283 	MD_TOKEN_LBRACE md_statement_block(B) MD_TOKEN_RBRACE.
284 {
285 	A = mlr_dsl_ast_node_set_function_name(A, F->text);
286 	mlr_dsl_ast_node_replace_text(B, "subr_block");
287 	C = mlr_dsl_ast_node_alloc_binary(F->text, MD_AST_NODE_TYPE_SUBR_DEF, A, B);
288 }
289 
md_func_or_subr_parameter_list(A)290 md_func_or_subr_parameter_list(A) ::= . {
291 	A = mlr_dsl_ast_node_alloc_zary("anon", MD_AST_NODE_TYPE_NON_SIGIL_NAME);
292 }
md_func_or_subr_parameter_list(A)293 md_func_or_subr_parameter_list(A) ::= md_func_or_subr_non_empty_parameter_list(B). {
294 	A = B;
295 }
md_func_or_subr_non_empty_parameter_list(A)296 md_func_or_subr_non_empty_parameter_list(A) ::= md_func_or_subr_parameter(B). {
297 	A = mlr_dsl_ast_node_alloc_unary("anon", MD_AST_NODE_TYPE_NON_SIGIL_NAME, B);
298 }
md_func_or_subr_non_empty_parameter_list(A)299 md_func_or_subr_non_empty_parameter_list(A) ::= md_func_or_subr_parameter(B) MD_TOKEN_COMMA. {
300 	A = mlr_dsl_ast_node_alloc_unary("anon", MD_AST_NODE_TYPE_NON_SIGIL_NAME, B);
301 }
md_func_or_subr_non_empty_parameter_list(A)302 md_func_or_subr_non_empty_parameter_list(A) ::= md_func_or_subr_parameter(B) MD_TOKEN_COMMA
303 	md_func_or_subr_non_empty_parameter_list(C).
304 {
305 	A = mlr_dsl_ast_node_prepend_arg(C, B);
306 }
307 
md_func_or_subr_parameter(A)308 md_func_or_subr_parameter(A) ::= MD_TOKEN_NON_SIGIL_NAME(B). {
309 	A = mlr_dsl_ast_node_alloc(B->text, MD_AST_NODE_TYPE_UNTYPED_PARAMETER_DEFINITION);
310 }
md_func_or_subr_parameter(A)311 md_func_or_subr_parameter(A) ::= md_typedecl(T) MD_TOKEN_NON_SIGIL_NAME(N). {
312 	A = mlr_dsl_ast_node_alloc(N->text, T->type);
313 }
314 
md_typedecl(A)315 md_typedecl(A) ::= MD_TOKEN_VAR(B).     { A = B; A->type = MD_AST_NODE_TYPE_UNTYPED_PARAMETER_DEFINITION; }
md_typedecl(A)316 md_typedecl(A) ::= MD_TOKEN_NUMERIC(B). { A = B; A->type = MD_AST_NODE_TYPE_NUMERIC_PARAMETER_DEFINITION; }
md_typedecl(A)317 md_typedecl(A) ::= MD_TOKEN_INT(B).     { A = B; A->type = MD_AST_NODE_TYPE_INT_PARAMETER_DEFINITION;     }
md_typedecl(A)318 md_typedecl(A) ::= MD_TOKEN_FLOAT(B).   { A = B; A->type = MD_AST_NODE_TYPE_FLOAT_PARAMETER_DEFINITION;   }
md_typedecl(A)319 md_typedecl(A) ::= MD_TOKEN_STRING(B).  { A = B; A->type = MD_AST_NODE_TYPE_STRING_PARAMETER_DEFINITION;  }
md_typedecl(A)320 md_typedecl(A) ::= MD_TOKEN_BOOLEAN(B). { A = B; A->type = MD_AST_NODE_TYPE_BOOLEAN_PARAMETER_DEFINITION; }
md_typedecl(A)321 md_typedecl(A) ::= MD_TOKEN_MAP(B).     { A = B; A->type = MD_AST_NODE_TYPE_MAP_PARAMETER_DEFINITION;     }
322 
323 // ================================================================
md_begin_block(A)324 md_begin_block(A) ::= MD_TOKEN_BEGIN(O) MD_TOKEN_LBRACE md_statement_block(B) MD_TOKEN_RBRACE. {
325 	mlr_dsl_ast_node_replace_text(B, "begin_block");
326 	A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_BEGIN, B);
327 }
md_end_block(A)328 md_end_block(A)   ::= MD_TOKEN_END(O)   MD_TOKEN_LBRACE md_statement_block(B) MD_TOKEN_RBRACE. {
329 	mlr_dsl_ast_node_replace_text(B, "end_block");
330 	A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_END, B);
331 }
332 
333 // ----------------------------------------------------------------
md_cond_block(A)334 md_cond_block(A) ::= md_rhs(B) MD_TOKEN_LBRACE md_statement_block(C) MD_TOKEN_RBRACE. {
335 	mlr_dsl_ast_node_replace_text(C, "cond_block");
336 	A = mlr_dsl_ast_node_alloc_binary("cond", MD_AST_NODE_TYPE_CONDITIONAL_BLOCK, B, C);
337 }
338 
339 // ----------------------------------------------------------------
md_while_block(A)340 md_while_block(A) ::=
341 	MD_TOKEN_WHILE(O)
342 		MD_TOKEN_LPAREN md_rhs(B) MD_TOKEN_RPAREN
343 		MD_TOKEN_LBRACE md_statement_block(C) MD_TOKEN_RBRACE.
344 {
345 	mlr_dsl_ast_node_replace_text(C, "while_block");
346 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_WHILE, B, C);
347 }
348 
349 // ----------------------------------------------------------------
md_do_while_block(A)350 md_do_while_block(A) ::=
351 	MD_TOKEN_DO(O)
352 		MD_TOKEN_LBRACE md_statement_block(B) MD_TOKEN_RBRACE
353 	MD_TOKEN_WHILE
354 		MD_TOKEN_LPAREN md_rhs(C) MD_TOKEN_RPAREN.
355 {
356 	mlr_dsl_ast_node_replace_text(B, "do_while_block");
357 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_DO_WHILE, B, C);
358 }
359 
360 // ----------------------------------------------------------------
361 // for(k, v in $*) { ... }
md_for_loop_full_srec(A)362 md_for_loop_full_srec(A) ::=
363 	MD_TOKEN_FOR(F) MD_TOKEN_LPAREN
364 		md_for_loop_index(K) MD_TOKEN_COMMA md_for_loop_index(V)
365 		MD_TOKEN_IN MD_TOKEN_FULL_SREC
366 	MD_TOKEN_RPAREN
367 	MD_TOKEN_LBRACE
368 		md_statement_block(S)
369 	MD_TOKEN_RBRACE.
370 {
371 	mlr_dsl_ast_node_replace_text(S, "for_full_srec_block");
372 	A = mlr_dsl_ast_node_alloc_binary(
373 		F->text,
374 		MD_AST_NODE_TYPE_FOR_SREC,
375 		mlr_dsl_ast_node_alloc_binary(
376 			"variables",
377 			MD_AST_NODE_TYPE_FOR_VARIABLES,
378 			K,
379 			V
380 		),
381 		S
382 	);
383 }
384 
385 // for(k in $*) { ... }
md_for_loop_full_srec_key_only(A)386 md_for_loop_full_srec_key_only(A) ::=
387 	MD_TOKEN_FOR(F) MD_TOKEN_LPAREN
388 		md_for_loop_index(K) MD_TOKEN_IN MD_TOKEN_FULL_SREC
389 	MD_TOKEN_RPAREN
390 	MD_TOKEN_LBRACE
391 		md_statement_block(S)
392 	MD_TOKEN_RBRACE.
393 {
394 	mlr_dsl_ast_node_replace_text(S, "for_full_srec_block");
395 	A = mlr_dsl_ast_node_alloc_binary(
396 		F->text,
397 		MD_AST_NODE_TYPE_FOR_SREC_KEY_ONLY,
398 		mlr_dsl_ast_node_alloc_unary(
399 			"variables",
400 			MD_AST_NODE_TYPE_FOR_VARIABLES,
401 			K
402 		),
403 		S
404 	);
405 }
406 
407 // for(k, v in @*) { ... }
md_for_loop_full_oosvar(A)408 md_for_loop_full_oosvar(A) ::=
409 	MD_TOKEN_FOR(F) MD_TOKEN_LPAREN
410 		md_for_loop_index(K) MD_TOKEN_COMMA md_for_loop_index(V)
411 		MD_TOKEN_IN MD_TOKEN_FULL_OOSVAR
412 	MD_TOKEN_RPAREN
413 	MD_TOKEN_LBRACE
414 		md_statement_block(S)
415 	MD_TOKEN_RBRACE.
416 {
417 	mlr_dsl_ast_node_replace_text(S, "for_full_oosvar_block");
418 	A = mlr_dsl_ast_node_alloc_ternary(
419 		F->text,
420 		MD_AST_NODE_TYPE_FOR_OOSVAR,
421 		mlr_dsl_ast_node_alloc_binary(
422 			"key_and_value_variables",
423 			MD_AST_NODE_TYPE_FOR_VARIABLES,
424 			mlr_dsl_ast_node_alloc_unary(
425 				"key_variables",
426 				MD_AST_NODE_TYPE_FOR_VARIABLES,
427 				K
428 			),
429 			V
430 		),
431 		mlr_dsl_ast_node_alloc_zary("empty_keylist", MD_AST_NODE_TYPE_OOSVAR_KEYLIST),
432 		S
433 	);
434 }
435 
436 // for((k1, k2), v in @*) { ... }
437 // for((k1, k2, k3), v in @*) { ... }
md_for_loop_full_oosvar(A)438 md_for_loop_full_oosvar(A) ::=
439 	MD_TOKEN_FOR(F) MD_TOKEN_LPAREN
440 		MD_TOKEN_LPAREN md_for_map_keylist(L) MD_TOKEN_RPAREN MD_TOKEN_COMMA md_for_loop_index(V)
441 		MD_TOKEN_IN MD_TOKEN_FULL_OOSVAR
442 	MD_TOKEN_RPAREN
443 	MD_TOKEN_LBRACE
444 		md_statement_block(S)
445 	MD_TOKEN_RBRACE.
446 {
447 	mlr_dsl_ast_node_replace_text(S, "for_full_oosvar_block");
448 	A = mlr_dsl_ast_node_alloc_ternary(
449 		F->text,
450 		MD_AST_NODE_TYPE_FOR_OOSVAR,
451 		mlr_dsl_ast_node_alloc_binary(
452 			"key_and_value_variables",
453 			MD_AST_NODE_TYPE_FOR_VARIABLES,
454 			L,
455 			V
456 		),
457 		mlr_dsl_ast_node_alloc_zary("empty_keylist", MD_AST_NODE_TYPE_OOSVAR_KEYLIST),
458 		S
459 	);
460 }
461 
462 // for(k in @*) { ... }
md_for_loop_full_oosvar_key_only(A)463 md_for_loop_full_oosvar_key_only(A) ::=
464 	MD_TOKEN_FOR(F) MD_TOKEN_LPAREN
465 		md_for_loop_index(K)
466 		MD_TOKEN_IN
467 		MD_TOKEN_FULL_OOSVAR
468 	MD_TOKEN_RPAREN
469 	MD_TOKEN_LBRACE
470 		md_statement_block(S)
471 	MD_TOKEN_RBRACE.
472 {
473 	mlr_dsl_ast_node_replace_text(S, "for_full_oosvar_block");
474 	A = mlr_dsl_ast_node_alloc_ternary(
475 		F->text,
476 		MD_AST_NODE_TYPE_FOR_OOSVAR_KEY_ONLY,
477 		K,
478 		mlr_dsl_ast_node_alloc_zary("empty_keylist", MD_AST_NODE_TYPE_OOSVAR_KEYLIST),
479 		S
480 	);
481 }
482 
483 // for(k, v in @o[1][2]) { ... }
md_for_loop_oosvar(A)484 md_for_loop_oosvar(A) ::=
485 	MD_TOKEN_FOR(F) MD_TOKEN_LPAREN
486 		md_for_loop_index(K) MD_TOKEN_COMMA md_for_loop_index(V)
487 		MD_TOKEN_IN md_oosvar_keylist(O)
488 	MD_TOKEN_RPAREN
489 	MD_TOKEN_LBRACE
490 		md_statement_block(S)
491 	MD_TOKEN_RBRACE.
492 {
493 	mlr_dsl_ast_node_replace_text(S, "for_loop_oosvar_block");
494 	A = mlr_dsl_ast_node_alloc_ternary(
495 		F->text,
496 		MD_AST_NODE_TYPE_FOR_OOSVAR,
497 		mlr_dsl_ast_node_alloc_binary(
498 			"key_and_value_variables",
499 			MD_AST_NODE_TYPE_FOR_VARIABLES,
500 			mlr_dsl_ast_node_alloc_unary(
501 				"key_variables",
502 				MD_AST_NODE_TYPE_FOR_VARIABLES,
503 				K
504 			),
505 			V
506 		),
507 		O,
508 		S
509 	);
510 }
511 
512 // for((k1, k2), v in @o[1][2]) { ... }
513 // for((k1, k2, k3), v in @o[1][2]) { ... }
md_for_loop_oosvar(A)514 md_for_loop_oosvar(A) ::=
515 	MD_TOKEN_FOR(F) MD_TOKEN_LPAREN
516 		MD_TOKEN_LPAREN md_for_map_keylist(L) MD_TOKEN_RPAREN MD_TOKEN_COMMA md_for_loop_index(V)
517 		MD_TOKEN_IN md_oosvar_keylist(O)
518 	MD_TOKEN_RPAREN
519 	MD_TOKEN_LBRACE
520 		md_statement_block(S)
521 	MD_TOKEN_RBRACE.
522 {
523 	mlr_dsl_ast_node_replace_text(S, "for_loop_oosvar_block");
524 	A = mlr_dsl_ast_node_alloc_ternary(
525 		F->text,
526 		MD_AST_NODE_TYPE_FOR_OOSVAR,
527 		mlr_dsl_ast_node_alloc_binary(
528 			"key_and_value_variables",
529 			MD_AST_NODE_TYPE_FOR_VARIABLES,
530 			L,
531 			V
532 		),
533 		O,
534 		S
535 	);
536 }
537 
md_for_loop_index(A)538 md_for_loop_index(A) ::= MD_TOKEN_NON_SIGIL_NAME(B). {
539 	A = mlr_dsl_ast_node_alloc(B->text, MD_AST_NODE_TYPE_UNTYPED_LOCAL_DEFINITION);
540 }
md_for_loop_index(A)541 md_for_loop_index(A) ::= MD_TOKEN_NUMERIC MD_TOKEN_NON_SIGIL_NAME(B). {
542 	A = mlr_dsl_ast_node_alloc(B->text, MD_AST_NODE_TYPE_NUMERIC_LOCAL_DEFINITION);
543 }
md_for_loop_index(A)544 md_for_loop_index(A) ::= MD_TOKEN_INT MD_TOKEN_NON_SIGIL_NAME(B). {
545 	A = mlr_dsl_ast_node_alloc(B->text, MD_AST_NODE_TYPE_INT_LOCAL_DEFINITION);
546 }
md_for_loop_index(A)547 md_for_loop_index(A) ::= MD_TOKEN_FLOAT MD_TOKEN_NON_SIGIL_NAME(B). {
548 	A = mlr_dsl_ast_node_alloc(B->text, MD_AST_NODE_TYPE_FLOAT_LOCAL_DEFINITION);
549 }
md_for_loop_index(A)550 md_for_loop_index(A) ::= MD_TOKEN_STRING MD_TOKEN_NON_SIGIL_NAME(B). {
551 	A = mlr_dsl_ast_node_alloc(B->text, MD_AST_NODE_TYPE_STRING_LOCAL_DEFINITION);
552 }
md_for_loop_index(A)553 md_for_loop_index(A) ::= MD_TOKEN_BOOLEAN MD_TOKEN_NON_SIGIL_NAME(B). {
554 	A = mlr_dsl_ast_node_alloc(B->text, MD_AST_NODE_TYPE_BOOLEAN_LOCAL_DEFINITION);
555 }
556 
md_for_map_keylist(A)557 md_for_map_keylist(A) ::= md_for_loop_index(K). {
558 	A = mlr_dsl_ast_node_alloc_unary("key_variables", MD_AST_NODE_TYPE_FOR_VARIABLES, K);
559 }
md_for_map_keylist(A)560 md_for_map_keylist(A) ::= md_for_map_keylist(L) MD_TOKEN_COMMA md_for_loop_index(K). {
561 	A = mlr_dsl_ast_node_append_arg(L, K);
562 }
563 
564 // for(k in @o[1][2]) { ... }
md_for_loop_oosvar_key_only(A)565 md_for_loop_oosvar_key_only(A) ::=
566 	MD_TOKEN_FOR(F) MD_TOKEN_LPAREN
567 		md_for_loop_index(K)
568 		MD_TOKEN_IN md_oosvar_keylist(O)
569 	MD_TOKEN_RPAREN
570 	MD_TOKEN_LBRACE
571 		md_statement_block(S)
572 	MD_TOKEN_RBRACE.
573 {
574 	mlr_dsl_ast_node_replace_text(S, "for_loop_oosvar_block");
575 	A = mlr_dsl_ast_node_alloc_ternary(
576 		F->text,
577 		MD_AST_NODE_TYPE_FOR_OOSVAR_KEY_ONLY,
578 		K,
579 		O,
580 		S
581 	);
582 }
583 
584 // ----------------------------------------------------------------
585 // for(k, v in o[1][2]) { ... }
md_for_loop_local_map(A)586 md_for_loop_local_map(A) ::=
587 	MD_TOKEN_FOR(F) MD_TOKEN_LPAREN
588 		md_for_loop_index(K) MD_TOKEN_COMMA md_for_loop_index(V)
589 		MD_TOKEN_IN md_local_map_keylist(O)
590 	MD_TOKEN_RPAREN
591 	MD_TOKEN_LBRACE
592 		md_statement_block(S)
593 	MD_TOKEN_RBRACE.
594 {
595 	mlr_dsl_ast_node_replace_text(S, "for_loop_local_map_block");
596 	A = mlr_dsl_ast_node_alloc_ternary(
597 		F->text,
598 		MD_AST_NODE_TYPE_FOR_LOCAL_MAP,
599 		mlr_dsl_ast_node_alloc_binary(
600 			"key_and_value_variables",
601 			MD_AST_NODE_TYPE_FOR_VARIABLES,
602 			mlr_dsl_ast_node_alloc_unary(
603 				"key_variables",
604 				MD_AST_NODE_TYPE_FOR_VARIABLES,
605 				K
606 			),
607 			V
608 		),
609 		O,
610 		S
611 	);
612 }
613 
614 // for((k1, k2), v in o[1][2]) { ... }
615 // for((k1, k2, k3), v in o[1][2]) { ... }
md_for_loop_local_map(A)616 md_for_loop_local_map(A) ::=
617 	MD_TOKEN_FOR(F) MD_TOKEN_LPAREN
618 		MD_TOKEN_LPAREN md_for_map_keylist(L) MD_TOKEN_RPAREN MD_TOKEN_COMMA md_for_loop_index(V)
619 		MD_TOKEN_IN md_local_map_keylist(O)
620 	MD_TOKEN_RPAREN
621 	MD_TOKEN_LBRACE
622 		md_statement_block(S)
623 	MD_TOKEN_RBRACE.
624 {
625 	mlr_dsl_ast_node_replace_text(S, "for_loop_local_map_block");
626 	A = mlr_dsl_ast_node_alloc_ternary(
627 		F->text,
628 		MD_AST_NODE_TYPE_FOR_LOCAL_MAP,
629 		mlr_dsl_ast_node_alloc_binary(
630 			"key_and_value_variables",
631 			MD_AST_NODE_TYPE_FOR_VARIABLES,
632 			L,
633 			V
634 		),
635 		O,
636 		S
637 	);
638 }
639 
640 // for(k in o[1][2]) { ... }
md_for_loop_local_map_key_only(A)641 md_for_loop_local_map_key_only(A) ::=
642 	MD_TOKEN_FOR(F) MD_TOKEN_LPAREN
643 		md_for_loop_index(K)
644 		MD_TOKEN_IN md_local_map_keylist(O)
645 	MD_TOKEN_RPAREN
646 	MD_TOKEN_LBRACE
647 		md_statement_block(S)
648 	MD_TOKEN_RBRACE.
649 {
650 	mlr_dsl_ast_node_replace_text(S, "for_loop_local_map_block");
651 	A = mlr_dsl_ast_node_alloc_ternary(
652 		F->text,
653 		MD_AST_NODE_TYPE_FOR_LOCAL_MAP_KEY_ONLY,
654 		K,
655 		O,
656 		S
657 	);
658 }
659 
660 // ----------------------------------------------------------------
661 // for(k, v in o[1][2]) { ... }
md_for_loop_map_literal(A)662 md_for_loop_map_literal(A) ::=
663 	MD_TOKEN_FOR(F) MD_TOKEN_LPAREN
664 		md_for_loop_index(K) MD_TOKEN_COMMA md_for_loop_index(V)
665 		MD_TOKEN_IN md_map_literal(O)
666 	MD_TOKEN_RPAREN
667 	MD_TOKEN_LBRACE
668 		md_statement_block(S)
669 	MD_TOKEN_RBRACE.
670 {
671 	mlr_dsl_ast_node_replace_text(S, "for_loop_map_literal_block");
672 	A = mlr_dsl_ast_node_alloc_ternary(
673 		F->text,
674 		MD_AST_NODE_TYPE_FOR_MAP_LITERAL,
675 		mlr_dsl_ast_node_alloc_binary(
676 			"key_and_value_variables",
677 			MD_AST_NODE_TYPE_FOR_VARIABLES,
678 			mlr_dsl_ast_node_alloc_unary(
679 				"key_variables",
680 				MD_AST_NODE_TYPE_FOR_VARIABLES,
681 				K
682 			),
683 			V
684 		),
685 		O,
686 		S
687 	);
688 }
689 
690 // for((k1, k2), v in o[1][2]) { ... }
691 // for((k1, k2, k3), v in o[1][2]) { ... }
md_for_loop_map_literal(A)692 md_for_loop_map_literal(A) ::=
693 	MD_TOKEN_FOR(F) MD_TOKEN_LPAREN
694 		MD_TOKEN_LPAREN md_for_map_keylist(L) MD_TOKEN_RPAREN MD_TOKEN_COMMA md_for_loop_index(V)
695 		MD_TOKEN_IN md_map_literal(O)
696 	MD_TOKEN_RPAREN
697 	MD_TOKEN_LBRACE
698 		md_statement_block(S)
699 	MD_TOKEN_RBRACE.
700 {
701 	mlr_dsl_ast_node_replace_text(S, "for_loop_map_literal_block");
702 	A = mlr_dsl_ast_node_alloc_ternary(
703 		F->text,
704 		MD_AST_NODE_TYPE_FOR_MAP_LITERAL,
705 		mlr_dsl_ast_node_alloc_binary(
706 			"key_and_value_variables",
707 			MD_AST_NODE_TYPE_FOR_VARIABLES,
708 			L,
709 			V
710 		),
711 		O,
712 		S
713 	);
714 }
715 
716 // for(k in o[1][2]) { ... }
md_for_loop_map_literal_key_only(A)717 md_for_loop_map_literal_key_only(A) ::=
718 	MD_TOKEN_FOR(F) MD_TOKEN_LPAREN
719 		md_for_loop_index(K)
720 		MD_TOKEN_IN md_map_literal(O)
721 	MD_TOKEN_RPAREN
722 	MD_TOKEN_LBRACE
723 		md_statement_block(S)
724 	MD_TOKEN_RBRACE.
725 {
726 	mlr_dsl_ast_node_replace_text(S, "for_loop_map_literal_block");
727 	A = mlr_dsl_ast_node_alloc_ternary(
728 		F->text,
729 		MD_AST_NODE_TYPE_FOR_MAP_LITERAL_KEY_ONLY,
730 		K,
731 		O,
732 		S
733 	);
734 }
735 
736 // ----------------------------------------------------------------
737 // for(k, v in o[1][2]) { ... }
md_for_loop_func_retval(A)738 md_for_loop_func_retval(A) ::=
739 	MD_TOKEN_FOR(F) MD_TOKEN_LPAREN
740 		md_for_loop_index(K) MD_TOKEN_COMMA md_for_loop_index(V)
741 		MD_TOKEN_IN md_fcn_or_subr_call(O)
742 	MD_TOKEN_RPAREN
743 	MD_TOKEN_LBRACE
744 		md_statement_block(S)
745 	MD_TOKEN_RBRACE.
746 {
747 	mlr_dsl_ast_node_replace_text(S, "for_loop_func_retval_block");
748 	A = mlr_dsl_ast_node_alloc_ternary(
749 		F->text,
750 		MD_AST_NODE_TYPE_FOR_FUNC_RETVAL,
751 		mlr_dsl_ast_node_alloc_binary(
752 			"key_and_value_variables",
753 			MD_AST_NODE_TYPE_FOR_VARIABLES,
754 			mlr_dsl_ast_node_alloc_unary(
755 				"key_variables",
756 				MD_AST_NODE_TYPE_FOR_VARIABLES,
757 				K
758 			),
759 			V
760 		),
761 		O,
762 		S
763 	);
764 }
765 
766 // for((k1, k2), v in o[1][2]) { ... }
767 // for((k1, k2, k3), v in o[1][2]) { ... }
md_for_loop_func_retval(A)768 md_for_loop_func_retval(A) ::=
769 	MD_TOKEN_FOR(F) MD_TOKEN_LPAREN
770 		MD_TOKEN_LPAREN md_for_map_keylist(L) MD_TOKEN_RPAREN MD_TOKEN_COMMA md_for_loop_index(V)
771 		MD_TOKEN_IN md_fcn_or_subr_call(O)
772 	MD_TOKEN_RPAREN
773 	MD_TOKEN_LBRACE
774 		md_statement_block(S)
775 	MD_TOKEN_RBRACE.
776 {
777 	mlr_dsl_ast_node_replace_text(S, "for_loop_func_retval_block");
778 	A = mlr_dsl_ast_node_alloc_ternary(
779 		F->text,
780 		MD_AST_NODE_TYPE_FOR_FUNC_RETVAL,
781 		mlr_dsl_ast_node_alloc_binary(
782 			"key_and_value_variables",
783 			MD_AST_NODE_TYPE_FOR_VARIABLES,
784 			L,
785 			V
786 		),
787 		O,
788 		S
789 	);
790 }
791 
792 // for(k in o[1][2]) { ... }
md_for_loop_func_retval_key_only(A)793 md_for_loop_func_retval_key_only(A) ::=
794 	MD_TOKEN_FOR(F) MD_TOKEN_LPAREN
795 		md_for_loop_index(K)
796 		MD_TOKEN_IN md_fcn_or_subr_call(O)
797 	MD_TOKEN_RPAREN
798 	MD_TOKEN_LBRACE
799 		md_statement_block(S)
800 	MD_TOKEN_RBRACE.
801 {
802 	mlr_dsl_ast_node_replace_text(S, "for_loop_func_retval_block");
803 	A = mlr_dsl_ast_node_alloc_ternary(
804 		F->text,
805 		MD_AST_NODE_TYPE_FOR_FUNC_RETVAL_KEY_ONLY,
806 		K,
807 		O,
808 		S
809 	);
810 }
811 
812 // ----------------------------------------------------------------
md_triple_for(A)813 md_triple_for(A) ::=
814 	MD_TOKEN_FOR(F) MD_TOKEN_LPAREN
815 		md_triple_for_start(S)
816 			MD_TOKEN_SEMICOLON
817 		md_triple_for_continuation(C)
818 			MD_TOKEN_SEMICOLON
819 		md_triple_for_update(U)
820 	MD_TOKEN_RPAREN
821 	MD_TOKEN_LBRACE
822 		md_statement_block(L)
823 	MD_TOKEN_RBRACE.
824 {
825 	mlr_dsl_ast_node_replace_text(L, "triple_for_block");
826 	A = mlr_dsl_ast_node_alloc_quaternary(F->text, MD_AST_NODE_TYPE_TRIPLE_FOR, S, C, U, L);
827 }
828 
md_triple_for_start(A)829 md_triple_for_start(A) ::= md_statement_braceless(B). {
830 	if (B->type == MD_AST_NODE_TYPE_NOP) {
831 		mlr_dsl_ast_node_free(B);
832 		A = mlr_dsl_ast_node_alloc_zary("triple_for_start_statements", MD_AST_NODE_TYPE_STATEMENT_LIST);
833 	} else {
834 		A = mlr_dsl_ast_node_alloc_unary("triple_for_start_statements", MD_AST_NODE_TYPE_STATEMENT_LIST, B);
835 	}
836 }
md_triple_for_start(A)837 md_triple_for_start(A) ::= md_triple_for_start(B) MD_TOKEN_COMMA md_statement_braceless(C). {
838 	if (B->type == MD_AST_NODE_TYPE_NOP) {
839 		mlr_dsl_ast_node_free(B);
840 		A = C;
841 	} else {
842 		A = mlr_dsl_ast_node_append_arg(B, C);
843 	}
844 }
845 
md_triple_for_continuation(A)846 md_triple_for_continuation(A) ::= md_statement_braceless(B). {
847 	if (B->type == MD_AST_NODE_TYPE_NOP) {
848 		mlr_dsl_ast_node_free(B);
849 		A = mlr_dsl_ast_node_alloc_zary("triple_for_continuation_statements", MD_AST_NODE_TYPE_STATEMENT_LIST);
850 	} else {
851 		A = mlr_dsl_ast_node_alloc_unary("triple_for_continuation_statements", MD_AST_NODE_TYPE_STATEMENT_LIST, B);
852 	}
853 }
md_triple_for_continuation(A)854 md_triple_for_continuation(A) ::= md_triple_for_continuation(B) MD_TOKEN_COMMA md_statement_braceless(C). {
855 	if (B->type == MD_AST_NODE_TYPE_NOP) {
856 		mlr_dsl_ast_node_free(B);
857 		A = C;
858 	} else {
859 		A = mlr_dsl_ast_node_append_arg(B, C);
860 	}
861 }
862 
md_triple_for_update(A)863 md_triple_for_update(A) ::= md_statement_braceless(B). {
864 	if (B->type == MD_AST_NODE_TYPE_NOP) {
865 		mlr_dsl_ast_node_free(B);
866 		A = mlr_dsl_ast_node_alloc_zary("triple_for_update_statements", MD_AST_NODE_TYPE_STATEMENT_LIST);
867 	} else {
868 		A = mlr_dsl_ast_node_alloc_unary("triple_for_update_statements", MD_AST_NODE_TYPE_STATEMENT_LIST, B);
869 	}
870 }
md_triple_for_update(A)871 md_triple_for_update(A) ::= md_triple_for_update(B) MD_TOKEN_COMMA md_statement_braceless(C). {
872 	if (B->type == MD_AST_NODE_TYPE_NOP) {
873 		mlr_dsl_ast_node_free(B);
874 		A = C;
875 	} else {
876 		A = mlr_dsl_ast_node_append_arg(B, C);
877 	}
878 }
879 
880 // ----------------------------------------------------------------
881 // Cases:
882 //   if elif*
883 //   if elif* else
884 
md_if_chain(A)885 md_if_chain(A) ::= md_if_elif_star(B) . {
886 	A = B;
887 }
md_if_chain(A)888 md_if_chain(A) ::= md_if_elif_star(B) md_else_block(C). {
889 	A = mlr_dsl_ast_node_append_arg(B, C);
890 }
md_if_elif_star(A)891 md_if_elif_star(A) ::= md_if_block(B). {
892 	A = mlr_dsl_ast_node_alloc_unary("if_head", MD_AST_NODE_TYPE_IF_HEAD, B);
893 }
md_if_elif_star(A)894 md_if_elif_star(A) ::= md_if_elif_star(B) md_elif_block(C). {
895 	A = mlr_dsl_ast_node_append_arg(B, C);
896 }
897 
md_if_block(A)898 md_if_block(A) ::=
899 	MD_TOKEN_IF(O)
900 		MD_TOKEN_LPAREN md_rhs(B) MD_TOKEN_RPAREN
901 		MD_TOKEN_LBRACE md_statement_block(C) MD_TOKEN_RBRACE.
902 {
903 	mlr_dsl_ast_node_replace_text(C, "if_block");
904 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_IF_ITEM, B, C);
905 }
906 
md_elif_block(A)907 md_elif_block(A) ::=
908 	MD_TOKEN_ELIF(O)
909 		MD_TOKEN_LPAREN md_rhs(B) MD_TOKEN_RPAREN
910 		MD_TOKEN_LBRACE md_statement_block(C) MD_TOKEN_RBRACE.
911 {
912 	mlr_dsl_ast_node_replace_text(C, "elif_block");
913 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_IF_ITEM, B, C);
914 }
915 
md_else_block(A)916 md_else_block(A) ::=
917 	MD_TOKEN_ELSE(O)
918 		MD_TOKEN_LBRACE md_statement_block(C) MD_TOKEN_RBRACE.
919 {
920 	mlr_dsl_ast_node_replace_text(C, "else_block");
921 	A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_IF_ITEM, C);
922 }
923 
924 // ----------------------------------------------------------------
md_bare_boolean(A)925 md_bare_boolean(A) ::= md_rhs(B). {
926 	A = B;
927 }
928 
929 // ----------------------------------------------------------------
md_filter(A)930 md_filter(A) ::= MD_TOKEN_FILTER(O) md_rhs(B). {
931 	A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILTER, B);
932 }
933 
934 // ----------------------------------------------------------------
md_untyped_local_definition(A)935 md_untyped_local_definition(A) ::= MD_TOKEN_VAR(T) md_nonindexed_local_variable(N) MD_TOKEN_ASSIGN md_rhs(B). {
936 	A = mlr_dsl_ast_node_alloc_binary(T->text, MD_AST_NODE_TYPE_UNTYPED_LOCAL_DEFINITION, N, B);
937 }
md_untyped_local_definition(A)938 md_untyped_local_definition(A) ::= MD_TOKEN_VAR(T) md_nonindexed_local_variable(N) MD_TOKEN_ASSIGN MD_TOKEN_FULL_SREC(B). {
939 	A = mlr_dsl_ast_node_alloc_binary(T->text, MD_AST_NODE_TYPE_UNTYPED_LOCAL_DEFINITION, N, B);
940 }
md_untyped_local_definition(A)941 md_untyped_local_definition(A) ::= MD_TOKEN_VAR(T) md_nonindexed_local_variable(N) MD_TOKEN_ASSIGN MD_TOKEN_FULL_OOSVAR(B). {
942 	A = mlr_dsl_ast_node_alloc_binary(T->text, MD_AST_NODE_TYPE_UNTYPED_LOCAL_DEFINITION, N, B);
943 }
md_untyped_local_definition(A)944 md_untyped_local_definition(A) ::= MD_TOKEN_VAR(T) md_nonindexed_local_variable(N) MD_TOKEN_ASSIGN md_map_literal(C). {
945 	A = mlr_dsl_ast_node_alloc_binary(T->text, MD_AST_NODE_TYPE_MAP_LOCAL_DEFINITION, N, C);
946 }
947 
md_numeric_local_definition(A)948 md_numeric_local_definition(A) ::= MD_TOKEN_NUMERIC(T) md_nonindexed_local_variable(N) MD_TOKEN_ASSIGN md_rhs(B). {
949 	A = mlr_dsl_ast_node_alloc_binary(T->text, MD_AST_NODE_TYPE_NUMERIC_LOCAL_DEFINITION, N, B);
950 }
md_int_local_definition(A)951 md_int_local_definition(A) ::= MD_TOKEN_INT(T) md_nonindexed_local_variable(N) MD_TOKEN_ASSIGN md_rhs(B). {
952 	A = mlr_dsl_ast_node_alloc_binary(T->text, MD_AST_NODE_TYPE_INT_LOCAL_DEFINITION, N, B);
953 }
md_float_local_definition(A)954 md_float_local_definition(A) ::= MD_TOKEN_FLOAT(T) md_nonindexed_local_variable(N) MD_TOKEN_ASSIGN md_rhs(B). {
955 	A = mlr_dsl_ast_node_alloc_binary(T->text, MD_AST_NODE_TYPE_FLOAT_LOCAL_DEFINITION, N, B);
956 }
md_boolean_local_definition(A)957 md_boolean_local_definition(A) ::= MD_TOKEN_BOOLEAN(T) md_nonindexed_local_variable(N) MD_TOKEN_ASSIGN md_rhs(B). {
958 	A = mlr_dsl_ast_node_alloc_binary(T->text, MD_AST_NODE_TYPE_BOOLEAN_LOCAL_DEFINITION, N, B);
959 }
md_string_local_definition(A)960 md_string_local_definition(A) ::= MD_TOKEN_STRING(T) md_nonindexed_local_variable(N) MD_TOKEN_ASSIGN md_rhs(B). {
961 	A = mlr_dsl_ast_node_alloc_binary(T->text, MD_AST_NODE_TYPE_STRING_LOCAL_DEFINITION, N, B);
962 }
963 
md_map_local_definition(A)964 md_map_local_definition(A) ::= MD_TOKEN_MAP(T) md_nonindexed_local_variable(N) MD_TOKEN_ASSIGN md_map_literal(C). {
965 	A = mlr_dsl_ast_node_alloc_binary(T->text, MD_AST_NODE_TYPE_MAP_LOCAL_DEFINITION, N, C);
966 }
md_map_local_definition(A)967 md_map_local_definition(A) ::= MD_TOKEN_MAP(T) md_nonindexed_local_variable(N) MD_TOKEN_ASSIGN MD_TOKEN_FULL_SREC(C). {
968 	A = mlr_dsl_ast_node_alloc_binary(T->text, MD_AST_NODE_TYPE_MAP_LOCAL_DEFINITION, N, C);
969 }
md_map_local_definition(A)970 md_map_local_definition(A) ::= MD_TOKEN_MAP(T) md_nonindexed_local_variable(N) MD_TOKEN_ASSIGN MD_TOKEN_FULL_OOSVAR(C). {
971 	A = mlr_dsl_ast_node_alloc_binary(T->text, MD_AST_NODE_TYPE_MAP_LOCAL_DEFINITION, N, C);
972 }
md_map_local_definition(A)973 md_map_local_definition(A) ::= MD_TOKEN_MAP(T) md_nonindexed_local_variable(N) MD_TOKEN_ASSIGN md_rhs(C). {
974 	A = mlr_dsl_ast_node_alloc_binary(T->text, MD_AST_NODE_TYPE_MAP_LOCAL_DEFINITION, N, C);
975 }
976 
md_nonindexed_local_assignment(A)977 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_ASSIGN(O) md_rhs(C). {
978 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B, C);
979 }
md_indexed_local_assignment(A)980 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_ASSIGN(O) md_rhs(C). {
981 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B, C);
982 }
983 
md_nonindexed_local_assignment(A)984 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_ASSIGN(O) md_map_literal(C). {
985 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B, C);
986 }
md_indexed_local_assignment(A)987 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_ASSIGN(O) md_map_literal(C). {
988 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B, C);
989 }
990 
md_nonindexed_local_assignment(A)991 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_ASSIGN(O) MD_TOKEN_FULL_OOSVAR(C). {
992 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B, C);
993 }
md_indexed_local_assignment(A)994 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_ASSIGN(O) MD_TOKEN_FULL_OOSVAR(C). {
995 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B, C);
996 }
997 
md_nonindexed_local_assignment(A)998 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_ASSIGN(O) MD_TOKEN_FULL_SREC(C). {
999 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B, C);
1000 }
md_indexed_local_assignment(A)1001 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_ASSIGN(O) MD_TOKEN_FULL_SREC(C). {
1002 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B, C);
1003 }
1004 
1005 // ----------------------------------------------------------------
md_srec_assignment(A)1006 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_ASSIGN(O) md_rhs(C). {
1007 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B, C);
1008 }
md_srec_indirect_assignment(A)1009 md_srec_indirect_assignment(A)  ::=
1010 	MD_TOKEN_DOLLAR_SIGN MD_TOKEN_LEFT_BRACKET md_rhs(B) MD_TOKEN_RIGHT_BRACKET
1011 	MD_TOKEN_ASSIGN(O) md_rhs(C).
1012 {
1013 	A = mlr_dsl_ast_node_alloc_binary(
1014 		O->text,
1015 		MD_AST_NODE_TYPE_INDIRECT_SREC_ASSIGNMENT,
1016 		B,
1017 		C
1018 	);
1019 }
md_srec_positional_name_assignment(A)1020 md_srec_positional_name_assignment(A)  ::=
1021 	MD_TOKEN_DOLLAR_SIGN
1022 		MD_TOKEN_LEFT_BRACKET MD_TOKEN_LEFT_BRACKET
1023 			md_rhs(B)
1024 		MD_TOKEN_RIGHT_BRACKET MD_TOKEN_RIGHT_BRACKET
1025 	MD_TOKEN_ASSIGN(O) md_rhs(C).
1026 {
1027 	A = mlr_dsl_ast_node_alloc_binary(
1028 		O->text,
1029 		MD_AST_NODE_TYPE_POSITIONAL_SREC_NAME_ASSIGNMENT,
1030 		B,
1031 		C
1032 	);
1033 }
1034 // '$[[[3]]] = "new"' is shorthand for '$[ $[[3]] ] = "new"'.
1035 // Note that '$[[3]]' is key at srec position 3 and '$[[[3]]]' is value at srec position 3.
md_srec_positional_value_assignment(A)1036 md_srec_positional_value_assignment(A)  ::=
1037 	MD_TOKEN_DOLLAR_SIGN
1038 		MD_TOKEN_LEFT_BRACKET MD_TOKEN_LEFT_BRACKET MD_TOKEN_LEFT_BRACKET
1039 			md_rhs(B)
1040 		MD_TOKEN_RIGHT_BRACKET MD_TOKEN_RIGHT_BRACKET MD_TOKEN_RIGHT_BRACKET
1041 	MD_TOKEN_ASSIGN(O) md_rhs(C).
1042 {
1043 	A = mlr_dsl_ast_node_alloc_binary(
1044 		O->text,
1045 		MD_AST_NODE_TYPE_INDIRECT_SREC_ASSIGNMENT,
1046 		mlr_dsl_ast_node_alloc_unary(
1047 			"positional_srec_field_name",
1048 			MD_AST_NODE_TYPE_POSITIONAL_SREC_NAME,
1049 			B
1050 		),
1051 		C
1052 	);
1053 }
1054 
md_oosvar_assignment(A)1055 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_ASSIGN(O) md_rhs(C). {
1056 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B, C);
1057 }
1058 
md_oosvar_assignment(A)1059 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_ASSIGN(O) md_map_literal(C). {
1060 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B, C);
1061 }
1062 
md_oosvar_assignment(A)1063 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_ASSIGN(O) MD_TOKEN_FULL_OOSVAR(C). {
1064 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B, C);
1065 }
1066 
md_full_oosvar_assignment(A)1067 md_full_oosvar_assignment(A)  ::= MD_TOKEN_FULL_OOSVAR(B) MD_TOKEN_ASSIGN(O) md_rhs(C). {
1068 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_FULL_OOSVAR_ASSIGNMENT, B, C);
1069 }
1070 
md_full_oosvar_assignment(A)1071 md_full_oosvar_assignment(A)  ::= MD_TOKEN_FULL_OOSVAR(B) MD_TOKEN_ASSIGN(O) md_map_literal(C). {
1072 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_FULL_OOSVAR_ASSIGNMENT, B, C);
1073 }
1074 
md_full_oosvar_assignment(A)1075 md_full_oosvar_assignment(A)  ::= MD_TOKEN_FULL_OOSVAR(B) MD_TOKEN_ASSIGN(O) MD_TOKEN_FULL_OOSVAR(C). {
1076 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_FULL_OOSVAR_ASSIGNMENT, B, C);
1077 }
1078 
md_full_oosvar_assignment(A)1079 md_full_oosvar_assignment(A)  ::= MD_TOKEN_FULL_OOSVAR(B) MD_TOKEN_ASSIGN(O) MD_TOKEN_FULL_SREC(C). {
1080 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_FULL_OOSVAR_FROM_FULL_SREC_ASSIGNMENT, B, C);
1081 }
1082 
md_full_oosvar_assignment(A)1083 md_full_oosvar_assignment(A)  ::= MD_TOKEN_FULL_OOSVAR(B) MD_TOKEN_ASSIGN(O) md_fcn_or_subr_call(C). {
1084 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_FULL_OOSVAR_FROM_FULL_SREC_ASSIGNMENT, B, C);
1085 }
1086 
md_oosvar_from_full_srec_assignment(A)1087 md_oosvar_from_full_srec_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_ASSIGN(O) MD_TOKEN_FULL_SREC(C). {
1088 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OOSVAR_FROM_FULL_SREC_ASSIGNMENT, B, C);
1089 }
1090 
md_full_srec_assignment(A)1091 md_full_srec_assignment(A)  ::= MD_TOKEN_FULL_SREC(B) MD_TOKEN_ASSIGN(O) md_rhs(C). {
1092 	A = mlr_dsl_ast_node_alloc_binary(O->text,
1093 		MD_AST_NODE_TYPE_FULL_SREC_ASSIGNMENT, B, C);
1094 }
md_full_srec_assignment(A)1095 md_full_srec_assignment(A)  ::= MD_TOKEN_FULL_SREC(B) MD_TOKEN_ASSIGN(O) md_map_literal(C). {
1096 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_FULL_SREC_ASSIGNMENT, B, C);
1097 }
md_full_srec_assignment(A)1098 md_full_srec_assignment(A)  ::= MD_TOKEN_FULL_SREC(B) MD_TOKEN_ASSIGN(O) MD_TOKEN_FULL_SREC(C). {
1099 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_FULL_SREC_ASSIGNMENT, B, C);
1100 }
md_full_srec_assignment(A)1101 md_full_srec_assignment(A)  ::= MD_TOKEN_FULL_SREC(B) MD_TOKEN_ASSIGN(O) MD_TOKEN_FULL_OOSVAR(C). {
1102 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_FULL_SREC_ASSIGNMENT, B, C);
1103 }
1104 
md_env_assignment(A)1105 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_ASSIGN(O) md_rhs(C). {
1106 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B, C);
1107 }
1108 
1109 // ----------------------------------------------------------------
md_srec_assignment(A)1110 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_LOGICAL_OR_EQUALS md_rhs(C). {
1111 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1112 		mlr_dsl_ast_node_alloc_binary("||", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1113 }
md_srec_assignment(A)1114 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_LOGICAL_XOR_EQUALS md_rhs(C). {
1115 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1116 		mlr_dsl_ast_node_alloc_binary("^^", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1117 }
md_srec_assignment(A)1118 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_LOGICAL_AND_EQUALS md_rhs(C). {
1119 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1120 		mlr_dsl_ast_node_alloc_binary("&&", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1121 }
md_srec_assignment(A)1122 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_BITWISE_OR_EQUALS md_rhs(C). {
1123 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1124 		mlr_dsl_ast_node_alloc_binary("|", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1125 }
md_srec_assignment(A)1126 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_BITWISE_XOR_EQUALS md_rhs(C). {
1127 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1128 		mlr_dsl_ast_node_alloc_binary("^", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1129 }
md_srec_assignment(A)1130 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_BITWISE_AND_EQUALS md_rhs(C). {
1131 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1132 		mlr_dsl_ast_node_alloc_binary("&", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1133 }
md_srec_assignment(A)1134 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_BITWISE_LSH_EQUALS md_rhs(C). {
1135 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1136 		mlr_dsl_ast_node_alloc_binary("<<", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1137 }
md_srec_assignment(A)1138 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_BITWISE_RSH_EQUALS md_rhs(C). {
1139 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1140 		mlr_dsl_ast_node_alloc_binary(">>", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1141 }
1142 
md_srec_assignment(A)1143 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_PLUS_EQUALS md_rhs(C). {
1144 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1145 		mlr_dsl_ast_node_alloc_binary("+", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1146 }
md_srec_assignment(A)1147 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_MINUS_EQUALS md_rhs(C). {
1148 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1149 		mlr_dsl_ast_node_alloc_binary("-", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1150 }
md_srec_assignment(A)1151 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_DOT_EQUALS md_rhs(C). {
1152 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1153 		mlr_dsl_ast_node_alloc_binary(".", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1154 }
md_srec_assignment(A)1155 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_TIMES_EQUALS md_rhs(C). {
1156 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1157 		mlr_dsl_ast_node_alloc_binary("*", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1158 }
md_srec_assignment(A)1159 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_DIVIDE_EQUALS md_rhs(C). {
1160 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1161 		mlr_dsl_ast_node_alloc_binary("/", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1162 }
md_srec_assignment(A)1163 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_INT_DIVIDE_EQUALS md_rhs(C). {
1164 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1165 		mlr_dsl_ast_node_alloc_binary("//", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1166 }
1167 
md_srec_assignment(A)1168 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_OPLUS_EQUALS md_rhs(C). {
1169 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1170 		mlr_dsl_ast_node_alloc_binary(".+", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1171 }
md_srec_assignment(A)1172 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_OMINUS_EQUALS md_rhs(C). {
1173 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1174 		mlr_dsl_ast_node_alloc_binary(".-", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1175 }
md_srec_assignment(A)1176 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_OTIMES_EQUALS md_rhs(C). {
1177 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1178 		mlr_dsl_ast_node_alloc_binary(".*", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1179 }
md_srec_assignment(A)1180 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_ODIVIDE_EQUALS md_rhs(C). {
1181 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1182 		mlr_dsl_ast_node_alloc_binary("./", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1183 }
md_srec_assignment(A)1184 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_INT_ODIVIDE_EQUALS md_rhs(C). {
1185 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1186 		mlr_dsl_ast_node_alloc_binary(".//", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1187 }
1188 
md_srec_assignment(A)1189 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_MOD_EQUALS md_rhs(C). {
1190 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1191 		mlr_dsl_ast_node_alloc_binary("%", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1192 }
md_srec_assignment(A)1193 md_srec_assignment(A)  ::= md_field_name(B) MD_TOKEN_POW_EQUALS md_rhs(C). {
1194 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B,
1195 		mlr_dsl_ast_node_alloc_binary("**", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1196 }
1197 
1198 
md_oosvar_assignment(A)1199 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_LOGICAL_OR_EQUALS md_rhs(C). {
1200 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1201 		mlr_dsl_ast_node_alloc_binary("||", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1202 }
md_oosvar_assignment(A)1203 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_LOGICAL_XOR_EQUALS md_rhs(C). {
1204 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1205 		mlr_dsl_ast_node_alloc_binary("^^", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1206 }
md_oosvar_assignment(A)1207 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_LOGICAL_AND_EQUALS md_rhs(C). {
1208 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1209 		mlr_dsl_ast_node_alloc_binary("&&", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1210 }
md_oosvar_assignment(A)1211 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_BITWISE_OR_EQUALS md_rhs(C). {
1212 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1213 		mlr_dsl_ast_node_alloc_binary("|", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1214 }
md_oosvar_assignment(A)1215 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_BITWISE_XOR_EQUALS md_rhs(C). {
1216 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1217 		mlr_dsl_ast_node_alloc_binary("^", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1218 }
md_oosvar_assignment(A)1219 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_BITWISE_AND_EQUALS md_rhs(C). {
1220 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1221 		mlr_dsl_ast_node_alloc_binary("&", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1222 }
md_oosvar_assignment(A)1223 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_BITWISE_LSH_EQUALS md_rhs(C). {
1224 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1225 		mlr_dsl_ast_node_alloc_binary("<<", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1226 }
md_oosvar_assignment(A)1227 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_BITWISE_RSH_EQUALS md_rhs(C). {
1228 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1229 		mlr_dsl_ast_node_alloc_binary(">>", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1230 }
1231 
md_oosvar_assignment(A)1232 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_PLUS_EQUALS md_rhs(C). {
1233 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1234 		mlr_dsl_ast_node_alloc_binary("+", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1235 }
md_oosvar_assignment(A)1236 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_MINUS_EQUALS md_rhs(C). {
1237 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1238 		mlr_dsl_ast_node_alloc_binary("-", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1239 }
md_oosvar_assignment(A)1240 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_DOT_EQUALS md_rhs(C). {
1241 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1242 		mlr_dsl_ast_node_alloc_binary(".", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1243 }
md_oosvar_assignment(A)1244 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_TIMES_EQUALS md_rhs(C). {
1245 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1246 		mlr_dsl_ast_node_alloc_binary("*", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1247 }
md_oosvar_assignment(A)1248 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_DIVIDE_EQUALS md_rhs(C). {
1249 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1250 		mlr_dsl_ast_node_alloc_binary("/", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1251 }
md_oosvar_assignment(A)1252 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_INT_DIVIDE_EQUALS md_rhs(C). {
1253 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1254 		mlr_dsl_ast_node_alloc_binary("//", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1255 }
md_oosvar_assignment(A)1256 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_MOD_EQUALS md_rhs(C). {
1257 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1258 		mlr_dsl_ast_node_alloc_binary("%", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1259 }
md_oosvar_assignment(A)1260 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_POW_EQUALS md_rhs(C). {
1261 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1262 		mlr_dsl_ast_node_alloc_binary("**", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1263 }
1264 
md_oosvar_assignment(A)1265 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_OPLUS_EQUALS md_rhs(C). {
1266 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1267 		mlr_dsl_ast_node_alloc_binary(".+", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1268 }
md_oosvar_assignment(A)1269 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_OMINUS_EQUALS md_rhs(C). {
1270 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1271 		mlr_dsl_ast_node_alloc_binary(".-", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1272 }
md_oosvar_assignment(A)1273 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_OTIMES_EQUALS md_rhs(C). {
1274 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1275 		mlr_dsl_ast_node_alloc_binary(".*", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1276 }
md_oosvar_assignment(A)1277 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_ODIVIDE_EQUALS md_rhs(C). {
1278 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1279 		mlr_dsl_ast_node_alloc_binary("./", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1280 }
md_oosvar_assignment(A)1281 md_oosvar_assignment(A)  ::= md_oosvar_keylist(B) MD_TOKEN_INT_ODIVIDE_EQUALS md_rhs(C). {
1282 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B,
1283 		mlr_dsl_ast_node_alloc_binary(".//", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1284 }
1285 
md_nonindexed_local_assignment(A)1286 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_LOGICAL_OR_EQUALS md_rhs(C). {
1287 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1288 		mlr_dsl_ast_node_alloc_binary("||", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1289 }
md_nonindexed_local_assignment(A)1290 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_LOGICAL_XOR_EQUALS md_rhs(C). {
1291 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1292 		mlr_dsl_ast_node_alloc_binary("^^", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1293 }
md_nonindexed_local_assignment(A)1294 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_LOGICAL_AND_EQUALS md_rhs(C). {
1295 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1296 		mlr_dsl_ast_node_alloc_binary("&&", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1297 }
md_nonindexed_local_assignment(A)1298 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_BITWISE_OR_EQUALS md_rhs(C). {
1299 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1300 		mlr_dsl_ast_node_alloc_binary("|", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1301 }
md_nonindexed_local_assignment(A)1302 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_BITWISE_XOR_EQUALS md_rhs(C). {
1303 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1304 		mlr_dsl_ast_node_alloc_binary("^", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1305 }
md_nonindexed_local_assignment(A)1306 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_BITWISE_AND_EQUALS md_rhs(C). {
1307 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1308 		mlr_dsl_ast_node_alloc_binary("&", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1309 }
md_nonindexed_local_assignment(A)1310 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_BITWISE_LSH_EQUALS md_rhs(C). {
1311 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1312 		mlr_dsl_ast_node_alloc_binary("<<", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1313 }
md_nonindexed_local_assignment(A)1314 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_BITWISE_RSH_EQUALS md_rhs(C). {
1315 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1316 		mlr_dsl_ast_node_alloc_binary(">>", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1317 }
1318 
md_nonindexed_local_assignment(A)1319 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_PLUS_EQUALS md_rhs(C). {
1320 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1321 		mlr_dsl_ast_node_alloc_binary("+", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1322 }
md_nonindexed_local_assignment(A)1323 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_MINUS_EQUALS md_rhs(C). {
1324 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1325 		mlr_dsl_ast_node_alloc_binary("-", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1326 }
md_nonindexed_local_assignment(A)1327 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_DOT_EQUALS md_rhs(C). {
1328 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1329 		mlr_dsl_ast_node_alloc_binary(".", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1330 }
md_nonindexed_local_assignment(A)1331 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_TIMES_EQUALS md_rhs(C). {
1332 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1333 		mlr_dsl_ast_node_alloc_binary("*", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1334 }
md_nonindexed_local_assignment(A)1335 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_DIVIDE_EQUALS md_rhs(C). {
1336 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1337 		mlr_dsl_ast_node_alloc_binary("/", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1338 }
md_nonindexed_local_assignment(A)1339 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_INT_DIVIDE_EQUALS md_rhs(C). {
1340 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1341 		mlr_dsl_ast_node_alloc_binary("//", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1342 }
md_nonindexed_local_assignment(A)1343 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_MOD_EQUALS md_rhs(C). {
1344 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1345 		mlr_dsl_ast_node_alloc_binary("%", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1346 }
md_nonindexed_local_assignment(A)1347 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_POW_EQUALS md_rhs(C). {
1348 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1349 		mlr_dsl_ast_node_alloc_binary("**", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1350 }
1351 
md_nonindexed_local_assignment(A)1352 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_OPLUS_EQUALS md_rhs(C). {
1353 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1354 		mlr_dsl_ast_node_alloc_binary(".+", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1355 }
md_nonindexed_local_assignment(A)1356 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_OMINUS_EQUALS md_rhs(C). {
1357 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1358 		mlr_dsl_ast_node_alloc_binary(".-", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1359 }
md_nonindexed_local_assignment(A)1360 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_OTIMES_EQUALS md_rhs(C). {
1361 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1362 		mlr_dsl_ast_node_alloc_binary(".*", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1363 }
md_nonindexed_local_assignment(A)1364 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_ODIVIDE_EQUALS md_rhs(C). {
1365 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1366 		mlr_dsl_ast_node_alloc_binary("./", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1367 }
md_nonindexed_local_assignment(A)1368 md_nonindexed_local_assignment(A)  ::= md_nonindexed_local_variable(B) MD_TOKEN_INT_ODIVIDE_EQUALS md_rhs(C). {
1369 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT, B,
1370 		mlr_dsl_ast_node_alloc_binary(".//", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1371 }
1372 
md_indexed_local_assignment(A)1373 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_LOGICAL_OR_EQUALS md_rhs(C). {
1374 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1375 		mlr_dsl_ast_node_alloc_binary("||", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1376 }
md_indexed_local_assignment(A)1377 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_LOGICAL_XOR_EQUALS md_rhs(C). {
1378 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1379 		mlr_dsl_ast_node_alloc_binary("^^", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1380 }
md_indexed_local_assignment(A)1381 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_LOGICAL_AND_EQUALS md_rhs(C). {
1382 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1383 		mlr_dsl_ast_node_alloc_binary("&&", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1384 }
md_indexed_local_assignment(A)1385 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_BITWISE_OR_EQUALS md_rhs(C). {
1386 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1387 		mlr_dsl_ast_node_alloc_binary("|", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1388 }
md_indexed_local_assignment(A)1389 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_BITWISE_XOR_EQUALS md_rhs(C). {
1390 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1391 		mlr_dsl_ast_node_alloc_binary("^", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1392 }
md_indexed_local_assignment(A)1393 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_BITWISE_AND_EQUALS md_rhs(C). {
1394 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1395 		mlr_dsl_ast_node_alloc_binary("&", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1396 }
md_indexed_local_assignment(A)1397 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_BITWISE_LSH_EQUALS md_rhs(C). {
1398 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1399 		mlr_dsl_ast_node_alloc_binary("<<", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1400 }
md_indexed_local_assignment(A)1401 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_BITWISE_RSH_EQUALS md_rhs(C). {
1402 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1403 		mlr_dsl_ast_node_alloc_binary(">>", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1404 }
1405 
md_indexed_local_assignment(A)1406 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_PLUS_EQUALS md_rhs(C). {
1407 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1408 		mlr_dsl_ast_node_alloc_binary("+", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1409 }
md_indexed_local_assignment(A)1410 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_MINUS_EQUALS md_rhs(C). {
1411 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1412 		mlr_dsl_ast_node_alloc_binary("-", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1413 }
md_indexed_local_assignment(A)1414 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_DOT_EQUALS md_rhs(C). {
1415 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1416 		mlr_dsl_ast_node_alloc_binary(".", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1417 }
md_indexed_local_assignment(A)1418 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_TIMES_EQUALS md_rhs(C). {
1419 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1420 		mlr_dsl_ast_node_alloc_binary("*", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1421 }
md_indexed_local_assignment(A)1422 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_DIVIDE_EQUALS md_rhs(C). {
1423 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1424 		mlr_dsl_ast_node_alloc_binary("/", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1425 }
md_indexed_local_assignment(A)1426 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_INT_DIVIDE_EQUALS md_rhs(C). {
1427 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1428 		mlr_dsl_ast_node_alloc_binary("//", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1429 }
md_indexed_local_assignment(A)1430 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_MOD_EQUALS md_rhs(C). {
1431 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1432 		mlr_dsl_ast_node_alloc_binary("%", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1433 }
md_indexed_local_assignment(A)1434 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_POW_EQUALS md_rhs(C). {
1435 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1436 		mlr_dsl_ast_node_alloc_binary("**", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1437 }
1438 
md_indexed_local_assignment(A)1439 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_OPLUS_EQUALS md_rhs(C). {
1440 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1441 		mlr_dsl_ast_node_alloc_binary(".+", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1442 }
md_indexed_local_assignment(A)1443 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_OMINUS_EQUALS md_rhs(C). {
1444 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1445 		mlr_dsl_ast_node_alloc_binary(".-", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1446 }
md_indexed_local_assignment(A)1447 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_OTIMES_EQUALS md_rhs(C). {
1448 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1449 		mlr_dsl_ast_node_alloc_binary(".*", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1450 }
md_indexed_local_assignment(A)1451 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_ODIVIDE_EQUALS md_rhs(C). {
1452 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1453 		mlr_dsl_ast_node_alloc_binary("./", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1454 }
md_indexed_local_assignment(A)1455 md_indexed_local_assignment(A)  ::= md_indexed_local_variable(B) MD_TOKEN_INT_ODIVIDE_EQUALS md_rhs(C). {
1456 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_INDEXED_LOCAL_ASSIGNMENT, B,
1457 		mlr_dsl_ast_node_alloc_binary(".//", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1458 }
1459 
1460 // ----------------------------------------------------------------
md_env_assignment(A)1461 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_LOGICAL_OR_EQUALS md_rhs(C). {
1462 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1463 		mlr_dsl_ast_node_alloc_binary("||", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1464 }
md_env_assignment(A)1465 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_LOGICAL_XOR_EQUALS md_rhs(C). {
1466 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1467 		mlr_dsl_ast_node_alloc_binary("^^", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1468 }
md_env_assignment(A)1469 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_LOGICAL_AND_EQUALS md_rhs(C). {
1470 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1471 		mlr_dsl_ast_node_alloc_binary("&&", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1472 }
md_env_assignment(A)1473 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_BITWISE_OR_EQUALS md_rhs(C). {
1474 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1475 		mlr_dsl_ast_node_alloc_binary("|", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1476 }
md_env_assignment(A)1477 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_BITWISE_XOR_EQUALS md_rhs(C). {
1478 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1479 		mlr_dsl_ast_node_alloc_binary("^", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1480 }
md_env_assignment(A)1481 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_BITWISE_AND_EQUALS md_rhs(C). {
1482 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1483 		mlr_dsl_ast_node_alloc_binary("&", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1484 }
md_env_assignment(A)1485 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_BITWISE_LSH_EQUALS md_rhs(C). {
1486 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1487 		mlr_dsl_ast_node_alloc_binary("<<", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1488 }
md_env_assignment(A)1489 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_BITWISE_RSH_EQUALS md_rhs(C). {
1490 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1491 		mlr_dsl_ast_node_alloc_binary(">>", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1492 }
md_env_assignment(A)1493 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_PLUS_EQUALS md_rhs(C). {
1494 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1495 		mlr_dsl_ast_node_alloc_binary("+", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1496 }
md_env_assignment(A)1497 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_MINUS_EQUALS md_rhs(C). {
1498 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1499 		mlr_dsl_ast_node_alloc_binary("-", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1500 }
md_env_assignment(A)1501 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_DOT_EQUALS md_rhs(C). {
1502 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1503 		mlr_dsl_ast_node_alloc_binary(".", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1504 }
1505 
md_env_assignment(A)1506 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_TIMES_EQUALS md_rhs(C). {
1507 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1508 		mlr_dsl_ast_node_alloc_binary("*", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1509 }
md_env_assignment(A)1510 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_DIVIDE_EQUALS md_rhs(C). {
1511 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1512 		mlr_dsl_ast_node_alloc_binary("/", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1513 }
md_env_assignment(A)1514 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_INT_DIVIDE_EQUALS md_rhs(C). {
1515 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1516 		mlr_dsl_ast_node_alloc_binary("//", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1517 }
md_env_assignment(A)1518 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_MOD_EQUALS md_rhs(C). {
1519 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1520 		mlr_dsl_ast_node_alloc_binary("%", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1521 }
md_env_assignment(A)1522 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_POW_EQUALS md_rhs(C). {
1523 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1524 		mlr_dsl_ast_node_alloc_binary("**", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1525 }
1526 
md_env_assignment(A)1527 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_OTIMES_EQUALS md_rhs(C). {
1528 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1529 		mlr_dsl_ast_node_alloc_binary(".*", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1530 }
md_env_assignment(A)1531 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_ODIVIDE_EQUALS md_rhs(C). {
1532 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1533 		mlr_dsl_ast_node_alloc_binary("./", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1534 }
md_env_assignment(A)1535 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_OINT_DIVIDE_EQUALS md_rhs(C). {
1536 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1537 		mlr_dsl_ast_node_alloc_binary(".//", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1538 }
md_env_assignment(A)1539 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_OMOD_EQUALS md_rhs(C). {
1540 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1541 		mlr_dsl_ast_node_alloc_binary(".%", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1542 }
md_env_assignment(A)1543 md_env_assignment(A)  ::= md_env_index(B) MD_TOKEN_OPOW_EQUALS md_rhs(C). {
1544 	A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
1545 		mlr_dsl_ast_node_alloc_binary(".**", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
1546 }
1547 
1548 // ----------------------------------------------------------------
md_unset(A)1549 md_unset(A) ::= MD_TOKEN_UNSET(O) MD_TOKEN_ALL(B). {
1550 	A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_UNSET, B);
1551 }
md_unset(A)1552 md_unset(A) ::= MD_TOKEN_UNSET(O) MD_TOKEN_FULL_OOSVAR(B). {
1553 	A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_UNSET, B);
1554 }
md_unset(A)1555 md_unset(A) ::= MD_TOKEN_UNSET(O) md_unset_args(B). {
1556 	A = mlr_dsl_ast_node_set_function_name(B, O->text);
1557 }
1558 // Need to invalidate "emit @a," -- use some non-empty-args expr.
md_unset_args(A)1559 md_unset_args(A) ::= . {
1560 	A = mlr_dsl_ast_node_alloc_zary("temp", MD_AST_NODE_TYPE_UNSET);
1561 }
1562 
md_unset_args(A)1563 md_unset_args(A) ::= md_field_name(B). {
1564 	A = mlr_dsl_ast_node_alloc_unary("temp", MD_AST_NODE_TYPE_UNSET, B);
1565 }
md_unset_args(A)1566 md_unset_args(A) ::= md_indirect_field_name(B). {
1567 	A = mlr_dsl_ast_node_alloc_unary("temp", MD_AST_NODE_TYPE_UNSET, B);
1568 }
md_unset_args(A)1569 md_unset_args(A) ::= md_positional_srec_name(B). {
1570 	A = mlr_dsl_ast_node_alloc_unary("temp", MD_AST_NODE_TYPE_UNSET, B);
1571 }
md_unset_args(A)1572 md_unset_args(A) ::= MD_TOKEN_FULL_SREC(B). {
1573 	A = mlr_dsl_ast_node_alloc_unary("temp", MD_AST_NODE_TYPE_UNSET, B);
1574 }
md_unset_args(A)1575 md_unset_args(A) ::= md_oosvar_keylist(B). {
1576 	A = mlr_dsl_ast_node_alloc_unary("temp", MD_AST_NODE_TYPE_UNSET, B);
1577 }
md_unset_args(A)1578 md_unset_args(A) ::= md_nonindexed_local_variable(B). {
1579 	A = mlr_dsl_ast_node_alloc_unary("temp", MD_AST_NODE_TYPE_UNSET, B);
1580 }
md_unset_args(A)1581 md_unset_args(A) ::= md_indexed_local_variable(B). {
1582 	A = mlr_dsl_ast_node_alloc_unary("temp", MD_AST_NODE_TYPE_UNSET, B);
1583 }
1584 
md_unset_args(A)1585 md_unset_args(A) ::= md_unset_args(B) MD_TOKEN_COMMA md_field_name(C). {
1586 	A = mlr_dsl_ast_node_append_arg(B, C);
1587 }
md_unset_args(A)1588 md_unset_args(A) ::= md_unset_args(B) MD_TOKEN_COMMA md_oosvar_keylist(C). {
1589 	A = mlr_dsl_ast_node_append_arg(B, C);
1590 }
1591 
1592 // ----------------------------------------------------------------
md_tee_write(A)1593 md_tee_write(A) ::= MD_TOKEN_TEE(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA MD_TOKEN_FULL_SREC(M). {
1594 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_TEE,
1595 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE, F),
1596 		M);
1597 }
1598 
md_tee_append(A)1599 md_tee_append(A) ::= MD_TOKEN_TEE(O) MD_TOKEN_BITWISE_RSH md_output_file(F) MD_TOKEN_COMMA MD_TOKEN_FULL_SREC(M). {
1600 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_TEE,
1601 		mlr_dsl_ast_node_alloc_unary(">>", MD_AST_NODE_TYPE_FILE_APPEND, F),
1602 		M);
1603 }
1604 
md_tee_pipe(A)1605 md_tee_pipe(A) ::= MD_TOKEN_TEE(O) MD_TOKEN_BITWISE_OR md_rhs(P) MD_TOKEN_COMMA MD_TOKEN_FULL_SREC(M). {
1606 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_TEE,
1607 		mlr_dsl_ast_node_alloc_unary("|", MD_AST_NODE_TYPE_PIPE, P),
1608 		M);
1609 }
1610 
1611 // ----------------------------------------------------------------
1612 // Given "emitf @a,@b,@c": since this is a bottom-up parser, we get first the "@a",
1613 // then "@a,@b", then "@a,@b,@c", then finally "emit @a,@b,@c". So:
1614 // * On the "@a" we make a sub-AST called "temp @a" (although we could call it "emit").
1615 // * On the "@b" we append the next argument to get "temp @a,@b".
1616 // * On the "@c" we append the next argument to get "temp @a,@b,@c".
1617 // * On the "emit" we change the name to get "emit @a,@b,@c".
1618 
md_emitf(A)1619 md_emitf(A) ::= MD_TOKEN_EMITF(O) md_emitf_args(B). {
1620 	B = mlr_dsl_ast_node_set_function_name(B, O->text);
1621 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITF, B,
1622 		mlr_dsl_ast_node_alloc_zary("stream", MD_AST_NODE_TYPE_STREAM));
1623 }
1624 // Need to invalidate "emit @a," -- use some non-empty-args expr.
md_emitf_args(A)1625 md_emitf_args(A) ::= . {
1626 	A = mlr_dsl_ast_node_alloc_zary("temp", MD_AST_NODE_TYPE_EMITF);
1627 }
md_emitf_args(A)1628 md_emitf_args(A) ::= md_oosvar_keylist(B). {
1629 	A = mlr_dsl_ast_node_alloc_unary("temp", MD_AST_NODE_TYPE_EMITF, B);
1630 }
md_emitf_args(A)1631 md_emitf_args(A) ::= md_nonindexed_local_variable(B). {
1632 	A = mlr_dsl_ast_node_alloc_unary("temp", MD_AST_NODE_TYPE_EMITF, B);
1633 }
md_emitf_args(A)1634 md_emitf_args(A) ::= md_indexed_local_variable(B). {
1635 	A = mlr_dsl_ast_node_alloc_unary("temp", MD_AST_NODE_TYPE_EMITF, B);
1636 }
md_emitf_args(A)1637 md_emitf_args(A) ::= md_emitf_args(B) MD_TOKEN_COMMA md_oosvar_keylist(C). {
1638 	A = mlr_dsl_ast_node_append_arg(B, C);
1639 }
md_emitf_args(A)1640 md_emitf_args(A) ::= md_emitf_args(B) MD_TOKEN_COMMA md_nonindexed_local_variable(C). {
1641 	A = mlr_dsl_ast_node_append_arg(B, C);
1642 }
md_emitf_args(A)1643 md_emitf_args(A) ::= md_emitf_args(B) MD_TOKEN_COMMA md_indexed_local_variable(C). {
1644 	A = mlr_dsl_ast_node_append_arg(B, C);
1645 }
1646 
md_emitf_write(A)1647 md_emitf_write(A) ::= MD_TOKEN_EMITF(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA md_emitf_args(B). {
1648 	B = mlr_dsl_ast_node_set_function_name(B, O->text);
1649 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITF, B,
1650 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE, F));
1651 }
1652 
md_emitf_append(A)1653 md_emitf_append(A) ::= MD_TOKEN_EMITF(O) MD_TOKEN_BITWISE_RSH md_output_file(F) MD_TOKEN_COMMA md_emitf_args(B). {
1654 	B = mlr_dsl_ast_node_set_function_name(B, O->text);
1655 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITF, B,
1656 		mlr_dsl_ast_node_alloc_unary(">>", MD_AST_NODE_TYPE_FILE_APPEND, F));
1657 }
1658 
md_emitf_pipe(A)1659 md_emitf_pipe(A) ::= MD_TOKEN_EMITF(O) MD_TOKEN_BITWISE_OR md_rhs(P) MD_TOKEN_COMMA md_emitf_args(B). {
1660 	B = mlr_dsl_ast_node_set_function_name(B, O->text);
1661 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITF, B,
1662 		mlr_dsl_ast_node_alloc_unary("|", MD_AST_NODE_TYPE_PIPE, P));
1663 }
1664 
1665 
1666 // ----------------------------------------------------------------
md_emitp(A)1667 md_emitp(A) ::= MD_TOKEN_EMITP(O) md_emittable(B). {
1668 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP,
1669 		mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMITP, B),
1670 		mlr_dsl_ast_node_alloc_zary("stream", MD_AST_NODE_TYPE_STREAM));
1671 }
1672 
md_emitp(A)1673 md_emitp(A) ::= MD_TOKEN_EMITP(O) md_emittable(B) MD_TOKEN_COMMA md_emitp_namelist(C). {
1674 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP,
1675 		mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, B, C),
1676 		mlr_dsl_ast_node_alloc_zary("stream", MD_AST_NODE_TYPE_STREAM));
1677 }
1678 
md_emitp_write(A)1679 md_emitp_write(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA
1680 	md_emittable(B).
1681 {
1682 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP,
1683 		mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMITP, B),
1684 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE,
1685 		F));
1686 }
md_emitp_write(A)1687 md_emitp_write(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA
1688 	md_emittable(B) MD_TOKEN_COMMA md_emitp_namelist(C).
1689 {
1690 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP,
1691 		mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, B, C),
1692 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE,
1693 		F));
1694 }
1695 
md_emitp_append(A)1696 md_emitp_append(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_BITWISE_RSH md_output_file(F) MD_TOKEN_COMMA
1697 	md_emittable(B).
1698 {
1699 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP,
1700 		mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMITP, B),
1701 		mlr_dsl_ast_node_alloc_unary(">>", MD_AST_NODE_TYPE_FILE_APPEND,
1702 		F));
1703 }
md_emitp_append(A)1704 md_emitp_append(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_BITWISE_RSH md_output_file(F) MD_TOKEN_COMMA
1705 	md_emittable(B) MD_TOKEN_COMMA md_emitp_namelist(C).
1706 {
1707 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP,
1708 		mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, B, C),
1709 		mlr_dsl_ast_node_alloc_unary(">>", MD_AST_NODE_TYPE_FILE_APPEND,
1710 		F));
1711 }
1712 
md_emitp_pipe(A)1713 md_emitp_pipe(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_BITWISE_OR md_rhs(P) MD_TOKEN_COMMA
1714 	md_emittable(B).
1715 {
1716 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP,
1717 		mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMITP, B),
1718 		mlr_dsl_ast_node_alloc_unary("|", MD_AST_NODE_TYPE_PIPE,
1719 		P));
1720 }
md_emitp_pipe(A)1721 md_emitp_pipe(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_BITWISE_OR md_rhs(P) MD_TOKEN_COMMA
1722 	md_emittable(B) MD_TOKEN_COMMA md_emitp_namelist(C).
1723 {
1724 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP,
1725 		mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, B, C),
1726 		mlr_dsl_ast_node_alloc_unary("|", MD_AST_NODE_TYPE_PIPE,
1727 		P));
1728 }
1729 
1730 // ----------------------------------------------------------------
md_emitp_namelist(A)1731 md_emitp_namelist(A) ::= md_rhs(B). {
1732 	A = mlr_dsl_ast_node_alloc_unary("emitp_namelist", MD_AST_NODE_TYPE_EMITP, B);
1733 }
md_emitp_namelist(A)1734 md_emitp_namelist(A) ::= md_emitp_namelist(B) MD_TOKEN_COMMA md_rhs(C). {
1735 	A = mlr_dsl_ast_node_append_arg(B, C);
1736 }
1737 
1738 // ================================================================
md_emit(A)1739 md_emit(A) ::= MD_TOKEN_EMIT(O) md_emittable(B). {
1740 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT,
1741 		mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT, B),
1742 		mlr_dsl_ast_node_alloc_zary("stream", MD_AST_NODE_TYPE_STREAM));
1743 }
1744 
md_emit(A)1745 md_emit(A) ::= MD_TOKEN_EMIT(O) md_emittable(B) MD_TOKEN_COMMA md_emit_namelist(C). {
1746 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT,
1747 		mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, B, C),
1748 		mlr_dsl_ast_node_alloc_zary("stream", MD_AST_NODE_TYPE_STREAM));
1749 }
1750 
1751 
md_emit_write(A)1752 md_emit_write(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA
1753 	md_emittable(B).
1754 {
1755 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT,
1756 		mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT, B),
1757 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE,
1758 		F));
1759 }
md_emit_write(A)1760 md_emit_write(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA
1761 	md_emittable(B) MD_TOKEN_COMMA md_emit_namelist(C).
1762 {
1763 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT,
1764 		mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, B, C),
1765 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE,
1766 		F));
1767 }
1768 
md_emit_append(A)1769 md_emit_append(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_BITWISE_RSH md_output_file(F) MD_TOKEN_COMMA
1770 	md_emittable(B).
1771 {
1772 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT,
1773 		mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT, B),
1774 		mlr_dsl_ast_node_alloc_unary(">>", MD_AST_NODE_TYPE_FILE_APPEND,
1775 		F));
1776 }
md_emit_append(A)1777 md_emit_append(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_BITWISE_RSH md_output_file(F) MD_TOKEN_COMMA
1778 	md_emittable(B) MD_TOKEN_COMMA md_emit_namelist(C).
1779 {
1780 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT,
1781 		mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, B, C),
1782 		mlr_dsl_ast_node_alloc_unary(">>", MD_AST_NODE_TYPE_FILE_APPEND,
1783 		F));
1784 }
1785 
md_emit_pipe(A)1786 md_emit_pipe(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_BITWISE_OR md_rhs(P) MD_TOKEN_COMMA
1787 	md_emittable(B).
1788 {
1789 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT,
1790 		mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT, B),
1791 		mlr_dsl_ast_node_alloc_unary("|", MD_AST_NODE_TYPE_PIPE,
1792 		P));
1793 }
md_emit_pipe(A)1794 md_emit_pipe(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_BITWISE_OR md_rhs(P) MD_TOKEN_COMMA
1795 	md_emittable(B) MD_TOKEN_COMMA md_emit_namelist(C).
1796 {
1797 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT,
1798 		mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, B, C),
1799 		mlr_dsl_ast_node_alloc_unary("|", MD_AST_NODE_TYPE_PIPE,
1800 		P));
1801 }
1802 
1803 // ----------------------------------------------------------------
md_emittable(A)1804 md_emittable(A) ::= MD_TOKEN_ALL(B). {
1805 	A = B;
1806 }
md_emittable(A)1807 md_emittable(A) ::= MD_TOKEN_FULL_OOSVAR(B). {
1808 	A = B;
1809 }
md_emittable(A)1810 md_emittable(A) ::= md_oosvar_keylist(B). {
1811 	A = B;
1812 }
md_emittable(A)1813 md_emittable(A) ::= md_nonindexed_local_variable(B). {
1814 	A = B;
1815 }
md_emittable(A)1816 md_emittable(A) ::= md_indexed_local_variable(B). {
1817 	A = B;
1818 }
md_emittable(A)1819 md_emittable(A) ::= MD_TOKEN_FULL_SREC(B). {
1820 	A = B;
1821 }
md_emittable(A)1822 md_emittable(A) ::= md_map_literal(B). {
1823 	A = B;
1824 }
md_emittable(A)1825 md_emittable(A) ::= md_fcn_or_subr_call(B). {
1826 	A = B;
1827 }
1828 
1829 // ----------------------------------------------------------------
md_emit_namelist(A)1830 md_emit_namelist(A) ::= md_rhs(B). {
1831 	A = mlr_dsl_ast_node_alloc_unary("emit_namelist", MD_AST_NODE_TYPE_EMIT, B);
1832 }
md_emit_namelist(A)1833 md_emit_namelist(A) ::= md_emit_namelist(B) MD_TOKEN_COMMA md_rhs(C). {
1834 	A = mlr_dsl_ast_node_append_arg(B, C);
1835 }
1836 
1837 // ----------------------------------------------------------------
md_emitp_lashed(A)1838 md_emitp_lashed(A) ::= MD_TOKEN_EMITP(O)
1839 	MD_TOKEN_LPAREN md_emitp_lashed_keylists(B) MD_TOKEN_RPAREN.
1840 {
1841 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP_LASHED,
1842 		mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMITP_LASHED, B),
1843 		mlr_dsl_ast_node_alloc_zary("stream", MD_AST_NODE_TYPE_STREAM));
1844 }
md_emitp_lashed(A)1845 md_emitp_lashed(A) ::= MD_TOKEN_EMITP(O)
1846 	MD_TOKEN_LPAREN md_emitp_lashed_keylists(B) MD_TOKEN_RPAREN
1847 	MD_TOKEN_COMMA md_emitp_lashed_namelist(C).
1848 {
1849 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP_LASHED,
1850 		mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP_LASHED, B, C),
1851 		mlr_dsl_ast_node_alloc_zary("stream", MD_AST_NODE_TYPE_STREAM));
1852 }
1853 
md_emitp_lashed_write(A)1854 md_emitp_lashed_write(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA
1855 	MD_TOKEN_LPAREN md_emitp_lashed_keylists(B) MD_TOKEN_RPAREN.
1856 {
1857 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP_LASHED,
1858 		mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMITP_LASHED, B),
1859 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE, F));
1860 }
md_emitp_lashed_write(A)1861 md_emitp_lashed_write(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA
1862 	MD_TOKEN_LPAREN md_emitp_lashed_keylists(B) MD_TOKEN_RPAREN
1863 	MD_TOKEN_COMMA md_emitp_lashed_namelist(C).
1864 {
1865 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP_LASHED,
1866 		mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP_LASHED, B, C),
1867 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE, F));
1868 }
1869 
md_emitp_lashed_append(A)1870 md_emitp_lashed_append(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_BITWISE_RSH md_output_file(F) MD_TOKEN_COMMA
1871 	MD_TOKEN_LPAREN md_emitp_lashed_keylists(B) MD_TOKEN_RPAREN.
1872 {
1873 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP_LASHED,
1874 		mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMITP_LASHED, B),
1875 		mlr_dsl_ast_node_alloc_unary(">>", MD_AST_NODE_TYPE_FILE_APPEND, F));
1876 }
md_emitp_lashed_append(A)1877 md_emitp_lashed_append(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_BITWISE_RSH md_output_file(F) MD_TOKEN_COMMA
1878 	MD_TOKEN_LPAREN md_emitp_lashed_keylists(B) MD_TOKEN_RPAREN
1879 	MD_TOKEN_COMMA md_emitp_lashed_namelist(C).
1880 {
1881 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP_LASHED,
1882 		mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP_LASHED, B, C),
1883 		mlr_dsl_ast_node_alloc_unary(">>", MD_AST_NODE_TYPE_FILE_APPEND, F));
1884 }
1885 
md_emitp_lashed_pipe(A)1886 md_emitp_lashed_pipe(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_BITWISE_OR md_rhs(P) MD_TOKEN_COMMA
1887 	MD_TOKEN_LPAREN md_emitp_lashed_keylists(B) MD_TOKEN_RPAREN.
1888 {
1889 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP_LASHED,
1890 		mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMITP_LASHED, B),
1891 		mlr_dsl_ast_node_alloc_unary("|", MD_AST_NODE_TYPE_PIPE, P));
1892 }
md_emitp_lashed_pipe(A)1893 md_emitp_lashed_pipe(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_BITWISE_OR md_rhs(P) MD_TOKEN_COMMA
1894 	MD_TOKEN_LPAREN md_emitp_lashed_keylists(B) MD_TOKEN_RPAREN
1895 	MD_TOKEN_COMMA md_emitp_lashed_namelist(C).
1896 {
1897 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP_LASHED,
1898 		mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP_LASHED, B, C),
1899 		mlr_dsl_ast_node_alloc_unary("|", MD_AST_NODE_TYPE_PIPE, P));
1900 }
1901 
1902 //  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
md_emitp_lashed_keylists(A)1903 md_emitp_lashed_keylists(A) ::= md_emittable(B). {
1904 	A = mlr_dsl_ast_node_alloc_unary("lashed_keylists", MD_AST_NODE_TYPE_EMITP_LASHED, B);
1905 }
md_emitp_lashed_keylists(A)1906 md_emitp_lashed_keylists(A) ::= md_emitp_lashed_keylists(B) MD_TOKEN_COMMA md_emittable(C). {
1907 	A = mlr_dsl_ast_node_append_arg(B, C);
1908 }
1909 
1910 //  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
md_emitp_lashed_namelist(A)1911 md_emitp_lashed_namelist(A) ::= md_rhs(B). {
1912 	A = mlr_dsl_ast_node_alloc_unary("lashed_namelist", MD_AST_NODE_TYPE_EMITP_LASHED, B);
1913 }
md_emitp_lashed_namelist(A)1914 md_emitp_lashed_namelist(A) ::= md_emitp_lashed_namelist(B) MD_TOKEN_COMMA md_rhs(C). {
1915 	A = mlr_dsl_ast_node_append_arg(B, C);
1916 }
1917 
1918 // ----------------------------------------------------------------
md_emit_lashed(A)1919 md_emit_lashed(A) ::= MD_TOKEN_EMIT(O)
1920 	MD_TOKEN_LPAREN md_emit_lashed_keylists(B) MD_TOKEN_RPAREN.
1921 {
1922 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_LASHED,
1923 		mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT_LASHED, B),
1924 		mlr_dsl_ast_node_alloc_zary("stream", MD_AST_NODE_TYPE_STREAM));
1925 }
md_emit_lashed(A)1926 md_emit_lashed(A) ::= MD_TOKEN_EMIT(O)
1927 	MD_TOKEN_LPAREN md_emit_lashed_keylists(B) MD_TOKEN_RPAREN
1928 	MD_TOKEN_COMMA md_emit_lashed_namelist(C).
1929 {
1930 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_LASHED,
1931 		mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_LASHED, B, C),
1932 		mlr_dsl_ast_node_alloc_zary("stream", MD_AST_NODE_TYPE_STREAM));
1933 }
1934 
md_emit_lashed_write(A)1935 md_emit_lashed_write(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA
1936 	MD_TOKEN_LPAREN md_emit_lashed_keylists(B) MD_TOKEN_RPAREN.
1937 {
1938 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_LASHED,
1939 		mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT_LASHED, B),
1940 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE, F));
1941 }
md_emit_lashed_write(A)1942 md_emit_lashed_write(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA
1943 	MD_TOKEN_LPAREN md_emit_lashed_keylists(B) MD_TOKEN_RPAREN
1944 	MD_TOKEN_COMMA md_emit_lashed_namelist(C).
1945 {
1946 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_LASHED,
1947 		mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_LASHED, B, C),
1948 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE, F));
1949 }
1950 
md_emit_lashed_append(A)1951 md_emit_lashed_append(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_BITWISE_RSH md_output_file(F) MD_TOKEN_COMMA
1952 	MD_TOKEN_LPAREN md_emit_lashed_keylists(B) MD_TOKEN_RPAREN.
1953 {
1954 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_LASHED,
1955 		mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT_LASHED, B),
1956 		mlr_dsl_ast_node_alloc_unary(">>", MD_AST_NODE_TYPE_FILE_APPEND, F));
1957 }
md_emit_lashed_append(A)1958 md_emit_lashed_append(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_BITWISE_RSH md_output_file(F) MD_TOKEN_COMMA
1959 	MD_TOKEN_LPAREN md_emit_lashed_keylists(B) MD_TOKEN_RPAREN
1960 	MD_TOKEN_COMMA md_emit_lashed_namelist(C).
1961 {
1962 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_LASHED,
1963 		mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_LASHED, B, C),
1964 		mlr_dsl_ast_node_alloc_unary(">>", MD_AST_NODE_TYPE_FILE_APPEND, F));
1965 }
1966 
md_emit_lashed_pipe(A)1967 md_emit_lashed_pipe(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_BITWISE_OR md_rhs(P) MD_TOKEN_COMMA
1968 	MD_TOKEN_LPAREN md_emit_lashed_keylists(B) MD_TOKEN_RPAREN.
1969 {
1970 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_LASHED,
1971 		mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT_LASHED, B),
1972 		mlr_dsl_ast_node_alloc_unary("|", MD_AST_NODE_TYPE_PIPE, P));
1973 }
md_emit_lashed_pipe(A)1974 md_emit_lashed_pipe(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_BITWISE_OR md_rhs(P) MD_TOKEN_COMMA
1975 	MD_TOKEN_LPAREN md_emit_lashed_keylists(B) MD_TOKEN_RPAREN
1976 	MD_TOKEN_COMMA md_emit_lashed_namelist(C).
1977 {
1978 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_LASHED,
1979 		mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_LASHED, B, C),
1980 		mlr_dsl_ast_node_alloc_unary("|", MD_AST_NODE_TYPE_PIPE, P));
1981 }
1982 
1983 //  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
md_emit_lashed_keylists(A)1984 md_emit_lashed_keylists(A) ::= md_emittable(B). {
1985 	A = mlr_dsl_ast_node_alloc_unary("lashed_keylists", MD_AST_NODE_TYPE_EMIT_LASHED, B);
1986 }
md_emit_lashed_keylists(A)1987 md_emit_lashed_keylists(A) ::= md_emit_lashed_keylists(B) MD_TOKEN_COMMA md_emittable(C). {
1988 	A = mlr_dsl_ast_node_append_arg(B, C);
1989 }
1990 
1991 //  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
md_emit_lashed_namelist(A)1992 md_emit_lashed_namelist(A) ::= md_rhs(B). {
1993 	A = mlr_dsl_ast_node_alloc_unary("lashed_namelist", MD_AST_NODE_TYPE_EMIT_LASHED, B);
1994 }
md_emit_lashed_namelist(A)1995 md_emit_lashed_namelist(A) ::= md_emit_lashed_namelist(B) MD_TOKEN_COMMA md_rhs(C). {
1996 	A = mlr_dsl_ast_node_append_arg(B, C);
1997 }
1998 
1999 // ----------------------------------------------------------------
md_dump(A)2000 md_dump(A) ::= MD_TOKEN_DUMP(O). {
2001 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_DUMP,
2002 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE,
2003 			mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDOUT)),
2004 		mlr_dsl_ast_node_alloc("all", MD_AST_NODE_TYPE_FULL_OOSVAR));
2005 }
md_edump(A)2006 md_edump(A) ::= MD_TOKEN_EDUMP(O). {
2007 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_DUMP,
2008 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE,
2009 			mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDERR)),
2010 		mlr_dsl_ast_node_alloc("all", MD_AST_NODE_TYPE_FULL_OOSVAR));
2011 }
md_dump_write(A)2012 md_dump_write(A) ::= MD_TOKEN_DUMP(O) MD_TOKEN_GT md_output_file(F). {
2013 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_DUMP,
2014 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE,
2015 			F),
2016 		mlr_dsl_ast_node_alloc("all", MD_AST_NODE_TYPE_FULL_OOSVAR));
2017 }
md_dump_append(A)2018 md_dump_append(A) ::= MD_TOKEN_DUMP(O) MD_TOKEN_BITWISE_RSH md_output_file(F). {
2019 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_DUMP,
2020 		mlr_dsl_ast_node_alloc_unary(">>", MD_AST_NODE_TYPE_FILE_APPEND,
2021 			F),
2022 		mlr_dsl_ast_node_alloc("all", MD_AST_NODE_TYPE_FULL_OOSVAR));
2023 }
md_dump_pipe(A)2024 md_dump_pipe(A) ::= MD_TOKEN_DUMP(O) MD_TOKEN_BITWISE_OR md_rhs(P). {
2025 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_DUMP,
2026 		mlr_dsl_ast_node_alloc_unary("|", MD_AST_NODE_TYPE_PIPE,
2027 			P),
2028 		mlr_dsl_ast_node_alloc("all", MD_AST_NODE_TYPE_FULL_OOSVAR));
2029 }
2030 
md_dump(A)2031 md_dump(A) ::= MD_TOKEN_DUMP(O) md_dumpable(B). {
2032 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_DUMP,
2033 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE,
2034 			mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDOUT)),
2035 		B);
2036 }
md_edump(A)2037 md_edump(A) ::= MD_TOKEN_EDUMP(O) md_dumpable(B). {
2038 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_DUMP,
2039 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE,
2040 			mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDERR)),
2041 		B);
2042 }
md_dump_write(A)2043 md_dump_write(A) ::= MD_TOKEN_DUMP(O) MD_TOKEN_GT md_output_file(F) md_dumpable(B). {
2044 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_DUMP,
2045 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE,
2046 			F),
2047 		B);
2048 }
md_dump_append(A)2049 md_dump_append(A) ::= MD_TOKEN_DUMP(O) MD_TOKEN_BITWISE_RSH md_output_file(F) md_dumpable(B). {
2050 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_DUMP,
2051 		mlr_dsl_ast_node_alloc_unary(">>", MD_AST_NODE_TYPE_FILE_APPEND,
2052 			F),
2053 		B);
2054 }
md_dump_pipe(A)2055 md_dump_pipe(A) ::= MD_TOKEN_DUMP(O) MD_TOKEN_BITWISE_OR md_dumpable(P) md_rhs(B). {
2056 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_DUMP,
2057 		mlr_dsl_ast_node_alloc_unary("|", MD_AST_NODE_TYPE_PIPE,
2058 			P),
2059 		B);
2060 }
2061 
2062 // ----------------------------------------------------------------
md_dumpable(A)2063 md_dumpable(A) ::= MD_TOKEN_ALL(B). {
2064 	A = B;
2065 }
md_dumpable(A)2066 md_dumpable(A) ::= MD_TOKEN_FULL_OOSVAR(B). {
2067 	A = B;
2068 }
md_dumpable(A)2069 md_dumpable(A) ::= MD_TOKEN_FULL_SREC(B). {
2070 	A = B;
2071 }
md_dumpable(A)2072 md_dumpable(A) ::= md_map_literal(B). {
2073 	A = B;
2074 }
md_dumpable(A)2075 md_dumpable(A) ::= md_rhs(B). {
2076 	A = B;
2077 }
2078 
2079 // ----------------------------------------------------------------
2080 // Print string
md_print(A)2081 md_print(A) ::= MD_TOKEN_PRINT(O) md_dumpable(B). {
2082 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINT, B,
2083 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE,
2084 			mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDOUT)));
2085 }
md_eprint(A)2086 md_eprint(A) ::= MD_TOKEN_EPRINT(O) md_dumpable(B). {
2087 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINT, B,
2088 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE,
2089 			mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDERR)));
2090 }
md_print_write(A)2091 md_print_write(A) ::= MD_TOKEN_PRINT(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA md_dumpable(C). {
2092 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINT, C,
2093 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE,
2094 			F));
2095 }
md_print_append(A)2096 md_print_append(A) ::= MD_TOKEN_PRINT(O) MD_TOKEN_BITWISE_RSH md_output_file(F) MD_TOKEN_COMMA md_dumpable(C). {
2097 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINT, C,
2098 		mlr_dsl_ast_node_alloc_unary(">>", MD_AST_NODE_TYPE_FILE_APPEND,
2099 			F));
2100 }
md_print_pipe(A)2101 md_print_pipe(A) ::= MD_TOKEN_PRINT(O) MD_TOKEN_BITWISE_OR md_rhs(P) MD_TOKEN_COMMA md_dumpable(C). {
2102 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINT, C,
2103 		mlr_dsl_ast_node_alloc_unary("|", MD_AST_NODE_TYPE_PIPE,
2104 			P));
2105 }
2106 
2107 // Print with no string (newline only)
md_print(A)2108 md_print(A) ::= MD_TOKEN_PRINT(O). {
2109 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINT,
2110 		mlr_dsl_ast_node_alloc("", MD_AST_NODE_TYPE_NUMERIC_LITERAL),
2111 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE,
2112 			mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDOUT)));
2113 }
md_eprint(A)2114 md_eprint(A) ::= MD_TOKEN_EPRINT(O). {
2115 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINT,
2116 		mlr_dsl_ast_node_alloc("", MD_AST_NODE_TYPE_NUMERIC_LITERAL),
2117 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE,
2118 			mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDERR)));
2119 }
md_print_write(A)2120 md_print_write(A) ::= MD_TOKEN_PRINT(O) MD_TOKEN_GT md_output_file(F). {
2121 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINT,
2122 		mlr_dsl_ast_node_alloc("", MD_AST_NODE_TYPE_NUMERIC_LITERAL),
2123 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE, F));
2124 }
md_print_append(A)2125 md_print_append(A) ::= MD_TOKEN_PRINT(O) MD_TOKEN_BITWISE_RSH md_output_file(F). {
2126 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINT,
2127 		mlr_dsl_ast_node_alloc("", MD_AST_NODE_TYPE_NUMERIC_LITERAL),
2128 		mlr_dsl_ast_node_alloc_unary(">>", MD_AST_NODE_TYPE_FILE_APPEND, F));
2129 }
md_print_pipe(A)2130 md_print_pipe(A) ::= MD_TOKEN_PRINT(O) MD_TOKEN_BITWISE_OR md_rhs(P). {
2131 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINT,
2132 		mlr_dsl_ast_node_alloc("", MD_AST_NODE_TYPE_NUMERIC_LITERAL),
2133 		mlr_dsl_ast_node_alloc_unary("|", MD_AST_NODE_TYPE_PIPE, P));
2134 }
2135 
2136 // Printn string
md_printn(A)2137 md_printn(A) ::= MD_TOKEN_PRINTN(O) md_dumpable(B). {
2138 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINTN, B,
2139 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE,
2140 			mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDOUT)));
2141 }
md_eprintn(A)2142 md_eprintn(A) ::= MD_TOKEN_EPRINTN(O) md_dumpable(B). {
2143 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINTN, B,
2144 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE,
2145 			mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDERR)));
2146 }
md_printn_write(A)2147 md_printn_write(A) ::= MD_TOKEN_PRINTN(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA md_dumpable(C). {
2148 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINTN, C,
2149 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE,
2150 			F));
2151 }
md_printn_append(A)2152 md_printn_append(A) ::= MD_TOKEN_PRINTN(O) MD_TOKEN_BITWISE_RSH md_output_file(F) MD_TOKEN_COMMA md_dumpable(C). {
2153 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINTN, C,
2154 		mlr_dsl_ast_node_alloc_unary(">>", MD_AST_NODE_TYPE_FILE_APPEND,
2155 			F));
2156 }
md_printn_pipe(A)2157 md_printn_pipe(A) ::= MD_TOKEN_PRINTN(O) MD_TOKEN_BITWISE_OR md_rhs(P) MD_TOKEN_COMMA md_dumpable(C). {
2158 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINTN, C,
2159 		mlr_dsl_ast_node_alloc_unary("|", MD_AST_NODE_TYPE_PIPE,
2160 			P));
2161 }
2162 
2163 // Printn with no string: produces no output but will create a zero-length
2164 // output file, so not quite a no-op.
md_printn(A)2165 md_printn(A) ::= MD_TOKEN_PRINTN(O). {
2166 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINTN,
2167 		mlr_dsl_ast_node_alloc("", MD_AST_NODE_TYPE_NUMERIC_LITERAL),
2168 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE,
2169 			mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDOUT)));
2170 }
md_eprintn(A)2171 md_eprintn(A) ::= MD_TOKEN_EPRINTN(O). {
2172 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINTN,
2173 		mlr_dsl_ast_node_alloc("", MD_AST_NODE_TYPE_NUMERIC_LITERAL),
2174 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE,
2175 			mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDERR)));
2176 }
md_printn_write(A)2177 md_printn_write(A) ::= MD_TOKEN_PRINTN(O) MD_TOKEN_GT md_output_file(F). {
2178 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINTN,
2179 		mlr_dsl_ast_node_alloc("", MD_AST_NODE_TYPE_NUMERIC_LITERAL),
2180 		mlr_dsl_ast_node_alloc_unary(">", MD_AST_NODE_TYPE_FILE_WRITE, F));
2181 }
md_printn_append(A)2182 md_printn_append(A) ::= MD_TOKEN_PRINTN(O) MD_TOKEN_BITWISE_RSH md_output_file(F). {
2183 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINTN,
2184 		mlr_dsl_ast_node_alloc("", MD_AST_NODE_TYPE_NUMERIC_LITERAL),
2185 		mlr_dsl_ast_node_alloc_unary(">>", MD_AST_NODE_TYPE_FILE_APPEND, F));
2186 }
md_printn_pipe(A)2187 md_printn_pipe(A) ::= MD_TOKEN_PRINTN(O) MD_TOKEN_BITWISE_OR md_dumpable(P). {
2188 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINTN,
2189 		mlr_dsl_ast_node_alloc("", MD_AST_NODE_TYPE_NUMERIC_LITERAL),
2190 		mlr_dsl_ast_node_alloc_unary("|", MD_AST_NODE_TYPE_PIPE, P));
2191 }
2192 
2193 // ----------------------------------------------------------------
md_output_file(A)2194 md_output_file(A) ::= md_rhs(F).          { A = F; }
md_output_file(A)2195 md_output_file(A) ::= MD_TOKEN_STDOUT(F). { A = F; }
md_output_file(A)2196 md_output_file(A) ::= MD_TOKEN_STDERR(F). { A = F; }
2197 
2198 // ================================================================
2199 // Begin RHS precedence chain
2200 
md_rhs(A)2201 md_rhs(A) ::= md_ternary(B). {
2202 	A = B;
2203 }
2204 
md_ternary(A)2205 md_ternary(A) ::= md_logical_or_term(B) MD_TOKEN_QUESTION_MARK md_ternary(C) MD_TOKEN_COLON md_ternary(D). {
2206 	A = mlr_dsl_ast_node_alloc_ternary("? :", MD_AST_NODE_TYPE_OPERATOR, B, C, D);
2207 }
2208 
md_ternary(A)2209 md_ternary(A) ::= md_logical_or_term(B). {
2210 	A = B;
2211 }
2212 
2213 // ================================================================
md_logical_or_term(A)2214 md_logical_or_term(A) ::= md_logical_xor_term(B). {
2215 	A = B;
2216 }
md_logical_or_term(A)2217 md_logical_or_term(A) ::= md_logical_or_term(B) MD_TOKEN_LOGICAL_OR(O) md_logical_xor_term(C). {
2218 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2219 }
2220 
2221 // ----------------------------------------------------------------
md_logical_xor_term(A)2222 md_logical_xor_term(A) ::= md_logical_and_term(B). {
2223 	A = B;
2224 }
md_logical_xor_term(A)2225 md_logical_xor_term(A) ::= md_logical_xor_term(B) MD_TOKEN_LOGICAL_XOR(O) md_logical_and_term(C). {
2226 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2227 }
2228 
2229 // ----------------------------------------------------------------
md_logical_and_term(A)2230 md_logical_and_term(A) ::= md_eqne_term(B). {
2231 	A = B;
2232 }
md_logical_and_term(A)2233 md_logical_and_term(A) ::= md_logical_and_term(B) MD_TOKEN_LOGICAL_AND(O) md_eqne_term(C). {
2234 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2235 }
2236 
2237 // ----------------------------------------------------------------
md_eqne_term(A)2238 md_eqne_term(A) ::= md_cmp_term(B). {
2239 	A = B;
2240 }
md_eqne_term(A)2241 md_eqne_term(A) ::= md_eqne_term(B) MD_TOKEN_MATCHES(O) md_cmp_term(C). {
2242 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2243 }
md_eqne_term(A)2244 md_eqne_term(A) ::= md_eqne_term(B) MD_TOKEN_DOES_NOT_MATCH(O) md_cmp_term(C). {
2245 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2246 }
md_eqne_term(A)2247 md_eqne_term(A) ::= md_eqne_term(B) MD_TOKEN_EQ(O) md_cmp_term(C). {
2248 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2249 }
md_eqne_term(A)2250 md_eqne_term(A) ::= md_eqne_term(B) MD_TOKEN_NE(O) md_cmp_term(C). {
2251 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2252 }
2253 
2254 // ----------------------------------------------------------------
md_cmp_term(A)2255 md_cmp_term(A) ::= md_bitwise_or_term(B). {
2256 	A = B;
2257 }
md_cmp_term(A)2258 md_cmp_term(A) ::= md_cmp_term(B) MD_TOKEN_GT(O) md_bitwise_or_term(C). {
2259 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2260 }
md_cmp_term(A)2261 md_cmp_term(A) ::= md_cmp_term(B) MD_TOKEN_GE(O) md_bitwise_or_term(C). {
2262 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2263 }
md_cmp_term(A)2264 md_cmp_term(A) ::= md_cmp_term(B) MD_TOKEN_LT(O) md_bitwise_or_term(C). {
2265 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2266 }
md_cmp_term(A)2267 md_cmp_term(A) ::= md_cmp_term(B) MD_TOKEN_LE(O) md_bitwise_or_term(C). {
2268 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2269 }
2270 
2271 // ----------------------------------------------------------------
md_bitwise_or_term(A)2272 md_bitwise_or_term(A) ::= md_bitwise_xor_term(B). {
2273 	A = B;
2274 }
md_bitwise_or_term(A)2275 md_bitwise_or_term(A) ::= md_bitwise_or_term(B) MD_TOKEN_BITWISE_OR(O) md_bitwise_xor_term(C). {
2276 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2277 }
2278 
2279 // ----------------------------------------------------------------
md_bitwise_xor_term(A)2280 md_bitwise_xor_term(A) ::= md_bitwise_and_term(B). {
2281 	A = B;
2282 }
md_bitwise_xor_term(A)2283 md_bitwise_xor_term(A) ::= md_bitwise_xor_term(B) MD_TOKEN_BITWISE_XOR(O) md_bitwise_and_term(C). {
2284 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2285 }
2286 
2287 // ----------------------------------------------------------------
md_bitwise_and_term(A)2288 md_bitwise_and_term(A) ::= md_bitwise_shift_term(B). {
2289 	A = B;
2290 }
md_bitwise_and_term(A)2291 md_bitwise_and_term(A) ::= md_bitwise_and_term(B) MD_TOKEN_BITWISE_AND(O) md_bitwise_shift_term(C). {
2292 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2293 }
2294 
2295 // ----------------------------------------------------------------
md_bitwise_shift_term(A)2296 md_bitwise_shift_term(A) ::= md_addsubdot_term(B). {
2297 	A = B;
2298 }
md_bitwise_shift_term(A)2299 md_bitwise_shift_term(A) ::= md_bitwise_shift_term(B) MD_TOKEN_BITWISE_LSH(O) md_addsubdot_term(C). {
2300 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2301 }
md_bitwise_shift_term(A)2302 md_bitwise_shift_term(A) ::= md_bitwise_shift_term(B) MD_TOKEN_BITWISE_RSH(O) md_addsubdot_term(C). {
2303 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2304 }
2305 
2306 // ----------------------------------------------------------------
md_addsubdot_term(A)2307 md_addsubdot_term(A) ::= md_muldiv_term(B). {
2308 	A = B;
2309 }
md_addsubdot_term(A)2310 md_addsubdot_term(A) ::= md_addsubdot_term(B) MD_TOKEN_PLUS(O) md_muldiv_term(C). {
2311 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2312 }
md_addsubdot_term(A)2313 md_addsubdot_term(A) ::= md_addsubdot_term(B) MD_TOKEN_MINUS(O) md_muldiv_term(C). {
2314 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2315 }
md_addsubdot_term(A)2316 md_addsubdot_term(A) ::= md_addsubdot_term(B) MD_TOKEN_OPLUS(O) md_muldiv_term(C). {
2317 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2318 }
md_addsubdot_term(A)2319 md_addsubdot_term(A) ::= md_addsubdot_term(B) MD_TOKEN_OMINUS(O) md_muldiv_term(C). {
2320 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2321 }
md_addsubdot_term(A)2322 md_addsubdot_term(A) ::= md_addsubdot_term(B) MD_TOKEN_DOT(O) md_muldiv_term(C). {
2323 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2324 }
2325 
2326 // ----------------------------------------------------------------
md_muldiv_term(A)2327 md_muldiv_term(A) ::= md_unary_bitwise_op_term(B). {
2328 	A = B;
2329 }
2330 
md_muldiv_term(A)2331 md_muldiv_term(A) ::= md_muldiv_term(B) MD_TOKEN_TIMES(O) md_unary_bitwise_op_term(C). {
2332 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2333 }
md_muldiv_term(A)2334 md_muldiv_term(A) ::= md_muldiv_term(B) MD_TOKEN_DIVIDE(O) md_unary_bitwise_op_term(C). {
2335 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2336 }
md_muldiv_term(A)2337 md_muldiv_term(A) ::= md_muldiv_term(B) MD_TOKEN_INT_DIVIDE(O) md_unary_bitwise_op_term(C). {
2338 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2339 }
md_muldiv_term(A)2340 md_muldiv_term(A) ::= md_muldiv_term(B) MD_TOKEN_MOD(O) md_unary_bitwise_op_term(C). {
2341 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2342 }
2343 
md_muldiv_term(A)2344 md_muldiv_term(A) ::= md_muldiv_term(B) MD_TOKEN_OTIMES(O) md_unary_bitwise_op_term(C). {
2345 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2346 }
md_muldiv_term(A)2347 md_muldiv_term(A) ::= md_muldiv_term(B) MD_TOKEN_ODIVIDE(O) md_unary_bitwise_op_term(C). {
2348 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2349 }
md_muldiv_term(A)2350 md_muldiv_term(A) ::= md_muldiv_term(B) MD_TOKEN_INT_ODIVIDE(O) md_unary_bitwise_op_term(C). {
2351 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2352 }
2353 
2354 // ----------------------------------------------------------------
md_unary_bitwise_op_term(A)2355 md_unary_bitwise_op_term(A) ::= md_pow_term(B). {
2356 	A = B;
2357 }
md_unary_bitwise_op_term(A)2358 md_unary_bitwise_op_term(A) ::= MD_TOKEN_PLUS(O) md_unary_bitwise_op_term(C). {
2359 	A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_OPERATOR, C);
2360 }
md_unary_bitwise_op_term(A)2361 md_unary_bitwise_op_term(A) ::= MD_TOKEN_MINUS(O) md_unary_bitwise_op_term(C). {
2362 	A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_OPERATOR, C);
2363 }
md_unary_bitwise_op_term(A)2364 md_unary_bitwise_op_term(A) ::= MD_TOKEN_OPLUS(O) md_unary_bitwise_op_term(C). {
2365 	A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_OPERATOR, C);
2366 }
md_unary_bitwise_op_term(A)2367 md_unary_bitwise_op_term(A) ::= MD_TOKEN_OMINUS(O) md_unary_bitwise_op_term(C). {
2368 	A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_OPERATOR, C);
2369 }
md_unary_bitwise_op_term(A)2370 md_unary_bitwise_op_term(A) ::= MD_TOKEN_LOGICAL_NOT(O) md_unary_bitwise_op_term(C). {
2371 	A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_OPERATOR, C);
2372 }
md_unary_bitwise_op_term(A)2373 md_unary_bitwise_op_term(A) ::= MD_TOKEN_BITWISE_NOT(O) md_unary_bitwise_op_term(C). {
2374 	A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_OPERATOR, C);
2375 }
2376 
2377 // ----------------------------------------------------------------
md_pow_term(A)2378 md_pow_term(A) ::= md_atom_or_fcn(B). {
2379 	A = B;
2380 }
md_pow_term(A)2381 md_pow_term(A) ::= md_atom_or_fcn(B) MD_TOKEN_POW(O) md_pow_term(C). {
2382 	A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OPERATOR, B, C);
2383 }
2384 
2385 
2386 // ----------------------------------------------------------------
2387 // In the grammar provided to the user, field names are of the form "$x".  But
2388 // within Miller internally, field names are of the form "x".  We coded the
2389 // lexer to give us field names with leading "$" so we can confidently strip it
2390 // off here.
2391 
md_atom_or_fcn(A)2392 md_atom_or_fcn(A) ::= md_field_name(B). {
2393 	A = B;
2394 }
md_field_name(A)2395 md_field_name(A) ::= MD_TOKEN_FIELD_NAME(B). {
2396 	char* dollar_name = B->text;
2397 	char* no_dollar_name = &dollar_name[1];
2398 	A = mlr_dsl_ast_node_alloc(no_dollar_name, B->type);
2399 }
md_field_name(A)2400 md_field_name(A) ::= MD_TOKEN_BRACED_FIELD_NAME(B). {
2401 	// Replace "${field.name}" with just "field.name"
2402 	char* dollar_name = B->text;
2403 	char* no_dollar_name = &dollar_name[2];
2404 	int len = strlen(no_dollar_name);
2405 	if (len > 0)
2406 		no_dollar_name[len-1] = 0;
2407 	A = mlr_dsl_ast_node_alloc(no_dollar_name, B->type);
2408 }
2409 
md_atom_or_fcn(A)2410 md_atom_or_fcn(A) ::= md_indirect_field_name(B). {
2411 	A = B;
2412 }
md_indirect_field_name(A)2413 md_indirect_field_name(A) ::= MD_TOKEN_DOLLAR_SIGN MD_TOKEN_LEFT_BRACKET md_rhs(B) MD_TOKEN_RIGHT_BRACKET.  {
2414 	A = mlr_dsl_ast_node_alloc_unary("indirect_field_name", MD_AST_NODE_TYPE_INDIRECT_FIELD_NAME, B);
2415 }
2416 
md_atom_or_fcn(A)2417 md_atom_or_fcn(A) ::= md_positional_srec_name(B). {
2418 	A = B;
2419 }
md_positional_srec_name(A)2420 md_positional_srec_name(A) ::= MD_TOKEN_DOLLAR_SIGN
2421 	MD_TOKEN_LEFT_BRACKET MD_TOKEN_LEFT_BRACKET
2422 		md_rhs(B)
2423 	MD_TOKEN_RIGHT_BRACKET MD_TOKEN_RIGHT_BRACKET.  {
2424 	A = mlr_dsl_ast_node_alloc_unary(
2425 		"positional_srec_field_name",
2426 		MD_AST_NODE_TYPE_POSITIONAL_SREC_NAME,
2427 		B
2428 	);
2429 }
2430 
2431 // '$value = $[[[3]]]' is shorthand for '$value = $[ $[[3]] ]'.
2432 // Note that '$[[3]]' is key at srec position 3 and '$[[[3]]]' is value at srec position 3.
md_atom_or_fcn(A)2433 md_atom_or_fcn(A) ::= md_positional_srec_value(B). {
2434 	A = B;
2435 }
md_positional_srec_value(A)2436 md_positional_srec_value(A) ::= MD_TOKEN_DOLLAR_SIGN
2437 	MD_TOKEN_LEFT_BRACKET MD_TOKEN_LEFT_BRACKET MD_TOKEN_LEFT_BRACKET
2438 		md_rhs(B)
2439 	MD_TOKEN_RIGHT_BRACKET MD_TOKEN_RIGHT_BRACKET MD_TOKEN_RIGHT_BRACKET.  {
2440 	A = mlr_dsl_ast_node_alloc_unary(
2441 		"indirect_field_name",
2442 		MD_AST_NODE_TYPE_INDIRECT_FIELD_NAME,
2443 		mlr_dsl_ast_node_alloc_unary(
2444 			"positional_srec_field_name",
2445 			MD_AST_NODE_TYPE_POSITIONAL_SREC_NAME,
2446 			B
2447 		)
2448 	);
2449 }
2450 
2451 // ----------------------------------------------------------------
md_atom_or_fcn(A)2452 md_atom_or_fcn(A) ::= md_oosvar_keylist(B). {
2453 	A = B;
2454 }
2455 
md_oosvar_keylist(A)2456 md_oosvar_keylist(A) ::= md_oosvar_basename(B). {
2457 	A = B;
2458 }
md_oosvar_keylist(A)2459 md_oosvar_keylist(A) ::= md_oosvar_keylist(B) MD_TOKEN_LEFT_BRACKET md_rhs(C) MD_TOKEN_RIGHT_BRACKET. {
2460 	A = mlr_dsl_ast_node_append_arg(B, C);
2461 }
2462 
2463 // E.g. @name
md_oosvar_basename(A)2464 md_oosvar_basename(A) ::= MD_TOKEN_UNBRACED_OOSVAR_NAME(B). {
2465 	char* at_name = B->text;
2466 	char* no_at_name = &at_name[1];
2467 	A = mlr_dsl_ast_node_alloc_unary("oosvar_keylist", MD_AST_NODE_TYPE_OOSVAR_KEYLIST,
2468 		mlr_dsl_ast_node_alloc(no_at_name, B->type));
2469 }
2470 
2471 // E.g. @{name}
md_oosvar_basename(A)2472 md_oosvar_basename(A) ::= MD_TOKEN_BRACED_OOSVAR_NAME(B). {
2473 	// Replace "@%{field.name}" with just "field.name"
2474 	char* at_name = B->text;
2475 	char* no_at_name = &at_name[2];
2476 	int len = strlen(no_at_name);
2477 	if (len > 0)
2478 		no_at_name[len-1] = 0;
2479 	A = mlr_dsl_ast_node_alloc_unary("oosvar_keylist", MD_AST_NODE_TYPE_OOSVAR_KEYLIST,
2480 		mlr_dsl_ast_node_alloc(no_at_name, B->type));
2481 }
2482 
2483 // E.g. @["name"]
md_oosvar_basename(A)2484 md_oosvar_basename(A) ::= MD_TOKEN_AT_SIGN MD_TOKEN_LEFT_BRACKET md_rhs(B) MD_TOKEN_RIGHT_BRACKET. {
2485 	A = mlr_dsl_ast_node_alloc_unary("oosvar_keylist", MD_AST_NODE_TYPE_OOSVAR_KEYLIST, B);
2486 }
2487 
md_local_map_keylist(A)2488 md_local_map_keylist(A) ::= md_nonindexed_local_variable(B). {
2489 	A = B;
2490 }
md_local_map_keylist(A)2491 md_local_map_keylist(A) ::= md_local_map_keylist(B) MD_TOKEN_LEFT_BRACKET md_rhs(C) MD_TOKEN_RIGHT_BRACKET. {
2492 	A = mlr_dsl_ast_node_append_arg(B, C);
2493 }
2494 
2495 // ----------------------------------------------------------------
md_atom_or_fcn(A)2496 md_atom_or_fcn(A) ::= MD_TOKEN_NUMBER(B). {
2497 	A = B;
2498 }
md_atom_or_fcn(A)2499 md_atom_or_fcn(A) ::= MD_TOKEN_TRUE(B). {
2500 	A = B;
2501 }
md_atom_or_fcn(A)2502 md_atom_or_fcn(A) ::= MD_TOKEN_FALSE(B). {
2503 	A = B;
2504 }
2505 
md_atom_or_fcn(A)2506 md_atom_or_fcn(A) ::= md_string(B). {
2507 	A = B;
2508 }
md_atom_or_fcn(A)2509 md_atom_or_fcn(A) ::= md_regexi(B). {
2510 	A = B;
2511 }
2512 
md_atom_or_fcn(A)2513 md_atom_or_fcn(A) ::= md_nonindexed_local_variable(B). {
2514 	A = B;
2515 }
2516 
md_atom_or_fcn(A)2517 md_atom_or_fcn(A) ::= md_indexed_local_variable(B). {
2518 	A = B;
2519 }
2520 
md_nonindexed_local_variable(A)2521 md_nonindexed_local_variable(A) ::= MD_TOKEN_NON_SIGIL_NAME(B). {
2522 	A = mlr_dsl_ast_node_alloc(B->text, MD_AST_NODE_TYPE_NONINDEXED_LOCAL_VARIABLE);
2523 }
2524 
md_indexed_local_variable(A)2525 md_indexed_local_variable(A) ::= md_nonindexed_local_variable(B) MD_TOKEN_LEFT_BRACKET md_rhs(C) MD_TOKEN_RIGHT_BRACKET. {
2526 	A = mlr_dsl_ast_node_alloc_unary(B->text, MD_AST_NODE_TYPE_INDEXED_LOCAL_VARIABLE, C);
2527 	mlr_dsl_ast_node_free(B);
2528 }
md_indexed_local_variable(A)2529 md_indexed_local_variable(A) ::= md_indexed_local_variable(B) MD_TOKEN_LEFT_BRACKET md_rhs(C) MD_TOKEN_RIGHT_BRACKET. {
2530 	A = mlr_dsl_ast_node_append_arg(B, C);
2531 }
2532 
2533 
md_atom_or_fcn(A)2534 md_atom_or_fcn(A) ::= md_indexed_function_call(B). {
2535 	A = B;
2536 }
2537 
2538 // Indexed function calls:
2539 // * First child node is function call with argument list.
2540 // * Second child node is list of indexing expressions.
2541 //
2542 // Example: 'foo(1,2,3)[4][5]' parses to AST
2543 //
2544 // text="foo", type=INDEXED_FUNCTION_CALLSITE:
2545 //     text="foo", type=FUNCTION_CALLSITE:
2546 //         text="1", type=NUMERIC_LITERAL.
2547 //         text="2", type=NUMERIC_LITERAL.
2548 //         text="3", type=NUMERIC_LITERAL.
2549 //     text="indexing", type=MD_AST_NODE_TYPE_INDEXED_FUNCTION_INDEX_LIST:
2550 //         text="4", type=NUMERIC_LITERAL.
2551 //         text="5", type=NUMERIC_LITERAL.
md_indexed_function_call(A)2552 md_indexed_function_call(A) ::= md_fcn_or_subr_call(B) MD_TOKEN_LEFT_BRACKET md_rhs(C) MD_TOKEN_RIGHT_BRACKET. {
2553 	A = mlr_dsl_ast_node_alloc_binary(
2554 		B->text,
2555 		MD_AST_NODE_TYPE_INDEXED_FUNCTION_CALLSITE,
2556 		B,
2557 		mlr_dsl_ast_node_alloc_unary(
2558 			"indexing",
2559 			MD_AST_NODE_TYPE_INDEXED_FUNCTION_INDEX_LIST,
2560 			C
2561 		)
2562 	);
2563 }
md_indexed_function_call(A)2564 md_indexed_function_call(A) ::= md_indexed_function_call(B) MD_TOKEN_LEFT_BRACKET md_rhs(C) MD_TOKEN_RIGHT_BRACKET. {
2565 	// Append to second child node which is list of indexing expressions.
2566 	A = mlr_dsl_ast_node_append_arg_to_second_child(B, C);
2567 }
2568 
md_string(A)2569 md_string(A) ::= MD_TOKEN_STRING(B). {
2570 	char* input = B->text;
2571 	char* stripped = &input[1];
2572 	int len = strlen(input);
2573 	stripped[len-2] = 0;
2574 	A = mlr_dsl_ast_node_alloc(mlr_alloc_unbackslash(stripped), B->type);
2575 }
md_regexi(A)2576 md_regexi(A) ::= MD_TOKEN_REGEXI(B). {
2577 	char* input = B->text;
2578 	char* stripped = &input[1];
2579 	int len = strlen(input);
2580 	stripped[len-3] = 0;
2581 	A = mlr_dsl_ast_node_alloc(mlr_alloc_unbackslash(stripped), B->type);
2582 }
2583 
md_atom_or_fcn(A)2584 md_atom_or_fcn(A) ::= MD_TOKEN_CONTEXT_VARIABLE(B). {
2585 	A = B;
2586 }
md_atom_or_fcn(A)2587 md_atom_or_fcn(A) ::= md_env_index(B). {
2588 	A = B;
2589 }
2590 
md_env_index(A)2591 md_env_index(A) ::= MD_TOKEN_ENV(B) MD_TOKEN_LEFT_BRACKET md_rhs(C) MD_TOKEN_RIGHT_BRACKET. {
2592 	A = mlr_dsl_ast_node_alloc_binary("env", MD_AST_NODE_TYPE_ENV, B, C);
2593 }
2594 
md_atom_or_fcn(A)2595 md_atom_or_fcn(A) ::= MD_TOKEN_LPAREN md_rhs(B) MD_TOKEN_RPAREN. {
2596 	A = B;
2597 }
2598 
md_atom_or_fcn(A)2599 md_atom_or_fcn(A) ::= md_fcn_or_subr_call(B). {
2600 	A = B;
2601 }
2602 
2603 // Given "f(a,b,c)": since this is a bottom-up parser, we get first the "a",
2604 // then "a,b", then "a,b,c", then finally "f(a,b,c)". So:
2605 // * On the "a" we make a function sub-AST called "anon(a)".
2606 // * On the "b" we append the next argument to get "anon(a,b)".
2607 // * On the "c" we append the next argument to get "anon(a,b,c)".
2608 // * On the "f" we change the function name to get "f(a,b,c)".
2609 
md_fcn_or_subr_call(A)2610 md_fcn_or_subr_call(A) ::= MD_TOKEN_NON_SIGIL_NAME(O) MD_TOKEN_LPAREN md_fcn_arg_list(B) MD_TOKEN_RPAREN. {
2611 	A = mlr_dsl_ast_node_set_function_name(B, O->text);
2612 	A->type = MD_AST_NODE_TYPE_FUNCTION_CALLSITE;
2613 }
2614 // For most functions it suffices to use the MD_TOKEN_NON_SIGIL_NAME pattern. But
2615 // int and float are keywords in the lexer so we need to spell those out explicitly.
2616 // (They're type-decl keywords but they're also the names of type-conversion functions.)
md_fcn_or_subr_call(A)2617 md_fcn_or_subr_call(A) ::= MD_TOKEN_INT(O) MD_TOKEN_LPAREN md_fcn_arg_list(B) MD_TOKEN_RPAREN. {
2618 	A = mlr_dsl_ast_node_set_function_name(B, O->text);
2619 	A->type = MD_AST_NODE_TYPE_FUNCTION_CALLSITE;
2620 }
md_fcn_or_subr_call(A)2621 md_fcn_or_subr_call(A) ::= MD_TOKEN_FLOAT(O) MD_TOKEN_LPAREN md_fcn_arg_list(B) MD_TOKEN_RPAREN. {
2622 	A = mlr_dsl_ast_node_set_function_name(B, O->text);
2623 	A->type = MD_AST_NODE_TYPE_FUNCTION_CALLSITE;
2624 }
2625 
md_fcn_arg_list(A)2626 md_fcn_arg_list(A) ::= . {
2627 	A = mlr_dsl_ast_node_alloc_zary("anon", MD_AST_NODE_TYPE_NON_SIGIL_NAME);
2628 }
md_fcn_arg_list(A)2629 md_fcn_arg_list(A) ::= md_fcn_non_empty_arg_list(B). {
2630 	A = B;
2631 }
2632 
md_fcn_non_empty_arg_list(A)2633 md_fcn_non_empty_arg_list(A) ::= md_fcn_arg(B). {
2634 	A = mlr_dsl_ast_node_alloc_unary("anon", MD_AST_NODE_TYPE_NON_SIGIL_NAME, B);
2635 }
md_fcn_non_empty_arg_list(A)2636 md_fcn_non_empty_arg_list(A) ::= md_fcn_arg(B) MD_TOKEN_COMMA. {
2637 	A = mlr_dsl_ast_node_alloc_unary("anon", MD_AST_NODE_TYPE_NON_SIGIL_NAME, B);
2638 }
md_fcn_non_empty_arg_list(A)2639 md_fcn_non_empty_arg_list(A) ::= md_fcn_arg(B) MD_TOKEN_COMMA md_fcn_non_empty_arg_list(C). {
2640 	A = mlr_dsl_ast_node_prepend_arg(C, B);
2641 }
2642 
md_fcn_arg(A)2643 md_fcn_arg(A) ::= md_rhs(B). {
2644 	A = B;
2645 }
md_fcn_arg(A)2646 md_fcn_arg(A) ::= MD_TOKEN_FULL_SREC(B). {
2647 	A = B;
2648 }
md_fcn_arg(A)2649 md_fcn_arg(A) ::= MD_TOKEN_FULL_OOSVAR(B). {
2650 	A = B;
2651 }
md_fcn_arg(A)2652 md_fcn_arg(A) ::= md_map_literal(B). {
2653 	A = B;
2654 }
2655 
2656 // ----------------------------------------------------------------
2657 // Map-literals in Miller are JSON-ish.
2658 
md_map_literal(A)2659 md_map_literal(A) ::= MD_TOKEN_LBRACE MD_TOKEN_RBRACE. {
2660 	A = mlr_dsl_ast_node_alloc_zary("map_literal", MD_AST_NODE_TYPE_MAP_LITERAL);
2661 }
md_map_literal(A)2662 md_map_literal(A) ::= MD_TOKEN_LBRACE md_map_literal_kv_pairs(B) MD_TOKEN_RBRACE. {
2663 	A = B;
2664 }
md_map_literal_kv_pairs(A)2665 md_map_literal_kv_pairs(A) ::= md_map_literal_kv_pair(B). {
2666 	A = mlr_dsl_ast_node_alloc_unary("map_literal", MD_AST_NODE_TYPE_MAP_LITERAL, B);
2667 }
2668 // Allow trailing final comma, especially for multiline map literals
md_map_literal_kv_pairs(A)2669 md_map_literal_kv_pairs(A) ::= md_map_literal_kv_pair(B) MD_TOKEN_COMMA. {
2670 	A = mlr_dsl_ast_node_alloc_unary("map_literal", MD_AST_NODE_TYPE_MAP_LITERAL, B);
2671 }
md_map_literal_kv_pairs(A)2672 md_map_literal_kv_pairs(A) ::= md_map_literal_kv_pair(B) MD_TOKEN_COMMA md_map_literal_kv_pairs(C). {
2673 	A = mlr_dsl_ast_node_prepend_arg(C, B);
2674 }
2675 
md_map_literal_kv_pair(A)2676 md_map_literal_kv_pair(A) ::= md_map_literal_key(B) MD_TOKEN_COLON md_map_literal_value(C). {
2677 	A = mlr_dsl_ast_node_alloc_binary("mappair", MD_AST_NODE_TYPE_MAP_LITERAL_PAIR, B, C);
2678 }
md_map_literal_key(A)2679 md_map_literal_key(A) ::= md_rhs(B). {
2680 	A = mlr_dsl_ast_node_alloc_unary("mapkey", MD_AST_NODE_TYPE_MAP_LITERAL_KEY, B);
2681 }
md_map_literal_value(A)2682 md_map_literal_value(A) ::= md_rhs(B). {
2683 	A = mlr_dsl_ast_node_alloc_unary("mapval", MD_AST_NODE_TYPE_MAP_LITERAL_VALUE, B);
2684 }
md_map_literal_value(A)2685 md_map_literal_value(A) ::= md_map_literal(B). {
2686 	A = mlr_dsl_ast_node_alloc_unary("mapval", MD_AST_NODE_TYPE_MAP_LITERAL_VALUE, B);
2687 }
md_map_literal_value(A)2688 md_map_literal_value(A) ::= MD_TOKEN_FULL_SREC(B). {
2689 	A = mlr_dsl_ast_node_alloc_unary("mapval", MD_AST_NODE_TYPE_MAP_LITERAL_VALUE, B);
2690 }
md_map_literal_value(A)2691 md_map_literal_value(A) ::= MD_TOKEN_FULL_OOSVAR(B). {
2692 	A = mlr_dsl_ast_node_alloc_unary("mapval", MD_AST_NODE_TYPE_MAP_LITERAL_VALUE, B);
2693 }
2694