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