mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-29 02:30:12 +00:00
bind-stack integration into CST handler
This commit is contained in:
parent
5a6b20051d
commit
69b2239272
8 changed files with 57 additions and 39 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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). {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue