mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-25 17:04:01 +00:00
UDF iterate (fmgr propagate bigdiff)
This commit is contained in:
parent
1069bc51be
commit
a82172498f
7 changed files with 197 additions and 172 deletions
|
|
@ -366,7 +366,7 @@ void fmgr_list_all_functions_raw(fmgr_t* pfmgr, FILE* output_stream) {
|
|||
|
||||
// ================================================================
|
||||
rval_evaluator_t* fmgr_alloc_from_operator_or_function(fmgr_t* pfmgr, mlr_dsl_ast_node_t* pnode,
|
||||
int type_inferencing, int context_flags, function_lookup_t* fcn_lookup_table)
|
||||
int type_inferencing, int context_flags, function_lookup_t* fcn_lookup_table) // xxx elim tbl arg
|
||||
{
|
||||
|
||||
if ((pnode->type != MD_AST_NODE_TYPE_NON_SIGIL_NAME) && (pnode->type != MD_AST_NODE_TYPE_OPERATOR)) {
|
||||
|
|
@ -394,7 +394,7 @@ rval_evaluator_t* fmgr_alloc_from_operator_or_function(fmgr_t* pfmgr, mlr_dsl_as
|
|||
pevaluator = rval_evaluator_alloc_from_zary_func_name(func_name);
|
||||
} else if (user_provided_arity == 1) {
|
||||
mlr_dsl_ast_node_t* parg1_node = pnode->pchildren->phead->pvvalue;
|
||||
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing,
|
||||
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, pfmgr, type_inferencing,
|
||||
context_flags, fcn_lookup_table);
|
||||
pevaluator = rval_evaluator_alloc_from_unary_func_name(func_name, parg1);
|
||||
} else if (user_provided_arity == 2) {
|
||||
|
|
@ -403,12 +403,12 @@ rval_evaluator_t* fmgr_alloc_from_operator_or_function(fmgr_t* pfmgr, mlr_dsl_as
|
|||
int type2 = parg2_node->type;
|
||||
|
||||
if ((streq(func_name, "=~") || streq(func_name, "!=~")) && type2 == MD_AST_NODE_TYPE_STRNUM_LITERAL) {
|
||||
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing,
|
||||
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, pfmgr, type_inferencing,
|
||||
context_flags, fcn_lookup_table);
|
||||
pevaluator = rval_evaluator_alloc_from_binary_regex_arg2_func_name(func_name,
|
||||
parg1, parg2_node->text, FALSE);
|
||||
} else if ((streq(func_name, "=~") || streq(func_name, "!=~")) && type2 == MD_AST_NODE_TYPE_REGEXI) {
|
||||
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing,
|
||||
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, pfmgr, type_inferencing,
|
||||
context_flags, fcn_lookup_table);
|
||||
pevaluator = rval_evaluator_alloc_from_binary_regex_arg2_func_name(func_name, parg1, parg2_node->text,
|
||||
TYPE_INFER_STRING_FLOAT_INT);
|
||||
|
|
@ -416,9 +416,9 @@ rval_evaluator_t* fmgr_alloc_from_operator_or_function(fmgr_t* pfmgr, mlr_dsl_as
|
|||
// regexes can still be applied here, e.g. if the 2nd argument is a non-terminal AST: however
|
||||
// the regexes will be compiled record-by-record rather than once at alloc time, which will
|
||||
// be slower.
|
||||
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing,
|
||||
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, pfmgr, type_inferencing,
|
||||
context_flags, fcn_lookup_table);
|
||||
rval_evaluator_t* parg2 = rval_evaluator_alloc_from_ast_aux(parg2_node, type_inferencing,
|
||||
rval_evaluator_t* parg2 = rval_evaluator_alloc_from_ast_aux(parg2_node, pfmgr, type_inferencing,
|
||||
context_flags, fcn_lookup_table);
|
||||
pevaluator = rval_evaluator_alloc_from_binary_func_name(func_name, parg1, parg2);
|
||||
}
|
||||
|
|
@ -431,18 +431,18 @@ rval_evaluator_t* fmgr_alloc_from_operator_or_function(fmgr_t* pfmgr, mlr_dsl_as
|
|||
|
||||
if ((streq(func_name, "sub") || streq(func_name, "gsub")) && type2 == MD_AST_NODE_TYPE_STRNUM_LITERAL) {
|
||||
// sub/gsub-regex special case:
|
||||
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing,
|
||||
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, pfmgr, type_inferencing,
|
||||
context_flags, fcn_lookup_table);
|
||||
rval_evaluator_t* parg3 = rval_evaluator_alloc_from_ast_aux(parg3_node, type_inferencing,
|
||||
rval_evaluator_t* parg3 = rval_evaluator_alloc_from_ast_aux(parg3_node, pfmgr, type_inferencing,
|
||||
context_flags, fcn_lookup_table);
|
||||
pevaluator = rval_evaluator_alloc_from_ternary_regex_arg2_func_name(func_name, parg1, parg2_node->text,
|
||||
FALSE, parg3);
|
||||
|
||||
} else if ((streq(func_name, "sub") || streq(func_name, "gsub")) && type2 == MD_AST_NODE_TYPE_REGEXI) {
|
||||
// sub/gsub-regex special case:
|
||||
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing,
|
||||
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, pfmgr, type_inferencing,
|
||||
context_flags, fcn_lookup_table);
|
||||
rval_evaluator_t* parg3 = rval_evaluator_alloc_from_ast_aux(parg3_node, type_inferencing,
|
||||
rval_evaluator_t* parg3 = rval_evaluator_alloc_from_ast_aux(parg3_node, pfmgr, type_inferencing,
|
||||
context_flags, fcn_lookup_table);
|
||||
pevaluator = rval_evaluator_alloc_from_ternary_regex_arg2_func_name(func_name, parg1, parg2_node->text,
|
||||
TYPE_INFER_STRING_FLOAT_INT, parg3);
|
||||
|
|
@ -451,11 +451,11 @@ rval_evaluator_t* fmgr_alloc_from_operator_or_function(fmgr_t* pfmgr, mlr_dsl_as
|
|||
// regexes can still be applied here, e.g. if the 2nd argument is a non-terminal AST: however
|
||||
// the regexes will be compiled record-by-record rather than once at alloc time, which will
|
||||
// be slower.
|
||||
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing,
|
||||
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, pfmgr, type_inferencing,
|
||||
context_flags, fcn_lookup_table);
|
||||
rval_evaluator_t* parg2 = rval_evaluator_alloc_from_ast_aux(parg2_node, type_inferencing,
|
||||
rval_evaluator_t* parg2 = rval_evaluator_alloc_from_ast_aux(parg2_node, pfmgr, type_inferencing,
|
||||
context_flags, fcn_lookup_table);
|
||||
rval_evaluator_t* parg3 = rval_evaluator_alloc_from_ast_aux(parg3_node, type_inferencing,
|
||||
rval_evaluator_t* parg3 = rval_evaluator_alloc_from_ast_aux(parg3_node, pfmgr, type_inferencing,
|
||||
context_flags, fcn_lookup_table);
|
||||
pevaluator = rval_evaluator_alloc_from_ternary_func_name(func_name, parg1, parg2, parg3);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
#include "mapping/context_flags.h"
|
||||
#include "mapping/mlr_dsl_cst.h"
|
||||
#include "mapping/rval_evaluators.h"
|
||||
#include "mapping/function_manager.h"
|
||||
#include "mapping/mappers.h"
|
||||
#include "dsls/mlr_dsl_wrapper.h"
|
||||
#include "cli/argparse.h"
|
||||
|
|
@ -14,6 +15,7 @@ typedef struct _mapper_filter_state_t {
|
|||
char* mlr_dsl_expression;
|
||||
char* comment_stripped_mlr_dsl_expression;
|
||||
mlr_dsl_ast_node_t* past;
|
||||
fmgr_t* pfmgr;
|
||||
mlhmmv_t* poosvars;
|
||||
rval_evaluator_t* pevaluator;
|
||||
int do_exclude;
|
||||
|
|
@ -155,7 +157,8 @@ static mapper_t* mapper_filter_alloc(ap_state_t* pargp, char* mlr_dsl_expression
|
|||
pstate->mlr_dsl_expression = mlr_dsl_expression;
|
||||
pstate->comment_stripped_mlr_dsl_expression = comment_stripped_mlr_dsl_expression;
|
||||
pstate->past = past;
|
||||
pstate->pevaluator = rval_evaluator_alloc_from_ast(past, type_inferencing, context_flags);
|
||||
pstate->pfmgr = fmgr_alloc();
|
||||
pstate->pevaluator = rval_evaluator_alloc_from_ast(past, pstate->pfmgr, type_inferencing, context_flags);
|
||||
pstate->poosvars = mlhmmv_alloc();
|
||||
pstate->do_exclude = do_exclude;
|
||||
|
||||
|
|
@ -173,6 +176,7 @@ static void mapper_filter_free(mapper_t* pmapper) {
|
|||
pstate->pevaluator->pfree_func(pstate->pevaluator);
|
||||
ap_free(pstate->pargp);
|
||||
mlr_dsl_ast_node_free(pstate->past);
|
||||
fmgr_free(pstate->pfmgr);
|
||||
mlhmmv_free(pstate->poosvars);
|
||||
free(pstate->mlr_dsl_expression);
|
||||
free(pstate->comment_stripped_mlr_dsl_expression);
|
||||
|
|
|
|||
|
|
@ -16,43 +16,45 @@
|
|||
|
||||
static mlr_dsl_ast_node_t* get_list_for_block(mlr_dsl_ast_node_t* pnode);
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, int type_inferencing, int context_flags);
|
||||
static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags);
|
||||
static mlr_dsl_cst_statement_t* alloc_blank();
|
||||
static void cst_statement_free(mlr_dsl_cst_statement_t* pstatement);
|
||||
|
||||
// ti = type_inferencing
|
||||
// cf = context_flags
|
||||
// dfp = do_full_prefixing
|
||||
static mlr_dsl_cst_statement_t* alloc_srec_assignment(mlr_dsl_ast_node_t* p, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_indirect_srec_assignment(mlr_dsl_ast_node_t* p, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_oosvar_assignment(mlr_dsl_ast_node_t* p, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_oosvar_from_full_srec_assignment(mlr_dsl_ast_node_t* p, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_full_srec_from_oosvar_assignment(mlr_dsl_ast_node_t* p, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* p, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_srec_assignment(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_indirect_srec_assignment(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_oosvar_assignment(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_oosvar_from_full_srec_assignment(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_full_srec_from_oosvar_assignment(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_conditional_block(mlr_dsl_ast_node_t* p, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_if_head(mlr_dsl_ast_node_t* p, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_while(mlr_dsl_ast_node_t* p, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_do_while(mlr_dsl_ast_node_t* p, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_for_srec(mlr_dsl_ast_node_t* p, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_for_oosvar(mlr_dsl_ast_node_t* p, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_break(mlr_dsl_ast_node_t* p, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_continue(mlr_dsl_ast_node_t* p, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_filter(mlr_dsl_ast_node_t* p, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_conditional_block(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_if_head(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_while(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_do_while(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_for_srec(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_for_oosvar(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_break(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_continue(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_filter(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_bare_boolean(mlr_dsl_ast_node_t* p, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_bare_boolean(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_tee(mlr_dsl_ast_node_t* p, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_emitf(mlr_dsl_ast_node_t* p, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_emit(mlr_dsl_ast_node_t* p, int ti, int cf, int dfp);
|
||||
static mlr_dsl_cst_statement_t* alloc_emit_lashed(mlr_dsl_ast_node_t* p, int ti, int cf, int dfp);
|
||||
static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* p, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_print(mlr_dsl_ast_node_t* p, int ti, int cf, char* print_terminator);
|
||||
static mlr_dsl_cst_statement_t* alloc_tee(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_emitf(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_emit(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf, int dfp);
|
||||
static mlr_dsl_cst_statement_t* alloc_emit_lashed(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf, int dfp);
|
||||
static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_print(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf, char* print_terminator);
|
||||
static file_output_mode_t file_output_mode_from_ast_node_type(mlr_dsl_ast_node_type_t mlr_dsl_ast_node_type);
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_if_item(
|
||||
mlr_dsl_ast_node_t* pexprnode,
|
||||
mlr_dsl_ast_node_t* plistnode,
|
||||
fmgr_t* pfmgr,
|
||||
int type_inferencing,
|
||||
int context_flags);
|
||||
|
||||
|
|
@ -62,8 +64,8 @@ static mlr_dsl_cst_statement_vararg_t* mlr_dsl_cst_statement_vararg_alloc(
|
|||
rval_evaluator_t* pemitf_arg_evaluator,
|
||||
sllv_t* punset_oosvar_keylist_evaluators);
|
||||
|
||||
static sllv_t* allocate_keylist_evaluators_from_oosvar_node(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags);
|
||||
static sllv_t* allocate_keylist_evaluators_from_oosvar_node(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags);
|
||||
|
||||
static void cst_statement_vararg_free(mlr_dsl_cst_statement_vararg_t* pvararg);
|
||||
|
||||
|
|
@ -249,6 +251,7 @@ mlr_dsl_cst_t* mlr_dsl_cst_alloc(mlr_dsl_ast_t* pnode, int type_inferencing) {
|
|||
pcst->pbegin_statements = sllv_alloc();
|
||||
pcst->pmain_statements = sllv_alloc();
|
||||
pcst->pend_statements = sllv_alloc();
|
||||
pcst->pfmgr = fmgr_alloc();
|
||||
mlr_dsl_ast_node_t* plistnode = NULL;
|
||||
for (sllve_t* pe = pnode->proot->pchildren->phead; pe != NULL; pe = pe->pnext) {
|
||||
mlr_dsl_ast_node_t* pnode = pe->pvvalue;
|
||||
|
|
@ -257,7 +260,7 @@ mlr_dsl_cst_t* mlr_dsl_cst_alloc(mlr_dsl_ast_t* pnode, int type_inferencing) {
|
|||
plistnode = get_list_for_block(pnode);
|
||||
for (sllve_t* pe = plistnode->pchildren->phead; pe != NULL; pe = pe->pnext) {
|
||||
mlr_dsl_ast_node_t* pchild = pe->pvvalue;
|
||||
sllv_append(pcst->pbegin_statements, alloc_cst_statement(pchild, type_inferencing,
|
||||
sllv_append(pcst->pbegin_statements, alloc_cst_statement(pchild, pcst->pfmgr, type_inferencing,
|
||||
context_flags | IN_BEGIN_OR_END));
|
||||
}
|
||||
break;
|
||||
|
|
@ -265,12 +268,12 @@ mlr_dsl_cst_t* mlr_dsl_cst_alloc(mlr_dsl_ast_t* pnode, int type_inferencing) {
|
|||
plistnode = get_list_for_block(pnode);
|
||||
for (sllve_t* pe = plistnode->pchildren->phead; pe != NULL; pe = pe->pnext) {
|
||||
mlr_dsl_ast_node_t* pchild = pe->pvvalue;
|
||||
sllv_append(pcst->pend_statements, alloc_cst_statement(pchild, type_inferencing,
|
||||
sllv_append(pcst->pend_statements, alloc_cst_statement(pchild, pcst->pfmgr, type_inferencing,
|
||||
context_flags | IN_BEGIN_OR_END));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
sllv_append(pcst->pmain_statements, alloc_cst_statement(pnode, type_inferencing,
|
||||
sllv_append(pcst->pmain_statements, alloc_cst_statement(pnode, pcst->pfmgr, type_inferencing,
|
||||
context_flags));
|
||||
break;
|
||||
}
|
||||
|
|
@ -340,7 +343,7 @@ void mlr_dsl_cst_free(mlr_dsl_cst_t* pcst) {
|
|||
// unset. Most right-hand sides are set up in rval_expr_evaluators.c so the context_flags are
|
||||
// passed through to there as well.
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr, int type_inferencing,
|
||||
int context_flags)
|
||||
{
|
||||
switch(pnode->type) {
|
||||
|
|
@ -355,23 +358,23 @@ static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, i
|
|||
break;
|
||||
|
||||
case MD_AST_NODE_TYPE_CONDITIONAL_BLOCK:
|
||||
return alloc_conditional_block(pnode, type_inferencing, context_flags);
|
||||
return alloc_conditional_block(pnode, pfmgr, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_IF_HEAD:
|
||||
return alloc_if_head(pnode, type_inferencing, context_flags);
|
||||
return alloc_if_head(pnode, pfmgr, type_inferencing, context_flags);
|
||||
break;
|
||||
|
||||
case MD_AST_NODE_TYPE_WHILE:
|
||||
return alloc_while(pnode, type_inferencing, context_flags | IN_BREAKABLE);
|
||||
return alloc_while(pnode, pfmgr, type_inferencing, context_flags | IN_BREAKABLE);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_DO_WHILE:
|
||||
return alloc_do_while(pnode, type_inferencing, context_flags | IN_BREAKABLE);
|
||||
return alloc_do_while(pnode, pfmgr, type_inferencing, context_flags | IN_BREAKABLE);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_FOR_SREC:
|
||||
return alloc_for_srec(pnode, type_inferencing, context_flags | IN_BREAKABLE | IN_BINDABLE);
|
||||
return alloc_for_srec(pnode, pfmgr, type_inferencing, context_flags | IN_BREAKABLE | IN_BINDABLE);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_FOR_OOSVAR:
|
||||
return alloc_for_oosvar(pnode, type_inferencing, context_flags | IN_BREAKABLE | IN_BINDABLE);
|
||||
return alloc_for_oosvar(pnode, pfmgr, type_inferencing, context_flags | IN_BREAKABLE | IN_BINDABLE);
|
||||
break;
|
||||
|
||||
case MD_AST_NODE_TYPE_BREAK:
|
||||
|
|
@ -380,7 +383,7 @@ static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, i
|
|||
MLR_GLOBALS.bargv0);
|
||||
exit(1);
|
||||
}
|
||||
return alloc_break(pnode, type_inferencing, context_flags);
|
||||
return alloc_break(pnode, pfmgr, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_CONTINUE:
|
||||
if (!(context_flags & IN_BREAKABLE)) {
|
||||
|
|
@ -388,7 +391,7 @@ static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, i
|
|||
MLR_GLOBALS.bargv0);
|
||||
exit(1);
|
||||
}
|
||||
return alloc_continue(pnode, type_inferencing, context_flags);
|
||||
return alloc_continue(pnode, pfmgr, type_inferencing, context_flags);
|
||||
break;
|
||||
|
||||
case MD_AST_NODE_TYPE_SREC_ASSIGNMENT:
|
||||
|
|
@ -397,7 +400,7 @@ static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, i
|
|||
MLR_GLOBALS.bargv0);
|
||||
exit(1);
|
||||
}
|
||||
return alloc_srec_assignment(pnode, type_inferencing, context_flags);
|
||||
return alloc_srec_assignment(pnode, pfmgr, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_INDIRECT_SREC_ASSIGNMENT:
|
||||
if (context_flags & IN_BEGIN_OR_END) {
|
||||
|
|
@ -405,10 +408,10 @@ static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, i
|
|||
MLR_GLOBALS.bargv0);
|
||||
exit(1);
|
||||
}
|
||||
return alloc_indirect_srec_assignment(pnode, type_inferencing, context_flags);
|
||||
return alloc_indirect_srec_assignment(pnode, pfmgr, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT:
|
||||
return alloc_oosvar_assignment(pnode, type_inferencing, context_flags);
|
||||
return alloc_oosvar_assignment(pnode, pfmgr, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_OOSVAR_FROM_FULL_SREC_ASSIGNMENT:
|
||||
if (context_flags & IN_BEGIN_OR_END) {
|
||||
|
|
@ -416,7 +419,7 @@ static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, i
|
|||
MLR_GLOBALS.bargv0);
|
||||
exit(1);
|
||||
}
|
||||
return alloc_oosvar_from_full_srec_assignment(pnode, type_inferencing, context_flags);
|
||||
return alloc_oosvar_from_full_srec_assignment(pnode, pfmgr, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_FULL_SREC_FROM_OOSVAR_ASSIGNMENT:
|
||||
if (context_flags & IN_BEGIN_OR_END) {
|
||||
|
|
@ -424,51 +427,51 @@ static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, i
|
|||
MLR_GLOBALS.bargv0);
|
||||
exit(1);
|
||||
}
|
||||
return alloc_full_srec_from_oosvar_assignment(pnode, type_inferencing, context_flags);
|
||||
return alloc_full_srec_from_oosvar_assignment(pnode, pfmgr, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_UNSET:
|
||||
return alloc_unset(pnode, type_inferencing, context_flags);
|
||||
return alloc_unset(pnode, pfmgr, type_inferencing, context_flags);
|
||||
break;
|
||||
|
||||
case MD_AST_NODE_TYPE_TEE:
|
||||
return alloc_tee(pnode, type_inferencing, context_flags);
|
||||
return alloc_tee(pnode, pfmgr, type_inferencing, context_flags);
|
||||
break;
|
||||
|
||||
case MD_AST_NODE_TYPE_EMITF:
|
||||
return alloc_emitf(pnode, type_inferencing, context_flags);
|
||||
return alloc_emitf(pnode, pfmgr, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_EMITP:
|
||||
return alloc_emit(pnode, type_inferencing, context_flags, TRUE);
|
||||
return alloc_emit(pnode, pfmgr, type_inferencing, context_flags, TRUE);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_EMIT:
|
||||
return alloc_emit(pnode, type_inferencing, context_flags, FALSE);
|
||||
return alloc_emit(pnode, pfmgr, type_inferencing, context_flags, FALSE);
|
||||
break;
|
||||
|
||||
case MD_AST_NODE_TYPE_EMITP_LASHED:
|
||||
return alloc_emit_lashed(pnode, type_inferencing, context_flags, TRUE);
|
||||
return alloc_emit_lashed(pnode, pfmgr, type_inferencing, context_flags, TRUE);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_EMIT_LASHED:
|
||||
return alloc_emit_lashed(pnode, type_inferencing, context_flags, FALSE);
|
||||
return alloc_emit_lashed(pnode, pfmgr, type_inferencing, context_flags, FALSE);
|
||||
break;
|
||||
|
||||
case MD_AST_NODE_TYPE_FILTER:
|
||||
return alloc_filter(pnode, type_inferencing, context_flags);
|
||||
return alloc_filter(pnode, pfmgr, type_inferencing, context_flags);
|
||||
break;
|
||||
|
||||
case MD_AST_NODE_TYPE_DUMP:
|
||||
return alloc_dump(pnode, type_inferencing, context_flags);
|
||||
return alloc_dump(pnode, pfmgr, type_inferencing, context_flags);
|
||||
break;
|
||||
|
||||
case MD_AST_NODE_TYPE_PRINT:
|
||||
return alloc_print(pnode, type_inferencing, context_flags, "\n");
|
||||
return alloc_print(pnode, pfmgr, type_inferencing, context_flags, "\n");
|
||||
break;
|
||||
|
||||
case MD_AST_NODE_TYPE_PRINTN:
|
||||
return alloc_print(pnode, type_inferencing, context_flags, "");
|
||||
return alloc_print(pnode, pfmgr, type_inferencing, context_flags, "");
|
||||
break;
|
||||
|
||||
default:
|
||||
return alloc_bare_boolean(pnode, type_inferencing, context_flags);
|
||||
return alloc_bare_boolean(pnode, pfmgr, type_inferencing, context_flags);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -508,8 +511,8 @@ static mlr_dsl_cst_statement_t* alloc_blank() {
|
|||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
static mlr_dsl_cst_statement_t* alloc_srec_assignment(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
static mlr_dsl_cst_statement_t* alloc_srec_assignment(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
|
|
@ -534,7 +537,7 @@ static mlr_dsl_cst_statement_t* alloc_srec_assignment(mlr_dsl_ast_node_t* pnode,
|
|||
|
||||
pstatement->pnode_handler = handle_srec_assignment;
|
||||
pstatement->srec_lhs_field_name = pleft->text;
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, type_inferencing, context_flags);
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, pfmgr, type_inferencing, context_flags);
|
||||
return pstatement;
|
||||
}
|
||||
|
||||
|
|
@ -547,8 +550,8 @@ static mlr_dsl_cst_statement_t* alloc_srec_assignment(mlr_dsl_ast_node_t* pnode,
|
|||
// text="x", type=string_literal.
|
||||
// text="1", type=strnum_literal.
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_indirect_srec_assignment(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
static mlr_dsl_cst_statement_t* alloc_indirect_srec_assignment(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
|
|
@ -562,14 +565,14 @@ static mlr_dsl_cst_statement_t* alloc_indirect_srec_assignment(mlr_dsl_ast_node_
|
|||
mlr_dsl_ast_node_t* pright = pnode->pchildren->phead->pnext->pvvalue;
|
||||
|
||||
pstatement->pnode_handler = handle_indirect_srec_assignment;
|
||||
pstatement->psrec_lhs_evaluator = rval_evaluator_alloc_from_ast(pleft, type_inferencing, context_flags);
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, type_inferencing, context_flags);
|
||||
pstatement->psrec_lhs_evaluator = rval_evaluator_alloc_from_ast(pleft, pfmgr, type_inferencing, context_flags);
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, pfmgr, type_inferencing, context_flags);
|
||||
return pstatement;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
static mlr_dsl_cst_statement_t* alloc_oosvar_assignment(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
static mlr_dsl_cst_statement_t* alloc_oosvar_assignment(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
|
|
@ -582,12 +585,12 @@ static mlr_dsl_cst_statement_t* alloc_oosvar_assignment(mlr_dsl_ast_node_t* pnod
|
|||
exit(1);
|
||||
}
|
||||
|
||||
sllv_t* poosvar_lhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pleft, type_inferencing,
|
||||
context_flags);
|
||||
sllv_t* poosvar_lhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pleft, pfmgr,
|
||||
type_inferencing, context_flags);
|
||||
|
||||
if (pleft->type == MD_AST_NODE_TYPE_OOSVAR_KEYLIST && pright->type == MD_AST_NODE_TYPE_OOSVAR_KEYLIST) {
|
||||
pstatement->pnode_handler = handle_oosvar_to_oosvar_assignment;
|
||||
pstatement->poosvar_rhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pright,
|
||||
pstatement->poosvar_rhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pright, pfmgr,
|
||||
type_inferencing, context_flags);
|
||||
} else {
|
||||
pstatement->pnode_handler = handle_oosvar_assignment;
|
||||
|
|
@ -595,14 +598,14 @@ static mlr_dsl_cst_statement_t* alloc_oosvar_assignment(mlr_dsl_ast_node_t* pnod
|
|||
}
|
||||
|
||||
pstatement->poosvar_lhs_keylist_evaluators = poosvar_lhs_keylist_evaluators;
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, type_inferencing, context_flags);
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, pfmgr, type_inferencing, context_flags);
|
||||
|
||||
return pstatement;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
static mlr_dsl_cst_statement_t* alloc_oosvar_from_full_srec_assignment(
|
||||
mlr_dsl_ast_node_t* pnode, int type_inferencing, int context_flags)
|
||||
mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr, int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
|
|
@ -621,13 +624,13 @@ static mlr_dsl_cst_statement_t* alloc_oosvar_from_full_srec_assignment(
|
|||
}
|
||||
|
||||
pstatement->pnode_handler = handle_oosvar_from_full_srec_assignment;
|
||||
pstatement->poosvar_lhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pleft,
|
||||
pstatement->poosvar_lhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pleft, pfmgr,
|
||||
type_inferencing, context_flags);
|
||||
return pstatement;
|
||||
}
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_full_srec_from_oosvar_assignment(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
static mlr_dsl_cst_statement_t* alloc_full_srec_from_oosvar_assignment(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
|
|
@ -646,13 +649,13 @@ static mlr_dsl_cst_statement_t* alloc_full_srec_from_oosvar_assignment(mlr_dsl_a
|
|||
}
|
||||
|
||||
pstatement->pnode_handler = handle_full_srec_from_oosvar_assignment;
|
||||
pstatement->poosvar_rhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pright,
|
||||
pstatement->poosvar_rhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pright, pfmgr,
|
||||
type_inferencing, context_flags);
|
||||
return pstatement;
|
||||
}
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
|
|
@ -698,7 +701,8 @@ static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* pnode, int type_
|
|||
}
|
||||
sllv_append(pstatement->pvarargs, mlr_dsl_cst_statement_vararg_alloc(
|
||||
NULL,
|
||||
rval_evaluator_alloc_from_ast(pnode->pchildren->phead->pvvalue, type_inferencing, context_flags),
|
||||
rval_evaluator_alloc_from_ast(pnode->pchildren->phead->pvvalue, pfmgr,
|
||||
type_inferencing, context_flags),
|
||||
NULL,
|
||||
NULL));
|
||||
|
||||
|
|
@ -707,7 +711,7 @@ static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* pnode, int type_
|
|||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
allocate_keylist_evaluators_from_oosvar_node(pnode, type_inferencing, context_flags)));
|
||||
allocate_keylist_evaluators_from_oosvar_node(pnode, pfmgr, type_inferencing, context_flags)));
|
||||
|
||||
} else {
|
||||
fprintf(stderr, "%s: internal coding error detected in file %s at line %d.\n",
|
||||
|
|
@ -719,8 +723,8 @@ static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* pnode, int type_
|
|||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
static mlr_dsl_cst_statement_t* alloc_while(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
static mlr_dsl_cst_statement_t* alloc_while(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
|
|
@ -732,19 +736,20 @@ static mlr_dsl_cst_statement_t* alloc_while(mlr_dsl_ast_node_t* pnode, int type_
|
|||
|
||||
for (sllve_t* pe = pright->pchildren->phead; pe != NULL; pe = pe->pnext) {
|
||||
mlr_dsl_ast_node_t* pbody_ast_node = pe->pvvalue;
|
||||
mlr_dsl_cst_statement_t *pstatement = alloc_cst_statement(pbody_ast_node, type_inferencing, context_flags);
|
||||
mlr_dsl_cst_statement_t *pstatement = alloc_cst_statement(pbody_ast_node, pfmgr,
|
||||
type_inferencing, context_flags);
|
||||
sllv_append(pblock_statements, pstatement);
|
||||
}
|
||||
|
||||
pstatement->pnode_handler = handle_while;
|
||||
pstatement->pblock_handler = handle_statement_list_with_break_continue;
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pleft, type_inferencing, context_flags);
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pleft, pfmgr, type_inferencing, context_flags);
|
||||
pstatement->pblock_statements = pblock_statements;
|
||||
return pstatement;
|
||||
}
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_do_while(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
static mlr_dsl_cst_statement_t* alloc_do_while(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
|
|
@ -756,13 +761,14 @@ static mlr_dsl_cst_statement_t* alloc_do_while(mlr_dsl_ast_node_t* pnode, int ty
|
|||
|
||||
for (sllve_t* pe = pleft->pchildren->phead; pe != NULL; pe = pe->pnext) {
|
||||
mlr_dsl_ast_node_t* pbody_ast_node = pe->pvvalue;
|
||||
mlr_dsl_cst_statement_t *pstatement = alloc_cst_statement(pbody_ast_node, type_inferencing, context_flags);
|
||||
mlr_dsl_cst_statement_t *pstatement = alloc_cst_statement(pbody_ast_node, pfmgr,
|
||||
type_inferencing, context_flags);
|
||||
sllv_append(pblock_statements, pstatement);
|
||||
}
|
||||
|
||||
pstatement->pnode_handler = handle_do_while;
|
||||
pstatement->pblock_handler = handle_statement_list_with_break_continue;
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, type_inferencing, context_flags);
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, pfmgr, type_inferencing, context_flags);
|
||||
pstatement->pblock_statements = pblock_statements;
|
||||
return pstatement;
|
||||
}
|
||||
|
|
@ -783,8 +789,8 @@ static mlr_dsl_cst_statement_t* alloc_do_while(mlr_dsl_ast_node_t* pnode, int ty
|
|||
// text="y", type=field_name.
|
||||
// text="2", type=strnum_literal.
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_for_srec(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
static mlr_dsl_cst_statement_t* alloc_for_srec(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
|
|
@ -807,7 +813,7 @@ static mlr_dsl_cst_statement_t* alloc_for_srec(mlr_dsl_ast_node_t* pnode, int ty
|
|||
sllv_t* pblock_statements = sllv_alloc();
|
||||
for (sllve_t* pe = pright->pchildren->phead; pe != NULL; pe = pe->pnext) {
|
||||
mlr_dsl_ast_node_t* pbody_ast_node = pe->pvvalue;
|
||||
sllv_append(pblock_statements, alloc_cst_statement(pbody_ast_node, type_inferencing, context_flags));
|
||||
sllv_append(pblock_statements, alloc_cst_statement(pbody_ast_node, pfmgr, type_inferencing, context_flags));
|
||||
}
|
||||
|
||||
pstatement->pnode_handler = handle_for_srec;
|
||||
|
|
@ -851,8 +857,8 @@ static mlr_dsl_cst_statement_t* alloc_for_srec(mlr_dsl_ast_node_t* pnode, int ty
|
|||
// text="8", type=field_name.
|
||||
// text="9", type=strnum_literal.
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_for_oosvar(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
static mlr_dsl_cst_statement_t* alloc_for_oosvar(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
|
|
@ -900,12 +906,12 @@ static mlr_dsl_cst_statement_t* alloc_for_oosvar(mlr_dsl_ast_node_t* pnode, int
|
|||
hss_free(pnameset);
|
||||
|
||||
pstatement->poosvar_lhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(
|
||||
pmiddle, type_inferencing, context_flags);
|
||||
pmiddle, pfmgr, type_inferencing, context_flags);
|
||||
|
||||
sllv_t* pblock_statements = sllv_alloc();
|
||||
for (sllve_t* pe = pright->pchildren->phead; pe != NULL; pe = pe->pnext) {
|
||||
mlr_dsl_ast_node_t* pbody_ast_node = pe->pvvalue;
|
||||
sllv_append(pblock_statements, alloc_cst_statement(pbody_ast_node, type_inferencing, context_flags));
|
||||
sllv_append(pblock_statements, alloc_cst_statement(pbody_ast_node, pfmgr, type_inferencing, context_flags));
|
||||
}
|
||||
pstatement->pblock_statements = pblock_statements;
|
||||
pstatement->pbound_variables = lhmsmv_alloc();
|
||||
|
|
@ -916,16 +922,16 @@ static mlr_dsl_cst_statement_t* alloc_for_oosvar(mlr_dsl_ast_node_t* pnode, int
|
|||
return pstatement;
|
||||
}
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_break(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
static mlr_dsl_cst_statement_t* alloc_break(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
pstatement->pnode_handler = handle_break;
|
||||
return pstatement;
|
||||
}
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_continue(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
static mlr_dsl_cst_statement_t* alloc_continue(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
pstatement->pnode_handler = handle_continue;
|
||||
|
|
@ -933,7 +939,7 @@ static mlr_dsl_cst_statement_t* alloc_continue(mlr_dsl_ast_node_t* pnode, int ty
|
|||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
static mlr_dsl_cst_statement_t* alloc_conditional_block(mlr_dsl_ast_node_t* pnode,
|
||||
static mlr_dsl_cst_statement_t* alloc_conditional_block(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
|
@ -946,7 +952,8 @@ static mlr_dsl_cst_statement_t* alloc_conditional_block(mlr_dsl_ast_node_t* pnod
|
|||
mlr_dsl_ast_node_t* pright = pnode->pchildren->phead->pnext->pvvalue;
|
||||
for (sllve_t* pe = pright->pchildren->phead; pe != NULL; pe = pe->pnext) {
|
||||
mlr_dsl_ast_node_t* pbody_ast_node = pe->pvvalue;
|
||||
mlr_dsl_cst_statement_t *pstatement = alloc_cst_statement(pbody_ast_node, type_inferencing, context_flags);
|
||||
mlr_dsl_cst_statement_t *pstatement = alloc_cst_statement(pbody_ast_node, pfmgr,
|
||||
type_inferencing, context_flags);
|
||||
sllv_append(pblock_statements, pstatement);
|
||||
}
|
||||
|
||||
|
|
@ -954,7 +961,7 @@ static mlr_dsl_cst_statement_t* alloc_conditional_block(mlr_dsl_ast_node_t* pnod
|
|||
pstatement->pblock_handler = (context_flags & IN_BREAKABLE)
|
||||
? handle_statement_list_with_break_continue
|
||||
: mlr_dsl_cst_handle_statement_list;
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pleft, type_inferencing, context_flags);
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pleft, pfmgr, type_inferencing, context_flags);
|
||||
pstatement->pblock_statements = pblock_statements;
|
||||
return pstatement;
|
||||
}
|
||||
|
|
@ -1006,8 +1013,8 @@ static mlr_dsl_cst_statement_t* alloc_conditional_block(mlr_dsl_ast_node_t* pnod
|
|||
// x (field_name).
|
||||
// 16 (strnum_literal).
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_if_head(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
static mlr_dsl_cst_statement_t* alloc_if_head(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
|
|
@ -1030,7 +1037,7 @@ static mlr_dsl_cst_statement_t* alloc_if_head(mlr_dsl_ast_node_t* pnode, int typ
|
|||
}
|
||||
|
||||
sllv_append(pif_chain_statements, alloc_if_item(pexprnode, plistnode,
|
||||
type_inferencing, context_flags));
|
||||
pfmgr, type_inferencing, context_flags));
|
||||
}
|
||||
|
||||
pstatement->pnode_handler = handle_if_head;
|
||||
|
|
@ -1042,7 +1049,7 @@ static mlr_dsl_cst_statement_t* alloc_if_head(mlr_dsl_ast_node_t* pnode, int typ
|
|||
}
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_if_item(mlr_dsl_ast_node_t* pexprnode,
|
||||
mlr_dsl_ast_node_t* plistnode, int type_inferencing, int context_flags)
|
||||
mlr_dsl_ast_node_t* plistnode, fmgr_t* pfmgr, int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
|
|
@ -1050,45 +1057,47 @@ static mlr_dsl_cst_statement_t* alloc_if_item(mlr_dsl_ast_node_t* pexprnode,
|
|||
|
||||
for (sllve_t* pe = plistnode->pchildren->phead; pe != NULL; pe = pe->pnext) {
|
||||
mlr_dsl_ast_node_t* pbody_ast_node = pe->pvvalue;
|
||||
mlr_dsl_cst_statement_t *pstatement = alloc_cst_statement(pbody_ast_node, type_inferencing, context_flags);
|
||||
mlr_dsl_cst_statement_t *pstatement = alloc_cst_statement(pbody_ast_node, pfmgr,
|
||||
type_inferencing, context_flags);
|
||||
sllv_append(pblock_statements, pstatement);
|
||||
}
|
||||
|
||||
pstatement->pnode_handler = NULL; // handled by the containing if-head evaluator
|
||||
pstatement->prhs_evaluator = pexprnode != NULL
|
||||
? rval_evaluator_alloc_from_ast(pexprnode, type_inferencing, context_flags) // if-statement or elif-statement
|
||||
? rval_evaluator_alloc_from_ast(pexprnode, pfmgr,
|
||||
type_inferencing, context_flags) // if-statement or elif-statement
|
||||
: rval_evaluator_alloc_from_boolean(TRUE); // else-statement
|
||||
pstatement->pblock_statements = pblock_statements;
|
||||
return pstatement;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
static mlr_dsl_cst_statement_t* alloc_filter(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
static mlr_dsl_cst_statement_t* alloc_filter(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
mlr_dsl_ast_node_t* pchild = pnode->pchildren->phead->pvvalue;
|
||||
|
||||
pstatement->pnode_handler = handle_filter;
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pchild, type_inferencing, context_flags);
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pchild, pfmgr, type_inferencing, context_flags);
|
||||
return pstatement;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
static mlr_dsl_cst_statement_t* alloc_bare_boolean(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
static mlr_dsl_cst_statement_t* alloc_bare_boolean(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
pstatement->pnode_handler = handle_bare_boolean;
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pnode, type_inferencing, context_flags);
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pnode, pfmgr, type_inferencing, context_flags);
|
||||
return pstatement;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
static mlr_dsl_cst_statement_t* alloc_tee(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
static mlr_dsl_cst_statement_t* alloc_tee(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
|
|
@ -1099,7 +1108,7 @@ static mlr_dsl_cst_statement_t* alloc_tee(mlr_dsl_ast_node_t* pnode, int type_in
|
|||
pstatement->pnode_handler = handle_tee_to_stdfp;
|
||||
pstatement->stdfp = (pfilename_node->type == MD_AST_NODE_TYPE_STDOUT) ? stdout : stderr;
|
||||
} else {
|
||||
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node,
|
||||
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node, pfmgr,
|
||||
type_inferencing, context_flags);
|
||||
pstatement->file_output_mode = file_output_mode_from_ast_node_type(poutput_node->type);
|
||||
pstatement->pnode_handler = handle_tee_to_file;
|
||||
|
|
@ -1109,7 +1118,9 @@ static mlr_dsl_cst_statement_t* alloc_tee(mlr_dsl_ast_node_t* pnode, int type_in
|
|||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
static mlr_dsl_cst_statement_t* alloc_emitf(mlr_dsl_ast_node_t* pnode, int type_inferencing, int context_flags) {
|
||||
static mlr_dsl_cst_statement_t* alloc_emitf(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
mlr_dsl_ast_node_t* pnamesnode = pnode->pchildren->phead->pvvalue;
|
||||
|
|
@ -1123,7 +1134,7 @@ static mlr_dsl_cst_statement_t* alloc_emitf(mlr_dsl_ast_node_t* pnode, int type_
|
|||
sllv_append(pstatement->pvarargs, mlr_dsl_cst_statement_vararg_alloc(
|
||||
pchild->text,
|
||||
NULL,
|
||||
rval_evaluator_alloc_from_ast(pwalker, type_inferencing, context_flags),
|
||||
rval_evaluator_alloc_from_ast(pwalker, pfmgr, type_inferencing, context_flags),
|
||||
NULL));
|
||||
}
|
||||
|
||||
|
|
@ -1139,7 +1150,7 @@ static mlr_dsl_cst_statement_t* alloc_emitf(mlr_dsl_ast_node_t* pnode, int type_
|
|||
pstatement->pnode_handler = handle_emitf_to_stdfp;
|
||||
pstatement->stdfp = (pfilename_node->type == MD_AST_NODE_TYPE_STDOUT) ? stdout : stderr;
|
||||
} else {
|
||||
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node,
|
||||
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node, pfmgr,
|
||||
type_inferencing, context_flags);
|
||||
pstatement->file_output_mode = file_output_mode_from_ast_node_type(poutput_node->type);
|
||||
pstatement->pnode_handler = handle_emitf_to_file;
|
||||
|
|
@ -1176,8 +1187,8 @@ static mlr_dsl_cst_statement_t* alloc_emitf(mlr_dsl_ast_node_t* pnode, int type_
|
|||
// text="z", type=strnum_literal.
|
||||
// text="stream", type=stream:
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_emit(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags, int do_full_prefixing)
|
||||
static mlr_dsl_cst_statement_t* alloc_emit(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags, int do_full_prefixing)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
|
|
@ -1198,7 +1209,7 @@ static mlr_dsl_cst_statement_t* alloc_emit(mlr_dsl_ast_node_t* pnode, int type_i
|
|||
for (sllve_t* pe = pnamelist_node->pchildren->phead; pe != NULL; pe = pe->pnext) {
|
||||
mlr_dsl_ast_node_t* pkeynode = pe->pvvalue;
|
||||
sllv_append(pemit_oosvar_namelist_evaluators,
|
||||
rval_evaluator_alloc_from_ast(pkeynode, type_inferencing, context_flags));
|
||||
rval_evaluator_alloc_from_ast(pkeynode, pfmgr, type_inferencing, context_flags));
|
||||
}
|
||||
}
|
||||
pstatement->pemit_oosvar_namelist_evaluators = pemit_oosvar_namelist_evaluators;
|
||||
|
|
@ -1206,7 +1217,7 @@ static mlr_dsl_cst_statement_t* alloc_emit(mlr_dsl_ast_node_t* pnode, int type_i
|
|||
} else if (pkeylist_node->type == MD_AST_NODE_TYPE_OOSVAR_KEYLIST) {
|
||||
|
||||
pstatement->pemit_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pkeylist_node,
|
||||
type_inferencing, context_flags);
|
||||
pfmgr, type_inferencing, context_flags);
|
||||
|
||||
sllv_t* pemit_oosvar_namelist_evaluators = sllv_alloc();
|
||||
if (pemit_node->pchildren->length == 2) {
|
||||
|
|
@ -1214,7 +1225,7 @@ static mlr_dsl_cst_statement_t* alloc_emit(mlr_dsl_ast_node_t* pnode, int type_i
|
|||
for (sllve_t* pe = pnamelist_node->pchildren->phead; pe != NULL; pe = pe->pnext) {
|
||||
mlr_dsl_ast_node_t* pkeynode = pe->pvvalue;
|
||||
sllv_append(pemit_oosvar_namelist_evaluators,
|
||||
rval_evaluator_alloc_from_ast(pkeynode, type_inferencing, context_flags));
|
||||
rval_evaluator_alloc_from_ast(pkeynode, pfmgr, type_inferencing, context_flags));
|
||||
}
|
||||
}
|
||||
pstatement->pemit_oosvar_namelist_evaluators = pemit_oosvar_namelist_evaluators;
|
||||
|
|
@ -1237,7 +1248,7 @@ static mlr_dsl_cst_statement_t* alloc_emit(mlr_dsl_ast_node_t* pnode, int type_i
|
|||
pstatement->pnode_handler = output_all ? handle_emit_all_to_stdfp : handle_emit_to_stdfp;
|
||||
pstatement->stdfp = (pfilename_node->type == MD_AST_NODE_TYPE_STDOUT) ? stdout : stderr;
|
||||
} else {
|
||||
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node,
|
||||
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node, pfmgr,
|
||||
type_inferencing, context_flags);
|
||||
pstatement->file_output_mode = file_output_mode_from_ast_node_type(poutput_node->type);
|
||||
pstatement->pnode_handler = output_all ? handle_emit_all_to_file : handle_emit_to_file;
|
||||
|
|
@ -1247,8 +1258,8 @@ static mlr_dsl_cst_statement_t* alloc_emit(mlr_dsl_ast_node_t* pnode, int type_i
|
|||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
static mlr_dsl_cst_statement_t* alloc_emit_lashed(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags, int do_full_prefixing)
|
||||
static mlr_dsl_cst_statement_t* alloc_emit_lashed(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags, int do_full_prefixing)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
|
|
@ -1264,7 +1275,7 @@ static mlr_dsl_cst_statement_t* alloc_emit_lashed(mlr_dsl_ast_node_t* pnode, int
|
|||
for (sllve_t* pe = pkeylists_node->pchildren->phead; pe != NULL; pe = pe->pnext, i++) {
|
||||
mlr_dsl_ast_node_t* pkeylist_node = pe->pvvalue;
|
||||
pstatement->ppemit_keylist_evaluators[i] = allocate_keylist_evaluators_from_oosvar_node(pkeylist_node,
|
||||
type_inferencing, context_flags);
|
||||
pfmgr, type_inferencing, context_flags);
|
||||
}
|
||||
|
||||
sllv_t* pemit_oosvar_namelist_evaluators = sllv_alloc();
|
||||
|
|
@ -1273,7 +1284,7 @@ static mlr_dsl_cst_statement_t* alloc_emit_lashed(mlr_dsl_ast_node_t* pnode, int
|
|||
for (sllve_t* pe = pnamelist_node->pchildren->phead; pe != NULL; pe = pe->pnext) {
|
||||
mlr_dsl_ast_node_t* pkeynode = pe->pvvalue;
|
||||
sllv_append(pemit_oosvar_namelist_evaluators,
|
||||
rval_evaluator_alloc_from_ast(pkeynode, type_inferencing, context_flags));
|
||||
rval_evaluator_alloc_from_ast(pkeynode, pfmgr, type_inferencing, context_flags));
|
||||
}
|
||||
}
|
||||
pstatement->pemit_oosvar_namelist_evaluators = pemit_oosvar_namelist_evaluators;
|
||||
|
|
@ -1290,7 +1301,7 @@ static mlr_dsl_cst_statement_t* alloc_emit_lashed(mlr_dsl_ast_node_t* pnode, int
|
|||
pstatement->pnode_handler = handle_emit_lashed_to_stdfp;
|
||||
pstatement->stdfp = (pfilename_node->type == MD_AST_NODE_TYPE_STDOUT) ? stdout : stderr;
|
||||
} else {
|
||||
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node,
|
||||
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node, pfmgr,
|
||||
type_inferencing, context_flags);
|
||||
pstatement->file_output_mode = file_output_mode_from_ast_node_type(poutput_node->type);
|
||||
pstatement->pnode_handler = handle_emit_lashed_to_file;
|
||||
|
|
@ -1300,8 +1311,8 @@ static mlr_dsl_cst_statement_t* alloc_emit_lashed(mlr_dsl_ast_node_t* pnode, int
|
|||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
|
|
@ -1314,7 +1325,7 @@ static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* pnode, int type_i
|
|||
pstatement->pnode_handler = handle_dump;
|
||||
pstatement->stdfp = stderr;
|
||||
} else {
|
||||
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node,
|
||||
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node, pfmgr,
|
||||
type_inferencing, context_flags);
|
||||
pstatement->file_output_mode = file_output_mode_from_ast_node_type(poutput_node->type);
|
||||
pstatement->pmulti_out = multi_out_alloc();
|
||||
|
|
@ -1325,8 +1336,8 @@ static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* pnode, int type_i
|
|||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
static mlr_dsl_cst_statement_t* alloc_print(mlr_dsl_ast_node_t* pnode, int type_inferencing, int context_flags,
|
||||
char* print_terminator)
|
||||
static mlr_dsl_cst_statement_t* alloc_print(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags, char* print_terminator)
|
||||
{
|
||||
if ((pnode->pchildren == NULL) || (pnode->pchildren->length != 2)) {
|
||||
fprintf(stderr, "%s: internal coding error detected in file %s at line %d.\n",
|
||||
|
|
@ -1335,7 +1346,7 @@ static mlr_dsl_cst_statement_t* alloc_print(mlr_dsl_ast_node_t* pnode, int type_
|
|||
}
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
mlr_dsl_ast_node_t* pvalue_node = pnode->pchildren->phead->pvvalue;
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pvalue_node, type_inferencing, context_flags);
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pvalue_node, pfmgr, type_inferencing, context_flags);
|
||||
pstatement->print_terminator = print_terminator;
|
||||
|
||||
mlr_dsl_ast_node_t* poutput_node = pnode->pchildren->phead->pnext->pvvalue;
|
||||
|
|
@ -1345,7 +1356,7 @@ static mlr_dsl_cst_statement_t* alloc_print(mlr_dsl_ast_node_t* pnode, int type_
|
|||
} else if (pfilename_node->type == MD_AST_NODE_TYPE_STDERR) {
|
||||
pstatement->stdfp = stderr;
|
||||
} else {
|
||||
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node,
|
||||
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node, pfmgr,
|
||||
type_inferencing, context_flags);
|
||||
pstatement->file_output_mode = file_output_mode_from_ast_node_type(poutput_node->type);
|
||||
pstatement->pmulti_out = multi_out_alloc();
|
||||
|
|
@ -2574,8 +2585,8 @@ static void handle_print(
|
|||
// text="stream", type=stream:
|
||||
|
||||
// pnode is input; pkeylist_evaluators is appended to.
|
||||
static sllv_t* allocate_keylist_evaluators_from_oosvar_node(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
static sllv_t* allocate_keylist_evaluators_from_oosvar_node(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
sllv_t* pkeylist_evaluators = sllv_alloc();
|
||||
|
||||
|
|
@ -2584,7 +2595,8 @@ static sllv_t* allocate_keylist_evaluators_from_oosvar_node(mlr_dsl_ast_node_t*
|
|||
if (pkeynode->type == MD_AST_NODE_TYPE_STRING_LITERAL) {
|
||||
sllv_append(pkeylist_evaluators, rval_evaluator_alloc_from_string(pkeynode->text));
|
||||
} else {
|
||||
sllv_append(pkeylist_evaluators, rval_evaluator_alloc_from_ast(pkeynode, type_inferencing, context_flags));
|
||||
sllv_append(pkeylist_evaluators, rval_evaluator_alloc_from_ast(pkeynode, pfmgr,
|
||||
type_inferencing, context_flags));
|
||||
}
|
||||
}
|
||||
return pkeylist_evaluators;
|
||||
|
|
|
|||
|
|
@ -3,10 +3,11 @@
|
|||
|
||||
#include "cli/mlrcli.h"
|
||||
#include "containers/mlr_dsl_ast.h"
|
||||
#include "rval_evaluators.h"
|
||||
#include "containers/lhmsmv.h"
|
||||
#include "containers/bind_stack.h"
|
||||
#include "containers/loop_stack.h"
|
||||
#include "mapping/rval_evaluators.h"
|
||||
#include "mapping/function_manager.h"
|
||||
#include "output/multi_out.h"
|
||||
#include "output/multi_lrec_writer.h"
|
||||
|
||||
|
|
@ -168,6 +169,9 @@ typedef struct _mlr_dsl_cst_t {
|
|||
sllv_t* pbegin_statements;
|
||||
sllv_t* pmain_statements;
|
||||
sllv_t* pend_statements;
|
||||
|
||||
// Function manager for built-in functions as well as user-defined functions (which are CST-specific).
|
||||
fmgr_t* pfmgr;
|
||||
} mlr_dsl_cst_t;
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -35,15 +35,15 @@
|
|||
// rval_expr_evaluators.c
|
||||
|
||||
// Topmost function:
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_ast(mlr_dsl_ast_node_t* past, int type_inferencing, int context_flags);
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_ast_aux(mlr_dsl_ast_node_t* pnode, int type_inferencing, int context_flags,
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_ast(mlr_dsl_ast_node_t* past, fmgr_t* pfmgr, int type_inferencing, int context_flags);
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_ast_aux(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr, int type_inferencing, int context_flags,
|
||||
function_lookup_t* fcn_lookup_table);
|
||||
|
||||
// Next level:
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_field_name(char* field_name, int type_inferencing);
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_indirect_field_name(mlr_dsl_ast_node_t* pnode,
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_indirect_field_name(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags);
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_oosvar_keylist(mlr_dsl_ast_node_t* pnode,
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_oosvar_keylist(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags);
|
||||
|
||||
// This is used for evaluating strings and numbers in literal expressions, e.g. '$x = "abc"'
|
||||
|
|
@ -60,7 +60,7 @@ rval_evaluator_t* rval_evaluator_alloc_from_string(char* string);
|
|||
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_boolean_literal(char* string);
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_boolean(int boolval);
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_environment(mlr_dsl_ast_node_t* pnode,
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_environment(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags);
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_NF();
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_NR();
|
||||
|
|
|
|||
|
|
@ -20,11 +20,12 @@
|
|||
// there, and (b) because we get far better control over error messages here (vs. 'syntax error').
|
||||
// The context flags are used as the CST is built from the AST, for CST-build-time validation.
|
||||
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_ast(mlr_dsl_ast_node_t* pnode, int type_inferencing, int context_flags) {
|
||||
return rval_evaluator_alloc_from_ast_aux(pnode, type_inferencing, context_flags, FUNCTION_LOOKUP_TABLE);
|
||||
// xxx elim aux
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_ast(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr, int type_inferencing, int context_flags) {
|
||||
return rval_evaluator_alloc_from_ast_aux(pnode, pfmgr, type_inferencing, context_flags, FUNCTION_LOOKUP_TABLE);
|
||||
}
|
||||
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_ast_aux(mlr_dsl_ast_node_t* pnode,
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_ast_aux(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags, function_lookup_t* fcn_lookup_table)
|
||||
{
|
||||
if (pnode->pchildren == NULL) { // leaf node
|
||||
|
|
@ -70,7 +71,7 @@ rval_evaluator_t* rval_evaluator_alloc_from_ast_aux(mlr_dsl_ast_node_t* pnode,
|
|||
MLR_GLOBALS.bargv0);
|
||||
exit(1);
|
||||
}
|
||||
return rval_evaluator_alloc_from_indirect_field_name(pnode->pchildren->phead->pvvalue,
|
||||
return rval_evaluator_alloc_from_indirect_field_name(pnode->pchildren->phead->pvvalue, pfmgr,
|
||||
type_inferencing, context_flags);
|
||||
|
||||
} else if (pnode->type == MD_AST_NODE_TYPE_OOSVAR_KEYLIST) {
|
||||
|
|
@ -79,15 +80,15 @@ rval_evaluator_t* rval_evaluator_alloc_from_ast_aux(mlr_dsl_ast_node_t* pnode,
|
|||
MLR_GLOBALS.bargv0, MLR_GLOBALS.bargv0);
|
||||
exit(1);
|
||||
}
|
||||
return rval_evaluator_alloc_from_oosvar_keylist(pnode, type_inferencing, context_flags);
|
||||
return rval_evaluator_alloc_from_oosvar_keylist(pnode, pfmgr, type_inferencing, context_flags);
|
||||
|
||||
} else if (pnode->type == MD_AST_NODE_TYPE_ENV) {
|
||||
return rval_evaluator_alloc_from_environment(pnode, type_inferencing, context_flags);
|
||||
return rval_evaluator_alloc_from_environment(pnode, pfmgr, type_inferencing, context_flags);
|
||||
|
||||
} else {
|
||||
|
||||
return fmgr_alloc_from_operator_or_function(NULL, pnode, type_inferencing, context_flags,
|
||||
fcn_lookup_table); // xxx rework ptr args
|
||||
return fmgr_alloc_from_operator_or_function(pfmgr, pnode, type_inferencing, context_flags,
|
||||
fcn_lookup_table); // xxx elim tbl arg
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -215,13 +216,13 @@ static void rval_evaluator_indirect_field_name_free(rval_evaluator_t* pevaluator
|
|||
free(pevaluator);
|
||||
}
|
||||
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_indirect_field_name(mlr_dsl_ast_node_t* pnamenode,
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_indirect_field_name(mlr_dsl_ast_node_t* pnamenode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
rval_evaluator_indirect_field_name_state_t* pstate = mlr_malloc_or_die(
|
||||
sizeof(rval_evaluator_indirect_field_name_state_t));
|
||||
|
||||
pstate->pname_evaluator = rval_evaluator_alloc_from_ast(pnamenode, type_inferencing, context_flags);
|
||||
pstate->pname_evaluator = rval_evaluator_alloc_from_ast(pnamenode, pfmgr, type_inferencing, context_flags);
|
||||
|
||||
rval_evaluator_t* pevaluator = mlr_malloc_or_die(sizeof(rval_evaluator_t));
|
||||
pevaluator->pvstate = pstate;
|
||||
|
|
@ -301,7 +302,7 @@ static void rval_evaluator_oosvar_keylist_free(rval_evaluator_t* pevaluator) {
|
|||
// oosvar_keylist (oosvar_keylist):
|
||||
// 5 (string_literal).
|
||||
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_oosvar_keylist(mlr_dsl_ast_node_t* pnode,
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_oosvar_keylist(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
rval_evaluator_oosvar_keylist_state_t* pstate = mlr_malloc_or_die(
|
||||
|
|
@ -314,7 +315,8 @@ rval_evaluator_t* rval_evaluator_alloc_from_oosvar_keylist(mlr_dsl_ast_node_t* p
|
|||
if (pkeynode->type == MD_AST_NODE_TYPE_STRING_LITERAL) {
|
||||
sllv_append(pkeylist_evaluators, rval_evaluator_alloc_from_string(pkeynode->text));
|
||||
} else {
|
||||
sllv_append(pkeylist_evaluators, rval_evaluator_alloc_from_ast(pkeynode, type_inferencing, context_flags));
|
||||
sllv_append(pkeylist_evaluators, rval_evaluator_alloc_from_ast(pkeynode, pfmgr,
|
||||
type_inferencing, context_flags));
|
||||
}
|
||||
}
|
||||
pstate->poosvar_rhs_keylist_evaluators = pkeylist_evaluators;
|
||||
|
|
@ -547,7 +549,7 @@ static void rval_evaluator_environment_free(rval_evaluator_t* pevaluator) {
|
|||
free(pevaluator);
|
||||
}
|
||||
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_environment(mlr_dsl_ast_node_t* pnode,
|
||||
rval_evaluator_t* rval_evaluator_alloc_from_environment(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
rval_evaluator_environment_state_t* pstate = mlr_malloc_or_die(sizeof(rval_evaluator_environment_state_t));
|
||||
|
|
@ -555,7 +557,7 @@ rval_evaluator_t* rval_evaluator_alloc_from_environment(mlr_dsl_ast_node_t* pnod
|
|||
|
||||
mlr_dsl_ast_node_t* pnamenode = pnode->pchildren->phead->pnext->pvvalue;
|
||||
|
||||
pstate->pname_evaluator = rval_evaluator_alloc_from_ast(pnamenode, type_inferencing, context_flags);
|
||||
pstate->pname_evaluator = rval_evaluator_alloc_from_ast(pnamenode, pfmgr, type_inferencing, context_flags);
|
||||
pevaluator->pprocess_func = rval_evaluator_environment_func;
|
||||
pevaluator->pfree_func = rval_evaluator_environment_free;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
#include "lib/mlr_globals.h"
|
||||
#include "lib/minunit.h"
|
||||
#include "mapping/rval_evaluators.h"
|
||||
#include "mapping/function_manager.h"
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
int tests_run = 0;
|
||||
|
|
@ -148,7 +149,9 @@ static char * test_numbers() {
|
|||
mlr_dsl_ast_node_t* p2logxnode = mlr_dsl_ast_node_alloc_binary("*", MD_AST_NODE_TYPE_OPERATOR,
|
||||
p2node, plogxnode);
|
||||
|
||||
rval_evaluator_t* pastr = rval_evaluator_alloc_from_ast(p2logxnode, TYPE_INFER_STRING_FLOAT_INT, 0);
|
||||
fmgr_t* pfmgr = fmgr_alloc();
|
||||
rval_evaluator_t* pastr = rval_evaluator_alloc_from_ast(p2logxnode, pfmgr, TYPE_INFER_STRING_FLOAT_INT, 0);
|
||||
fmgr_free(pfmgr);
|
||||
|
||||
lrec_t* prec = lrec_unbacked_alloc();
|
||||
lhmsmv_t* ptyped_overlay = lhmsmv_alloc();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue