ENV LHS iterate

This commit is contained in:
John Kerl 2016-10-02 18:50:39 -04:00
parent 3bf02d6fdd
commit 988dedcdfe
3 changed files with 72 additions and 7 deletions

View file

@ -183,6 +183,7 @@ char* mlr_dsl_ast_node_describe_type(mlr_dsl_ast_node_type_t type) {
case MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT: return "oosvar_assignment"; break;
case MD_AST_NODE_TYPE_OOSVAR_FROM_FULL_SREC_ASSIGNMENT: return "oosvar_from_full_srec_assignment"; break;
case MD_AST_NODE_TYPE_FULL_SREC_FROM_OOSVAR_ASSIGNMENT: return "full_srec_from_oosvar_assignment"; break;
case MD_AST_NODE_TYPE_ENV_ASSIGNMENT: return "env_assignment"; break;
case MD_AST_NODE_TYPE_CONTEXT_VARIABLE: return "context_variable"; break;
case MD_AST_NODE_TYPE_STRIPPED_AWAY: return "stripped_away"; break;
case MD_AST_NODE_TYPE_CONDITIONAL_BLOCK: return "conditional_block"; break;

View file

@ -34,6 +34,7 @@ typedef enum _mlr_dsl_ast_node_type_t {
MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT,
MD_AST_NODE_TYPE_OOSVAR_FROM_FULL_SREC_ASSIGNMENT,
MD_AST_NODE_TYPE_FULL_SREC_FROM_OOSVAR_ASSIGNMENT,
MD_AST_NODE_TYPE_ENV_ASSIGNMENT,
MD_AST_NODE_TYPE_CONTEXT_VARIABLE,
MD_AST_NODE_TYPE_ENV,
MD_AST_NODE_TYPE_STRIPPED_AWAY,

View file

@ -149,7 +149,7 @@ md_statement_not_braced_end(A) ::= md_srec_assignment(B). { A =
md_statement_not_braced_end(A) ::= md_srec_indirect_assignment(B). { A = B; }
md_statement_not_braced_end(A) ::= md_oosvar_from_full_srec_assignment(B). { A = B; }
md_statement_not_braced_end(A) ::= md_full_srec_from_oosvar_assignment(B). { A = B; }
//md_statement_not_braced_end(A) ::= md_env_assignment(B). { A = B; }
md_statement_not_braced_end(A) ::= md_env_assignment(B). { A = B; }
// Valid in begin/end since they don't refer to srecs (although the RHSs might):
md_statement_not_braced_end(A) ::= md_do_while_block(B). { A = B; }
@ -570,12 +570,9 @@ md_full_srec_from_oosvar_assignment(A) ::= MD_TOKEN_FULL_SREC(B) MD_TOKEN_ASSIG
A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_FULL_SREC_FROM_OOSVAR_ASSIGNMENT, B, C);
}
//xxx
//make intermediate
//md_env_assignment(A) ::= MD_TOKEN_FULL_SREC(B) MD_TOKEN_ASSIGN(O) md_oosvar_keylist(C). {
//A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_FULL_SREC_FROM_OOSVAR_ASSIGNMENT, B, C);
//}
md_env_assignment(A) ::= md_env_index(B) MD_TOKEN_ASSIGN(O) md_rhs(C). {
A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B, C);
}
// ----------------------------------------------------------------
md_srec_assignment(A) ::= md_field_name(B) MD_TOKEN_LOGICAL_OR_EQUALS md_rhs(C). {
@ -774,6 +771,72 @@ md_local_assignment(A) ::= md_bound_variable(B) MD_TOKEN_POW_EQUALS md_rhs(C).
mlr_dsl_ast_node_alloc_binary("**", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
}
// ----------------------------------------------------------------
md_env_assignment(A) ::= md_env_index(B) MD_TOKEN_LOGICAL_OR_EQUALS md_rhs(C). {
A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
mlr_dsl_ast_node_alloc_binary("||", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
}
md_env_assignment(A) ::= md_env_index(B) MD_TOKEN_LOGICAL_XOR_EQUALS md_rhs(C). {
A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
mlr_dsl_ast_node_alloc_binary("^^", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
}
md_env_assignment(A) ::= md_env_index(B) MD_TOKEN_LOGICAL_AND_EQUALS md_rhs(C). {
A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
mlr_dsl_ast_node_alloc_binary("&&", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
}
md_env_assignment(A) ::= md_env_index(B) MD_TOKEN_BITWISE_OR_EQUALS md_rhs(C). {
A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
mlr_dsl_ast_node_alloc_binary("|", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
}
md_env_assignment(A) ::= md_env_index(B) MD_TOKEN_BITWISE_XOR_EQUALS md_rhs(C). {
A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
mlr_dsl_ast_node_alloc_binary("^", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
}
md_env_assignment(A) ::= md_env_index(B) MD_TOKEN_BITWISE_AND_EQUALS md_rhs(C). {
A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
mlr_dsl_ast_node_alloc_binary("&", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
}
md_env_assignment(A) ::= md_env_index(B) MD_TOKEN_BITWISE_LSH_EQUALS md_rhs(C). {
A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
mlr_dsl_ast_node_alloc_binary("<<", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
}
md_env_assignment(A) ::= md_env_index(B) MD_TOKEN_BITWISE_RSH_EQUALS md_rhs(C). {
A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
mlr_dsl_ast_node_alloc_binary(">>", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
}
md_env_assignment(A) ::= md_env_index(B) MD_TOKEN_PLUS_EQUALS md_rhs(C). {
A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
mlr_dsl_ast_node_alloc_binary("+", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
}
md_env_assignment(A) ::= md_env_index(B) MD_TOKEN_MINUS_EQUALS md_rhs(C). {
A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
mlr_dsl_ast_node_alloc_binary("-", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
}
md_env_assignment(A) ::= md_env_index(B) MD_TOKEN_DOT_EQUALS md_rhs(C). {
A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
mlr_dsl_ast_node_alloc_binary(".", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
}
md_env_assignment(A) ::= md_env_index(B) MD_TOKEN_TIMES_EQUALS md_rhs(C). {
A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
mlr_dsl_ast_node_alloc_binary("*", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
}
md_env_assignment(A) ::= md_env_index(B) MD_TOKEN_DIVIDE_EQUALS md_rhs(C). {
A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
mlr_dsl_ast_node_alloc_binary("/", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
}
md_env_assignment(A) ::= md_env_index(B) MD_TOKEN_INT_DIVIDE_EQUALS md_rhs(C). {
A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
mlr_dsl_ast_node_alloc_binary("//", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
}
md_env_assignment(A) ::= md_env_index(B) MD_TOKEN_MOD_EQUALS md_rhs(C). {
A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
mlr_dsl_ast_node_alloc_binary("%", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
}
md_env_assignment(A) ::= md_env_index(B) MD_TOKEN_POW_EQUALS md_rhs(C). {
A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_ENV_ASSIGNMENT, B,
mlr_dsl_ast_node_alloc_binary("**", MD_AST_NODE_TYPE_OPERATOR, mlr_dsl_ast_tree_copy(B) , C));
}
// ----------------------------------------------------------------
md_unset(A) ::= MD_TOKEN_UNSET(O) MD_TOKEN_ALL(B). {
A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_UNSET, B);