mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-22 15:37:59 +00:00
scope-validation iterate
This commit is contained in:
parent
f0bf067470
commit
0060d39ab6
3 changed files with 126 additions and 85 deletions
|
|
@ -2,32 +2,45 @@
|
|||
#include "lib/mlrutil.h"
|
||||
#include "mlr_dsl_cst.h"
|
||||
|
||||
// The grammar permits certain statements which are syntactically invalid, (a) because it's awkward to handle
|
||||
// there, and (b) because we get far better control over error messages here (vs. 'syntax error').
|
||||
// The following flags are used as the CST is built from the AST for CST-build-time validation.
|
||||
#define IN_BINDABLE 0x0100 // boundvars are only OK inside a bindable, e.g. (recursively) inside a for-loop
|
||||
#define IN_BREAKABLE 0x0200 // break/continue are only OK (recursively) inside for/while/do-while
|
||||
#define IN_BEGIN_OR_END 0x0400 // $stuff is not OK (recursively) inside begin/end
|
||||
|
||||
static mlr_dsl_ast_node_t* get_list_for_block(mlr_dsl_ast_node_t* pnode);
|
||||
|
||||
static mlr_dsl_cst_statement_t* cst_statement_alloc(mlr_dsl_ast_node_t* past, int type_inferencing, int begin_end_only);
|
||||
static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* past, int type_inferencing, int begin_end_only);
|
||||
static mlr_dsl_cst_statement_t* alloc_blank();
|
||||
static void cst_statement_free(mlr_dsl_cst_statement_t* pstatement);
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_srec_assignment(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
static mlr_dsl_cst_statement_t* alloc_indirect_srec_assignment(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
static mlr_dsl_cst_statement_t* alloc_oosvar_assignment(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
static mlr_dsl_cst_statement_t* alloc_oosvar_from_full_srec_assignment(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
static mlr_dsl_cst_statement_t* alloc_full_srec_from_oosvar_assignment(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
static mlr_dsl_cst_statement_t* alloc_emitf(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
static mlr_dsl_cst_statement_t* alloc_emit_or_emitp(mlr_dsl_ast_node_t* past, int type_inferencing, int do_full_prefixing);
|
||||
static mlr_dsl_cst_statement_t* alloc_conditional_block(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
static mlr_dsl_cst_statement_t* alloc_while(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
static mlr_dsl_cst_statement_t* alloc_do_while(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
static mlr_dsl_cst_statement_t* alloc_for_srec(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
static mlr_dsl_cst_statement_t* alloc_for_oosvar(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
static mlr_dsl_cst_statement_t* alloc_if_head(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
static mlr_dsl_cst_statement_t* alloc_filter(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
static mlr_dsl_cst_statement_t* alloc_bare_boolean(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
// ti = type_inferencing
|
||||
// cf = context_flags
|
||||
static mlr_dsl_cst_statement_t* alloc_srec_assignment(mlr_dsl_ast_node_t* past, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_indirect_srec_assignment(mlr_dsl_ast_node_t* past, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_oosvar_assignment(mlr_dsl_ast_node_t* past, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_oosvar_from_full_srec_assignment(mlr_dsl_ast_node_t* past, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_full_srec_from_oosvar_assignment(mlr_dsl_ast_node_t* past, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* past, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_emitf(mlr_dsl_ast_node_t* past, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_emit_or_emitp(mlr_dsl_ast_node_t* past, int ti,
|
||||
int do_full_prefixing, int context_flags);
|
||||
static mlr_dsl_cst_statement_t* alloc_conditional_block(mlr_dsl_ast_node_t* past, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_while(mlr_dsl_ast_node_t* past, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_do_while(mlr_dsl_ast_node_t* past, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_for_srec(mlr_dsl_ast_node_t* past, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_for_oosvar(mlr_dsl_ast_node_t* past, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_if_head(mlr_dsl_ast_node_t* past, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_filter(mlr_dsl_ast_node_t* past, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* past, int ti, int cf);
|
||||
static mlr_dsl_cst_statement_t* alloc_bare_boolean(mlr_dsl_ast_node_t* past, int ti, int cf);
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_if_item(mlr_dsl_ast_node_t* pexprnode, mlr_dsl_ast_node_t* plistnode,
|
||||
int type_inferencing);
|
||||
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);
|
||||
|
||||
static mlr_dsl_cst_statement_vararg_t* mlr_dsl_cst_statement_vararg_alloc(
|
||||
char* emitf_or_unset_srec_field_name,
|
||||
|
|
@ -69,7 +82,8 @@ static void handle_for_oosvar_aux(
|
|||
mlhmmv_value_t submap,
|
||||
sllse_t* prest_for_k_names);
|
||||
|
||||
static sllv_t* allocate_keylist_evaluators_from_oosvar_node(mlr_dsl_ast_node_t* pnode, int type_inferencing);
|
||||
static sllv_t* allocate_keylist_evaluators_from_oosvar_node(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags);
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
// For mlr filter, which takes a reduced subset of mlr-put syntax:
|
||||
|
|
@ -175,18 +189,18 @@ mlr_dsl_cst_t* mlr_dsl_cst_alloc(mlr_dsl_ast_t* past, 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, cst_statement_alloc(pchild, type_inferencing, TRUE));
|
||||
sllv_append(pcst->pbegin_statements, alloc_cst_statement(pchild, type_inferencing, TRUE));
|
||||
}
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_END:
|
||||
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, cst_statement_alloc(pchild, type_inferencing, TRUE));
|
||||
sllv_append(pcst->pend_statements, alloc_cst_statement(pchild, type_inferencing, TRUE));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
sllv_append(pcst->pmain_statements, cst_statement_alloc(pnode, type_inferencing, FALSE));
|
||||
sllv_append(pcst->pmain_statements, alloc_cst_statement(pnode, type_inferencing, FALSE));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -241,8 +255,8 @@ void mlr_dsl_cst_free(mlr_dsl_cst_t* pcst) {
|
|||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
static mlr_dsl_cst_statement_t* cst_statement_alloc(mlr_dsl_ast_node_t* pnode,
|
||||
int type_inferencing, int begin_end_only)
|
||||
static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
{
|
||||
switch(pnode->type) {
|
||||
|
||||
|
|
@ -256,59 +270,59 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc(mlr_dsl_ast_node_t* pnode,
|
|||
break;
|
||||
|
||||
case MD_AST_NODE_TYPE_CONDITIONAL_BLOCK: // xxx rename to ..._COND
|
||||
return alloc_conditional_block(pnode, type_inferencing);
|
||||
return alloc_conditional_block(pnode, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_WHILE:
|
||||
return alloc_while(pnode, type_inferencing);
|
||||
return alloc_while(pnode, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_DO_WHILE:
|
||||
return alloc_do_while(pnode, type_inferencing);
|
||||
return alloc_do_while(pnode, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_FOR_SREC:
|
||||
return alloc_for_srec(pnode, type_inferencing);
|
||||
return alloc_for_srec(pnode, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_FOR_OOSVAR:
|
||||
return alloc_for_oosvar(pnode, type_inferencing);
|
||||
return alloc_for_oosvar(pnode, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_IF_HEAD:
|
||||
return alloc_if_head(pnode, type_inferencing);
|
||||
return alloc_if_head(pnode, type_inferencing, context_flags);
|
||||
break;
|
||||
|
||||
case MD_AST_NODE_TYPE_SREC_ASSIGNMENT:
|
||||
return alloc_srec_assignment(pnode, type_inferencing);
|
||||
return alloc_srec_assignment(pnode, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_INDIRECT_SREC_ASSIGNMENT:
|
||||
return alloc_indirect_srec_assignment(pnode, type_inferencing);
|
||||
return alloc_indirect_srec_assignment(pnode, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT:
|
||||
return alloc_oosvar_assignment(pnode, type_inferencing);
|
||||
return alloc_oosvar_assignment(pnode, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_OOSVAR_FROM_FULL_SREC_ASSIGNMENT:
|
||||
return alloc_oosvar_from_full_srec_assignment(pnode, type_inferencing);
|
||||
return alloc_oosvar_from_full_srec_assignment(pnode, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_FULL_SREC_FROM_OOSVAR_ASSIGNMENT:
|
||||
return alloc_full_srec_from_oosvar_assignment(pnode, type_inferencing);
|
||||
return alloc_full_srec_from_oosvar_assignment(pnode, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_UNSET:
|
||||
return alloc_unset(pnode, type_inferencing);
|
||||
return alloc_unset(pnode, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_EMITF:
|
||||
return alloc_emitf(pnode, type_inferencing);
|
||||
return alloc_emitf(pnode, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_EMITP:
|
||||
return alloc_emit_or_emitp(pnode, type_inferencing, TRUE);
|
||||
return alloc_emit_or_emitp(pnode, type_inferencing, TRUE, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_EMIT:
|
||||
return alloc_emit_or_emitp(pnode, type_inferencing, FALSE);
|
||||
return alloc_emit_or_emitp(pnode, type_inferencing, FALSE, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_FILTER:
|
||||
return alloc_filter(pnode, type_inferencing);
|
||||
return alloc_filter(pnode, type_inferencing, context_flags);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_DUMP:
|
||||
return alloc_dump(pnode, type_inferencing);
|
||||
return alloc_dump(pnode, type_inferencing, context_flags);
|
||||
break;
|
||||
default:
|
||||
return alloc_bare_boolean(pnode, type_inferencing);
|
||||
return alloc_bare_boolean(pnode, type_inferencing, context_flags);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -334,7 +348,9 @@ static mlr_dsl_cst_statement_t* alloc_blank() {
|
|||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
static mlr_dsl_cst_statement_t* alloc_srec_assignment(mlr_dsl_ast_node_t* past, int type_inferencing) {
|
||||
static mlr_dsl_cst_statement_t* alloc_srec_assignment(mlr_dsl_ast_node_t* past, int type_inferencing,
|
||||
int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
if ((past->pchildren == NULL) || (past->pchildren->length != 2)) {
|
||||
|
|
@ -369,7 +385,9 @@ static mlr_dsl_cst_statement_t* alloc_srec_assignment(mlr_dsl_ast_node_t* past,
|
|||
// x (oosvar_name).
|
||||
// 1 (strnum_literal).
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_indirect_srec_assignment(mlr_dsl_ast_node_t* past, int type_inferencing) {
|
||||
static mlr_dsl_cst_statement_t* alloc_indirect_srec_assignment(mlr_dsl_ast_node_t* past, int type_inferencing,
|
||||
int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
if ((past->pchildren == NULL) || (past->pchildren->length != 2)) {
|
||||
|
|
@ -388,7 +406,9 @@ static mlr_dsl_cst_statement_t* alloc_indirect_srec_assignment(mlr_dsl_ast_node_
|
|||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
static mlr_dsl_cst_statement_t* alloc_oosvar_assignment(mlr_dsl_ast_node_t* past, int type_inferencing) {
|
||||
static mlr_dsl_cst_statement_t* alloc_oosvar_assignment(mlr_dsl_ast_node_t* past, int type_inferencing,
|
||||
int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
mlr_dsl_ast_node_t* pleft = past->pchildren->phead->pvvalue;
|
||||
|
|
@ -400,12 +420,13 @@ static mlr_dsl_cst_statement_t* alloc_oosvar_assignment(mlr_dsl_ast_node_t* past
|
|||
exit(1);
|
||||
}
|
||||
|
||||
sllv_t* poosvar_lhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pleft, type_inferencing);
|
||||
sllv_t* poosvar_lhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pleft, type_inferencing,
|
||||
context_flags);
|
||||
|
||||
if (pleft->type == MD_AST_NODE_TYPE_OOSVAR_KEYLIST && pright->type == MD_AST_NODE_TYPE_OOSVAR_KEYLIST) {
|
||||
pstatement->phandler = handle_oosvar_to_oosvar_assignment;
|
||||
pstatement->poosvar_rhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pright,
|
||||
type_inferencing);
|
||||
type_inferencing, context_flags);
|
||||
} else {
|
||||
pstatement->phandler = handle_oosvar_assignment;
|
||||
pstatement->poosvar_rhs_keylist_evaluators = NULL;
|
||||
|
|
@ -419,7 +440,7 @@ static mlr_dsl_cst_statement_t* alloc_oosvar_assignment(mlr_dsl_ast_node_t* past
|
|||
|
||||
// ----------------------------------------------------------------
|
||||
static mlr_dsl_cst_statement_t* alloc_oosvar_from_full_srec_assignment(
|
||||
mlr_dsl_ast_node_t* past, int type_inferencing)
|
||||
mlr_dsl_ast_node_t* past, int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
|
|
@ -439,11 +460,13 @@ static mlr_dsl_cst_statement_t* alloc_oosvar_from_full_srec_assignment(
|
|||
|
||||
pstatement->phandler = handle_oosvar_from_full_srec_assignment;
|
||||
pstatement->poosvar_lhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pleft,
|
||||
type_inferencing);
|
||||
type_inferencing, context_flags);
|
||||
return pstatement;
|
||||
}
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_full_srec_from_oosvar_assignment(mlr_dsl_ast_node_t* past, int type_inferencing) {
|
||||
static mlr_dsl_cst_statement_t* alloc_full_srec_from_oosvar_assignment(mlr_dsl_ast_node_t* past, int type_inferencing,
|
||||
int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
mlr_dsl_ast_node_t* pleft = past->pchildren->phead->pvvalue;
|
||||
|
|
@ -465,11 +488,13 @@ static mlr_dsl_cst_statement_t* alloc_full_srec_from_oosvar_assignment(mlr_dsl_a
|
|||
|
||||
pstatement->phandler = handle_full_srec_from_oosvar_assignment;
|
||||
pstatement->poosvar_rhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pright,
|
||||
type_inferencing);
|
||||
type_inferencing, context_flags);
|
||||
return pstatement;
|
||||
}
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* past, int type_inferencing) {
|
||||
static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* past, int type_inferencing,
|
||||
int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
pstatement->phandler = handle_unset;
|
||||
|
|
@ -501,7 +526,7 @@ static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* past, int type_i
|
|||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
allocate_keylist_evaluators_from_oosvar_node(pnode, type_inferencing)));
|
||||
allocate_keylist_evaluators_from_oosvar_node(pnode, type_inferencing, context_flags)));
|
||||
|
||||
} else {
|
||||
fprintf(stderr, "%s: internal coding error detected in file %s at line %d.\n",
|
||||
|
|
@ -530,7 +555,9 @@ static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* past, int type_i
|
|||
// oosvar_keylist (oosvar_keylist):
|
||||
// b (string_literal).
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_emitf(mlr_dsl_ast_node_t* pnode, int type_inferencing) {
|
||||
static mlr_dsl_cst_statement_t* alloc_emitf(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
// Loop over oosvar names to emit in e.g. 'emitf @a, @b, @c'.
|
||||
|
|
@ -578,10 +605,8 @@ static mlr_dsl_cst_statement_t* alloc_emitf(mlr_dsl_ast_node_t* pnode, int type_
|
|||
// y (strnum_literal).
|
||||
// z (strnum_literal).
|
||||
|
||||
// xxx consider modifying the AST to produce emit_namelist wrapping the names
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_emit_or_emitp(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int do_full_prefixing)
|
||||
int do_full_prefixing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
|
|
@ -617,7 +642,7 @@ static mlr_dsl_cst_statement_t* alloc_emit_or_emitp(mlr_dsl_ast_node_t* pnode, i
|
|||
: handle_emitp;
|
||||
|
||||
pstatement->poosvar_lhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pkeylist_node,
|
||||
type_inferencing);
|
||||
type_inferencing, context_flags);
|
||||
pstatement->pemit_oosvar_namelist_evaluators = pemit_oosvar_namelist_evaluators;
|
||||
|
||||
} else {
|
||||
|
|
@ -629,7 +654,7 @@ static mlr_dsl_cst_statement_t* alloc_emit_or_emitp(mlr_dsl_ast_node_t* pnode, i
|
|||
}
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_conditional_block(mlr_dsl_ast_node_t* pnode,
|
||||
int type_inferencing)
|
||||
int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
|
|
@ -641,8 +666,7 @@ 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;
|
||||
// xxx stub last arg
|
||||
mlr_dsl_cst_statement_t *pstatement = cst_statement_alloc(pbody_ast_node, type_inferencing, FALSE);
|
||||
mlr_dsl_cst_statement_t *pstatement = alloc_cst_statement(pbody_ast_node, type_inferencing, context_flags);
|
||||
sllv_append(pblock_statements, pstatement);
|
||||
}
|
||||
|
||||
|
|
@ -652,7 +676,9 @@ static mlr_dsl_cst_statement_t* alloc_conditional_block(mlr_dsl_ast_node_t* pnod
|
|||
return pstatement;
|
||||
}
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_while(mlr_dsl_ast_node_t* past, int type_inferencing) {
|
||||
static mlr_dsl_cst_statement_t* alloc_while(mlr_dsl_ast_node_t* past, int type_inferencing,
|
||||
int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
// Left child node is the AST for the boolean expression.
|
||||
|
|
@ -663,7 +689,7 @@ static mlr_dsl_cst_statement_t* alloc_while(mlr_dsl_ast_node_t* past, int type_i
|
|||
|
||||
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 = cst_statement_alloc(pbody_ast_node, type_inferencing, FALSE); // xxx stub
|
||||
mlr_dsl_cst_statement_t *pstatement = alloc_cst_statement(pbody_ast_node, type_inferencing, context_flags);
|
||||
sllv_append(pblock_statements, pstatement);
|
||||
}
|
||||
|
||||
|
|
@ -673,7 +699,9 @@ static mlr_dsl_cst_statement_t* alloc_while(mlr_dsl_ast_node_t* past, int type_i
|
|||
return pstatement;
|
||||
}
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_do_while(mlr_dsl_ast_node_t* past, int type_inferencing) {
|
||||
static mlr_dsl_cst_statement_t* alloc_do_while(mlr_dsl_ast_node_t* past, int type_inferencing,
|
||||
int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
// Left child node is the list of statements in the body.
|
||||
|
|
@ -684,7 +712,7 @@ static mlr_dsl_cst_statement_t* alloc_do_while(mlr_dsl_ast_node_t* past, int typ
|
|||
|
||||
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 = cst_statement_alloc(pbody_ast_node, type_inferencing, FALSE); // xxx stub
|
||||
mlr_dsl_cst_statement_t *pstatement = alloc_cst_statement(pbody_ast_node, type_inferencing, context_flags);
|
||||
sllv_append(pblock_statements, pstatement);
|
||||
}
|
||||
|
||||
|
|
@ -709,7 +737,9 @@ static mlr_dsl_cst_statement_t* alloc_do_while(mlr_dsl_ast_node_t* past, int typ
|
|||
// y (field_name).
|
||||
// 2 (strnum_literal).
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_for_srec(mlr_dsl_ast_node_t* past, int type_inferencing) {
|
||||
static mlr_dsl_cst_statement_t* alloc_for_srec(mlr_dsl_ast_node_t* past, int type_inferencing,
|
||||
int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
// Left child node is list of bound variables.
|
||||
|
|
@ -735,7 +765,7 @@ static mlr_dsl_cst_statement_t* alloc_for_srec(mlr_dsl_ast_node_t* past, int typ
|
|||
printf("break alloc stub!\n");
|
||||
} else {
|
||||
// xxx stub 3rd arg
|
||||
sllv_append(pblock_statements, cst_statement_alloc(pbody_ast_node, type_inferencing, FALSE));
|
||||
sllv_append(pblock_statements, alloc_cst_statement(pbody_ast_node, type_inferencing, context_flags));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -769,7 +799,9 @@ static mlr_dsl_cst_statement_t* alloc_for_srec(mlr_dsl_ast_node_t* past, int typ
|
|||
// 8 (field_name).
|
||||
// 9 (strnum_literal).
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_for_oosvar(mlr_dsl_ast_node_t* past, int type_inferencing) {
|
||||
static mlr_dsl_cst_statement_t* alloc_for_oosvar(mlr_dsl_ast_node_t* past, int type_inferencing,
|
||||
int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
// Left child node is list of bound variables.
|
||||
|
|
@ -791,7 +823,7 @@ static mlr_dsl_cst_statement_t* alloc_for_oosvar(mlr_dsl_ast_node_t* past, int t
|
|||
pstatement->for_v_name = psubright->text;
|
||||
|
||||
pstatement->poosvar_lhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(
|
||||
pmiddle, type_inferencing);
|
||||
pmiddle, type_inferencing, context_flags);
|
||||
|
||||
sllv_t* pblock_statements = sllv_alloc();
|
||||
for (sllve_t* pe = pright->pchildren->phead; pe != NULL; pe = pe->pnext) {
|
||||
|
|
@ -805,7 +837,7 @@ static mlr_dsl_cst_statement_t* alloc_for_oosvar(mlr_dsl_ast_node_t* past, int t
|
|||
printf("break alloc stub!\n");
|
||||
} else {
|
||||
// xxx stub 3rd arg
|
||||
sllv_append(pblock_statements, cst_statement_alloc(pbody_ast_node, type_inferencing, FALSE));
|
||||
sllv_append(pblock_statements, alloc_cst_statement(pbody_ast_node, type_inferencing, context_flags));
|
||||
}
|
||||
}
|
||||
pstatement->pblock_statements = pblock_statements;
|
||||
|
|
@ -865,7 +897,9 @@ static mlr_dsl_cst_statement_t* alloc_for_oosvar(mlr_dsl_ast_node_t* past, int t
|
|||
|
||||
// xxx rename pasts to pnodes thruout
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_if_head(mlr_dsl_ast_node_t* pnode, int type_inferencing) {
|
||||
static mlr_dsl_cst_statement_t* alloc_if_head(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
sllv_t* pif_chain_statements = sllv_alloc();
|
||||
|
|
@ -887,7 +921,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/*, xxx FALSE*/));
|
||||
type_inferencing, context_flags));
|
||||
}
|
||||
|
||||
pstatement->phandler = handle_if_head;
|
||||
|
|
@ -896,7 +930,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)
|
||||
mlr_dsl_ast_node_t* plistnode, int type_inferencing, int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
|
|
@ -904,8 +938,7 @@ 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;
|
||||
// xxx stub last arg
|
||||
mlr_dsl_cst_statement_t *pstatement = cst_statement_alloc(pbody_ast_node, type_inferencing, FALSE);
|
||||
mlr_dsl_cst_statement_t *pstatement = alloc_cst_statement(pbody_ast_node, type_inferencing, context_flags);
|
||||
sllv_append(pblock_statements, pstatement);
|
||||
}
|
||||
|
||||
|
|
@ -918,7 +951,9 @@ static mlr_dsl_cst_statement_t* alloc_if_item(mlr_dsl_ast_node_t* pexprnode,
|
|||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
static mlr_dsl_cst_statement_t* alloc_filter(mlr_dsl_ast_node_t* past, int type_inferencing) {
|
||||
static mlr_dsl_cst_statement_t* alloc_filter(mlr_dsl_ast_node_t* past, int type_inferencing,
|
||||
int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
mlr_dsl_ast_node_t* pnode = past->pchildren->phead->pvvalue;
|
||||
|
|
@ -928,14 +963,18 @@ static mlr_dsl_cst_statement_t* alloc_filter(mlr_dsl_ast_node_t* past, int type_
|
|||
return pstatement;
|
||||
}
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* past, int type_inferencing) {
|
||||
static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* past, int type_inferencing,
|
||||
int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
pstatement->phandler = handle_dump;
|
||||
return pstatement;
|
||||
}
|
||||
|
||||
static mlr_dsl_cst_statement_t* alloc_bare_boolean(mlr_dsl_ast_node_t* past, int type_inferencing) {
|
||||
static mlr_dsl_cst_statement_t* alloc_bare_boolean(mlr_dsl_ast_node_t* past, int type_inferencing,
|
||||
int context_flags)
|
||||
{
|
||||
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
|
||||
|
||||
pstatement->phandler = handle_bare_boolean;
|
||||
|
|
@ -1666,7 +1705,9 @@ static void handle_bare_boolean(
|
|||
// c (strnum_literal).
|
||||
|
||||
// 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) {
|
||||
static sllv_t* allocate_keylist_evaluators_from_oosvar_node(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
int context_flags)
|
||||
{
|
||||
sllv_t* pkeylist_evaluators = sllv_alloc();
|
||||
|
||||
for (sllve_t* pe = pnode->pchildren->phead; pe != NULL; pe = pe->pnext) {
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ static rval_evaluator_t* rval_evaluator_alloc_from_ast_aux(mlr_dsl_ast_node_t* p
|
|||
exit(1);
|
||||
}
|
||||
|
||||
} else if (pnode->type == MD_AST_NODE_TYPE_INDIRECT_FIELD_NAME) { // xxx rid of
|
||||
} else if (pnode->type == MD_AST_NODE_TYPE_INDIRECT_FIELD_NAME) {
|
||||
return rval_evaluator_alloc_from_indirect_field_name(pnode->pchildren->phead->pvvalue, type_inferencing);
|
||||
|
||||
} else if (pnode->type == MD_AST_NODE_TYPE_OOSVAR_KEYLIST) {
|
||||
|
|
|
|||
|
|
@ -7,15 +7,15 @@ BUGFIXES
|
|||
TOP-OF-LIST SUMMARY
|
||||
|
||||
! eliminate the need for semicolon after curly brace. for now, highlighted faqent.
|
||||
-> find a more elegant way to do this but don't block 4.1.0
|
||||
|
||||
! CST-build-time invalidations:
|
||||
- $stuff inside begin/end
|
||||
- break/continue outside for
|
||||
- break/continue outside for/while/do-while
|
||||
- boundvars outside for
|
||||
- break/continue outside while/do-while/for
|
||||
=> all with expect-fail UTs
|
||||
|
||||
! break/continue: fully support or eliminate from the lexer/parser
|
||||
- in-loop stack flags for handlers (at pvars?)
|
||||
|
||||
! komosa cases -> mld/cookbook (as something *not* doable w/o oosvars/for)
|
||||
* chk UT x all
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue