bind-stack integration into CST handler

This commit is contained in:
John Kerl 2016-05-16 13:50:04 -04:00
parent 5a6b20051d
commit 69b2239272
8 changed files with 57 additions and 39 deletions

View file

@ -171,7 +171,7 @@ char* mlr_dsl_ast_node_describe_type(mlr_dsl_ast_node_type_t type) {
case MD_AST_NODE_TYPE_DO_WHILE: return "do_while"; break;
case MD_AST_NODE_TYPE_FOR_SREC: return "for_srec"; break;
case MD_AST_NODE_TYPE_FOR_VARIABLES: return "for_variables"; break;
case MD_AST_NODE_TYPE_BOUND_VAR: return "bound_var"; break;
case MD_AST_NODE_TYPE_BOUND_VARIABLE: return "bound_variable"; break;
case MD_AST_NODE_TYPE_IN: return "in"; break;
case MD_AST_NODE_TYPE_BREAK: return "break"; break;
case MD_AST_NODE_TYPE_CONTINUE: return "continue"; break;

View file

@ -40,7 +40,7 @@ typedef enum _mlr_dsl_ast_node_type_t {
MD_AST_NODE_TYPE_DO_WHILE,
MD_AST_NODE_TYPE_FOR_SREC,
MD_AST_NODE_TYPE_FOR_VARIABLES,
MD_AST_NODE_TYPE_BOUND_VAR,
MD_AST_NODE_TYPE_BOUND_VARIABLE,
MD_AST_NODE_TYPE_IN,
MD_AST_NODE_TYPE_BREAK,
MD_AST_NODE_TYPE_CONTINUE,

View file

@ -813,11 +813,11 @@ md_atom_or_fcn(A) ::= md_regexi(B). {
A = B;
}
md_atom_or_fcn(A) ::= md_bound_var(B). {
md_atom_or_fcn(A) ::= md_bound_variable(B). {
A = B;
}
md_bound_var(A) ::= MD_TOKEN_NON_SIGIL_NAME(B). {
A = mlr_dsl_ast_node_alloc(B->text, MD_AST_NODE_TYPE_BOUND_VAR);
md_bound_variable(A) ::= MD_TOKEN_NON_SIGIL_NAME(B). {
A = mlr_dsl_ast_node_alloc(B->text, MD_AST_NODE_TYPE_BOUND_VARIABLE);
}
md_string(A) ::= MD_TOKEN_STRING(B). {

View file

@ -559,7 +559,7 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc_blank() {
pstatement->pvarargs = NULL;
pstatement->pblock_statements = NULL;
pstatement->pif_chain_statements = NULL;
pstatement->pbound_vars = NULL;
pstatement->pbound_variables = NULL;
return pstatement;
}
@ -874,8 +874,7 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc_for_srec(mlr_dsl_ast_node_t*
// Left child node is list of bound variables.
// Right child node is the list of statements in the body.
// xxx to do:
//mlr_dsl_ast_node_t* pleft = past->pchildren->phead->pvvalue;
mlr_dsl_ast_node_t* pleft = past->pchildren->phead->pvvalue;
mlr_dsl_ast_node_t* pright = past->pchildren->phead->pnext->pvvalue;
sllv_t* pblock_statements = sllv_alloc();
@ -894,9 +893,15 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc_for_srec(mlr_dsl_ast_node_t*
}
}
mlr_dsl_ast_node_t* pknode = pleft->pchildren->phead->pvvalue;
mlr_dsl_ast_node_t* pvnode = pleft->pchildren->phead->pnext->pvvalue;
pstatement->phandler = mlr_dsl_cst_node_handle_for_srec;
pstatement->pblock_statements = pblock_statements;
pstatement->pbound_vars = lhmsmv_alloc();
pstatement->for_srec_k_name = pknode->text;
pstatement->for_srec_v_name = pvnode->text;
pstatement->pbound_variables = lhmsmv_alloc();
return pstatement;
}
@ -1663,25 +1668,29 @@ static void mlr_dsl_cst_node_handle_for_srec(
char* oosvar_flatten_separator,
bind_stack_t* pbind_stack)
{
bind_stack_push(pbind_stack, pnode->pbound_vars);
bind_stack_push(pbind_stack, pnode->pbound_variables);
//printf("FOO\n");
//bind_stack_print(pbind_stack);
//printf("BAR\n");
for (lrece_t* pe = pinrec->phead; pe != NULL; pe = pe->pnext) {
// xxx beware string/integer for lrec keys ...
// Copy, not pointer-reference, in case of srec-unset in loop body.
mv_t mvkey = mv_from_string_with_free(mlr_strdup_or_die(pe->key));
mv_t* pmvval = lhmsv_get(ptyped_overlay, pe->key);
if (pmvval != NULL) {
*pmvval = mv_copy(pmvval);
} else {
*pmvval = mv_from_string_with_free(mlr_strdup_or_die(pe->value));
}
mv_t* poverlay = lhmsv_get(ptyped_overlay, pe->key);
mv_t mvval = (poverlay != NULL)
? mv_copy(poverlay)
: mv_from_string_with_free(mlr_strdup_or_die(pe->value));
lhmsmv_put(pnode->pbound_vars, pnode->for_srec_k_name, &mvkey, FREE_ENTRY_VALUE);
lhmsmv_put(pnode->pbound_vars, pnode->for_srec_v_name, pmvval, FREE_ENTRY_VALUE);
lhmsmv_put(pnode->pbound_variables, pnode->for_srec_k_name, &mvkey, FREE_ENTRY_VALUE);
lhmsmv_put(pnode->pbound_variables, pnode->for_srec_v_name, &mvval, FREE_ENTRY_VALUE);
mlr_dsl_cst_handle(pnode->pblock_statements,
poosvars, pinrec, ptyped_overlay, ppregex_captures, pctx, pshould_emit_rec, poutrecs,
oosvar_flatten_separator, pbind_stack);
//printf("FOO\n");
//bind_stack_print(pbind_stack);
//printf("BAR\n");
}
// xxx break/continue-handling (needs to be in rval evluators w/ stack of brk/ctu flags @ context
bind_stack_pop(pbind_stack);

View file

@ -102,7 +102,7 @@ typedef struct _mlr_dsl_cst_statement_t {
// xxx for-oosvar key-list of names
// for-srec and for-oosvar:
lhmsmv_t* pbound_vars;
lhmsmv_t* pbound_variables;
} mlr_dsl_cst_statement_t;

View file

@ -95,6 +95,7 @@ rval_evaluator_t* rval_evaluator_alloc_from_FILENUM();
rval_evaluator_t* rval_evaluator_alloc_from_PI();
rval_evaluator_t* rval_evaluator_alloc_from_E();
rval_evaluator_t* rval_evaluator_alloc_from_context_variable(char* variable_name);
rval_evaluator_t* rval_evaluator_alloc_from_bound_variable(char* variable_name);
// For unit test:
rval_evaluator_t* rval_evaluator_alloc_from_mlrval(mv_t* pval);

View file

@ -37,6 +37,8 @@ static rval_evaluator_t* rval_evaluator_alloc_from_ast_aux(mlr_dsl_ast_node_t* p
return rval_evaluator_alloc_from_strnum_literal(pnode->text, type_inferencing);
} else if (pnode->type == MD_AST_NODE_TYPE_CONTEXT_VARIABLE) {
return rval_evaluator_alloc_from_context_variable(pnode->text);
} else if (pnode->type == MD_AST_NODE_TYPE_BOUND_VARIABLE) {
return rval_evaluator_alloc_from_bound_variable(pnode->text);
} else {
fprintf(stderr, "%s: internal coding error detected in file %s at line %d.\n",
MLR_GLOBALS.argv0, __FILE__, __LINE__);
@ -794,6 +796,12 @@ rval_evaluator_t* rval_evaluator_alloc_from_context_variable(char* variable_name
}
}
// ================================================================
rval_evaluator_t* rval_evaluator_alloc_from_bound_variable(char* variable_name) {
// xxx stub
return rval_evaluator_alloc_from_FILENAME();
}
// ----------------------------------------------------------------
typedef struct _rval_evaluator_mv_state_t {
mv_t literal;

View file

@ -87,8 +87,8 @@ list (statement_list):
mlr -n put -v for(k,v in $*) { }
AST ROOT:
list (statement_list):
for (for-srec):
variables (for-variables):
for (for_srec):
variables (for_variables):
k (non_sigil_name).
v (non_sigil_name).
list (statement_list):
@ -98,8 +98,8 @@ list (statement_list):
mlr -n put -v for(k,v in $*) { $m=1}
AST ROOT:
list (statement_list):
for (for-srec):
variables (for-variables):
for (for_srec):
variables (for_variables):
k (non_sigil_name).
v (non_sigil_name).
list (statement_list):
@ -112,8 +112,8 @@ list (statement_list):
mlr -n put -v for(k,v in $*) { $m=1;$m=2 }
AST ROOT:
list (statement_list):
for (for-srec):
variables (for-variables):
for (for_srec):
variables (for_variables):
k (non_sigil_name).
v (non_sigil_name).
list (statement_list):
@ -129,8 +129,8 @@ list (statement_list):
mlr -n put -v for(k,v in $*) { $m=1;break;$m=2 }
AST ROOT:
list (statement_list):
for (for-srec):
variables (for-variables):
for (for_srec):
variables (for_variables):
k (non_sigil_name).
v (non_sigil_name).
list (statement_list):
@ -146,8 +146,8 @@ break alloc stub!
mlr -n put -v for(k,v in $*) { $m=1;break;continue;$m=2 }
AST ROOT:
list (statement_list):
for (for-srec):
variables (for-variables):
for (for_srec):
variables (for_variables):
k (non_sigil_name).
v (non_sigil_name).
list (statement_list):
@ -165,8 +165,8 @@ break alloc stub!
mlr -n put -v for(k,v in $*) { $m=1;break;continue;;$m=2 }
AST ROOT:
list (statement_list):
for (for-srec):
variables (for-variables):
for (for_srec):
variables (for_variables):
k (non_sigil_name).
v (non_sigil_name).
list (statement_list):
@ -186,8 +186,8 @@ break alloc stub!
mlr -n put -v for(k,v in $*) { true{$m=3} }
AST ROOT:
list (statement_list):
for (for-srec):
variables (for-variables):
for (for_srec):
variables (for_variables):
k (non_sigil_name).
v (non_sigil_name).
list (statement_list):
@ -206,8 +206,8 @@ list (statement_list):
cond (conditional_block):
true (boolean_literal).
list (statement_list):
for (for-srec):
variables (for-variables):
for (for_srec):
variables (for_variables):
k (non_sigil_name).
v (non_sigil_name).
list (statement_list):
@ -221,8 +221,8 @@ list (statement_list):
cond (conditional_block):
true (boolean_literal).
list (statement_list):
for (for-srec):
variables (for-variables):
for (for_srec):
variables (for_variables):
k (non_sigil_name).
v (non_sigil_name).
list (statement_list):
@ -245,8 +245,8 @@ list (statement_list):
cond (conditional_block):
true (boolean_literal).
list (statement_list):
for (for-srec):
variables (for-variables):
for (for_srec):
variables (for_variables):
k (non_sigil_name).
v (non_sigil_name).
list (statement_list):