mapvar iterate

This commit is contained in:
John Kerl 2016-11-06 15:17:29 -05:00
parent 1835cbd719
commit dce9e23ad8
10 changed files with 37 additions and 34 deletions

View file

@ -14,7 +14,7 @@
#define TYPE_MASK_FLOAT (1 << MT_FLOAT)
#define TYPE_MASK_NUMERIC (TYPE_MASK_INT | TYPE_MASK_FLOAT)
#define TYPE_MASK_BOOLEAN (1 << MT_BOOLEAN)
// Initial declaration is an empty map.
// Initial declaration is an empty map. // xxx update the logic as well as the comment
// xxx maybe change that? For oosvars there's no empty map but for local mapvars there could be? what about after final unset?
// Or, simply use the convention that empty map <=> absent?
#define TYPE_MASK_MAP ((1 << MT_DIM) | (1 << MT_ABSENT))

View file

@ -130,7 +130,7 @@ md_statement_not_braced_end(A) ::= md_int_local_definition(B). { A = B; }
md_statement_not_braced_end(A) ::= md_float_local_definition(B). { A = B; }
md_statement_not_braced_end(A) ::= md_boolean_local_definition(B). { A = B; }
md_statement_not_braced_end(A) ::= md_string_local_definition(B). { A = B; }
md_statement_not_braced_end(A) ::= md_map_local_declaration(B). { A = B; }
md_statement_not_braced_end(A) ::= md_map_local_definition(B). { A = B; }
md_statement_not_braced_end(A) ::= md_nonindexed_local_assignment(B). { A = B; }
md_statement_not_braced_end(A) ::= md_indexed_local_assignment(B). { A = B; }
@ -747,14 +747,11 @@ md_boolean_local_definition(A) ::= MD_TOKEN_BOOLEAN(T) md_nonindexed_local_varia
md_string_local_definition(A) ::= MD_TOKEN_STRING(T) md_nonindexed_local_variable(N) MD_TOKEN_ASSIGN md_rhs(B). {
A = mlr_dsl_ast_node_alloc_binary(T->text, MD_AST_NODE_TYPE_STRING_LOCAL_DEFINITION, N, B);
}
md_map_local_declaration(A) ::= MD_TOKEN_MAP(T) md_nonindexed_local_variable(N). {
A = mlr_dsl_ast_node_alloc_unary(T->text, MD_AST_NODE_TYPE_MAP_LOCAL_DECLARATION, N);
}
md_untyped_local_definition(A) ::= MD_TOKEN_VAR(T) md_nonindexed_local_variable(N) MD_TOKEN_ASSIGN md_map_literal(C). {
A = mlr_dsl_ast_node_alloc_binary(T->text, MD_AST_NODE_TYPE_MAP_LOCAL_DECLARATION, N, C);
A = mlr_dsl_ast_node_alloc_binary(T->text, MD_AST_NODE_TYPE_MAP_LOCAL_DEFINITION, N, C);
}
md_map_local_declaration(A) ::= MD_TOKEN_MAP(T) md_nonindexed_local_variable(N) MD_TOKEN_ASSIGN md_map_literal(C). {
A = mlr_dsl_ast_node_alloc_binary(T->text, MD_AST_NODE_TYPE_MAP_LOCAL_DECLARATION, N, C);
md_map_local_definition(A) ::= MD_TOKEN_MAP(T) md_nonindexed_local_variable(N) MD_TOKEN_ASSIGN md_map_literal(C). {
A = mlr_dsl_ast_node_alloc_binary(T->text, MD_AST_NODE_TYPE_MAP_LOCAL_DEFINITION, N, C);
}
md_nonindexed_local_assignment(A) ::= md_nonindexed_local_variable(B) MD_TOKEN_ASSIGN(O) md_rhs(C). {

View file

@ -273,7 +273,7 @@ char* mlr_dsl_ast_node_describe_type(mlr_dsl_ast_node_type_t type) {
case MD_AST_NODE_TYPE_FLOAT_LOCAL_DEFINITION: return "FLOAT_LOCAL_DEFINITION"; break;
case MD_AST_NODE_TYPE_BOOLEAN_LOCAL_DEFINITION: return "BOOLEAN_LOCAL_DEFINITION"; break;
case MD_AST_NODE_TYPE_STRING_LOCAL_DEFINITION: return "STRING_LOCAL_DEFINITION"; break;
case MD_AST_NODE_TYPE_MAP_LOCAL_DECLARATION: return "MAP_LOCAL_DECLARATION"; break;
case MD_AST_NODE_TYPE_MAP_LOCAL_DEFINITION: return "MAP_LOCAL_DEFINITION"; break;
case MD_AST_NODE_TYPE_UNTYPED_PARAMETER_DEFINITION: return "UNTYPED_PARAMETER_DEFINITION"; break;
case MD_AST_NODE_TYPE_NUMERIC_PARAMETER_DEFINITION: return "NUMERIC_PARAMETER_DEFINITION"; break;
case MD_AST_NODE_TYPE_INT_PARAMETER_DEFINITION: return "INT_PARAMETER_DEFINITION"; break;

View file

@ -21,7 +21,7 @@ typedef enum _mlr_dsl_ast_node_type_t {
MD_AST_NODE_TYPE_FLOAT_LOCAL_DEFINITION,
MD_AST_NODE_TYPE_BOOLEAN_LOCAL_DEFINITION,
MD_AST_NODE_TYPE_STRING_LOCAL_DEFINITION,
MD_AST_NODE_TYPE_MAP_LOCAL_DECLARATION,
MD_AST_NODE_TYPE_MAP_LOCAL_DEFINITION,
MD_AST_NODE_TYPE_UNTYPED_PARAMETER_DEFINITION,
MD_AST_NODE_TYPE_NUMERIC_PARAMETER_DEFINITION,
MD_AST_NODE_TYPE_INT_PARAMETER_DEFINITION,

View file

@ -685,7 +685,7 @@ typedef struct _local_variable_definition_state_t {
} local_variable_definition_state_t;
static mlr_dsl_cst_statement_handler_t handle_local_variable_definition;
static mlr_dsl_cst_statement_handler_t handle_local_map_declaration;
static mlr_dsl_cst_statement_handler_t handle_local_variable_definition_from_map_literal;
static mlr_dsl_cst_statement_freer_t free_local_variable_definition;
// ----------------------------------------------------------------
@ -706,14 +706,12 @@ mlr_dsl_cst_statement_t* alloc_local_variable_definition(
pstate->lhs_type_mask = type_mask;
mlr_dsl_cst_statement_handler_t* pstatement_handler = NULL;
if (pnode->type == MD_AST_NODE_TYPE_MAP_LOCAL_DECLARATION) { // xxx remove
// 'map x' rather than 'map x = ...' so there is no initial right-hand side.
pstate->prhs_evaluator = NULL;
pstatement_handler = handle_local_map_declaration;
mlr_dsl_ast_node_t* prhs_node = pnode->pchildren->phead->pnext->pvvalue;
if (prhs_node->type == MD_AST_NODE_TYPE_MAP_LITERAL) {
pstate->prhs_evaluator = NULL; // xxx more to do for mapvars
pstatement_handler = handle_local_variable_definition_from_map_literal;
} else {
mlr_dsl_ast_node_t* pvalue_node = pnode->pchildren->phead->pnext->pvvalue;
pstate->prhs_evaluator = rval_evaluator_alloc_from_ast(pvalue_node, pcst->pfmgr,
type_inferencing, context_flags);
pstate->prhs_evaluator = rval_evaluator_alloc_from_ast(prhs_node, pcst->pfmgr, type_inferencing, context_flags);
pstatement_handler = handle_local_variable_definition;
}
@ -756,15 +754,23 @@ static void handle_local_variable_definition( // xxx mapvar
}
// ----------------------------------------------------------------
static void handle_local_map_declaration( // xxx rm
static void handle_local_variable_definition_from_map_literal( // xxx mapvar
mlr_dsl_cst_statement_t* pstatement,
variables_t* pvars,
cst_outputs_t* pcst_outputs)
{
local_variable_definition_state_t* pstate = pstatement->pvstate;
local_stack_frame_t* pframe = local_stack_get_top_frame(pvars->plocal_stack);
local_stack_frame_define(pframe,
pstate->lhs_variable_name, pstate->lhs_frame_relative_index,
pstate->lhs_type_mask, mv_absent());
//rval_evaluator_t* prhs_evaluator = pstate->prhs_evaluator; // xxx mapvar
//mv_t val = prhs_evaluator->pprocess_func(prhs_evaluator->pvstate, pvars);
// xxx mapvar stub
mv_t val = mv_absent();
//if (mv_is_present(&val)) {
local_stack_frame_t* pframe = local_stack_get_top_frame(pvars->plocal_stack);
local_stack_frame_define(pframe,
pstate->lhs_variable_name, pstate->lhs_frame_relative_index,
/*pstate->lhs_type_mask*/ TYPE_MASK_MAP, val); // xxx temp stub
//} else {
//mv_free(&val);
//}
}

View file

@ -59,7 +59,7 @@ mlr_dsl_cst_statement_t* alloc_return_value(
// $ mlr --from s put -v 'map v = {}'
// AST ROOT:
// text="block", type=STATEMENT_BLOCK:
// text="map", type=MAP_LOCAL_DECLARATION:
// text="map", type=MAP_LOCAL_DEFINITION:
// text="v", type=NONINDEXED_LOCAL_VARIABLE.
// text="map_literal", type=MAP_LITERAL:

View file

@ -205,7 +205,7 @@ mlr_dsl_cst_statement_t* mlr_dsl_cst_alloc_statement(mlr_dsl_cst_t* pcst, mlr_ds
return alloc_local_variable_definition(pcst, pnode, type_inferencing, context_flags, TYPE_MASK_STRING);
break;
case MD_AST_NODE_TYPE_MAP_LOCAL_DECLARATION:
case MD_AST_NODE_TYPE_MAP_LOCAL_DEFINITION:
return alloc_local_variable_definition(pcst, pnode, type_inferencing, context_flags, TYPE_MASK_MAP);
break;

View file

@ -387,7 +387,7 @@ static void pass_1_for_node(mlr_dsl_ast_node_t* pnode, stkalc_subframe_group_t*
} else if (pnode->type == MD_AST_NODE_TYPE_STRING_LOCAL_DEFINITION) { // LHS
pass_1_for_local_definition(pnode, pframe_group, pmax_subframe_depth, trace);
} else if (pnode->type == MD_AST_NODE_TYPE_MAP_LOCAL_DECLARATION) { // LHS
} else if (pnode->type == MD_AST_NODE_TYPE_MAP_LOCAL_DEFINITION) { // LHS
pass_1_for_local_definition(pnode, pframe_group, pmax_subframe_depth, trace);
} else if (pnode->type == MD_AST_NODE_TYPE_NONINDEXED_LOCAL_ASSIGNMENT) { // LHS

View file

@ -45486,26 +45486,26 @@ x=3,y=4,z=5,a0=6,b1=7,c2=8,d3=9
LOCAL MAP-VARIABLE TYPE-DECL
mlr --from ./reg_test/input/xyz345 put
map a;
map a = {};
x=3,y=4,z=5
mlr --from ./reg_test/input/xyz345 put
map a;
map a = {};
a[1]=2;
a[3][4]=5;
x=3,y=4,z=5
mlr --from ./reg_test/input/xyz345 put
map a;
map a = {};
a=2;
a[3][4]=5;
mlr: map type assertion for variable a unmet by value 2 with type int.
mlr --from ./reg_test/input/xyz345 put
map a;
map a = {};
a[3][4]=5;
a=2;

View file

@ -5130,23 +5130,23 @@ run_mlr --from $indir/xyz345 put -v -a '
announce LOCAL MAP-VARIABLE TYPE-DECL
run_mlr --from $indir/xyz345 put '
map a;
map a = {};
'
run_mlr --from $indir/xyz345 put '
map a;
map a = {};
a[1]=2;
a[3][4]=5;
'
mlr_expect_fail --from $indir/xyz345 put '
map a;
map a = {};
a=2;
a[3][4]=5;
'
mlr_expect_fail --from $indir/xyz345 put '
map a;
map a = {};
a[3][4]=5;
a=2;
'