mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-24 00:18:39 +00:00
iterate on for/while/if language features: CST prep
This commit is contained in:
parent
e2ca4a90a7
commit
cc1f701eb2
1 changed files with 34 additions and 37 deletions
|
|
@ -5,10 +5,8 @@
|
|||
static sllv_t* mlr_dsl_cst_alloc_from_statement_list(sllv_t* pasts, int type_inferencing);
|
||||
|
||||
static mlr_dsl_cst_t* mlr_dsl_cst_alloc_from_ast(mlr_dsl_ast_t* past, int type_inferencing);
|
||||
static void mlr_dsl_cst_append_from_ast_aux(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
sllv_t* pstatements, int begin_end_only);
|
||||
|
||||
static mlr_dsl_cst_statement_t* cst_statement_alloc(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
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* cst_statement_alloc_blank();
|
||||
static void cst_statement_free(mlr_dsl_cst_statement_t* pstatement);
|
||||
|
||||
|
|
@ -251,7 +249,7 @@ static sllv_t* mlr_dsl_cst_alloc_from_statement_list(sllv_t* pasts, int type_inf
|
|||
sllv_t* pstatements = sllv_alloc();
|
||||
for (sllve_t* pe = pasts->phead; pe != NULL; pe = pe->pnext) {
|
||||
mlr_dsl_ast_node_t* past = pe->pvvalue;
|
||||
mlr_dsl_cst_statement_t* pstatement = cst_statement_alloc(past, type_inferencing);
|
||||
mlr_dsl_cst_statement_t* pstatement = cst_statement_alloc(past, type_inferencing, FALSE);
|
||||
sllv_append(pstatements, pstatement);
|
||||
}
|
||||
return pstatements;
|
||||
|
|
@ -275,34 +273,21 @@ static mlr_dsl_cst_t* mlr_dsl_cst_alloc_from_ast(mlr_dsl_ast_t* past, int type_i
|
|||
switch (pnode->type) {
|
||||
case MD_AST_NODE_TYPE_BEGIN:
|
||||
printf("GOT BEGIN\n");
|
||||
mlr_dsl_cst_append_from_ast_aux(pnode, type_inferencing, pcst->pbegin_statements, TRUE);
|
||||
sllv_append(pcst->pbegin_statements, cst_statement_alloc(pnode, type_inferencing, TRUE));
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_END:
|
||||
printf("GOT END\n");
|
||||
mlr_dsl_cst_append_from_ast_aux(pnode, type_inferencing, pcst->pend_statements, TRUE);
|
||||
sllv_append(pcst->pend_statements, cst_statement_alloc(pnode, type_inferencing, TRUE));
|
||||
break;
|
||||
default:
|
||||
printf("GOT MAIN:%s\n", mlr_dsl_ast_node_describe_type(pnode->type));
|
||||
mlr_dsl_cst_append_from_ast_aux(pnode, type_inferencing, pcst->pmain_statements, FALSE);
|
||||
sllv_append(pcst->pmain_statements, cst_statement_alloc(pnode, type_inferencing, FALSE));
|
||||
break;
|
||||
}
|
||||
}
|
||||
return pcst;
|
||||
}
|
||||
|
||||
static void mlr_dsl_cst_append_from_ast_aux(mlr_dsl_ast_node_t* pnode, int type_inferencing,
|
||||
sllv_t* pstatements, int begin_end_only)
|
||||
{
|
||||
switch(pnode->type) {
|
||||
case MD_AST_NODE_TYPE_WHILE:
|
||||
printf("-- GOT WHILE\n");
|
||||
sllv_append(pstatements, cst_statement_alloc(pnode, type_inferencing));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
void mlr_dsl_cst_free(mlr_dsl_cst_t* pcst) {
|
||||
if (pcst == NULL)
|
||||
|
|
@ -321,46 +306,58 @@ void mlr_dsl_cst_free(mlr_dsl_cst_t* pcst) {
|
|||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
static mlr_dsl_cst_statement_t* cst_statement_alloc(mlr_dsl_ast_node_t* past, int type_inferencing) {
|
||||
switch(past->type) {
|
||||
static mlr_dsl_cst_statement_t* cst_statement_alloc(mlr_dsl_ast_node_t* pnode,
|
||||
int type_inferencing, int begin_end_only)
|
||||
{
|
||||
switch(pnode->type) {
|
||||
|
||||
case MD_AST_NODE_TYPE_BEGIN:
|
||||
fprintf(stderr, "%s: begin statements are only valid at top level.\n", MLR_GLOBALS.argv0);
|
||||
exit(1);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_END:
|
||||
fprintf(stderr, "%s: begin statements are only valid at top level.\n", MLR_GLOBALS.argv0);
|
||||
exit(1);
|
||||
break;
|
||||
|
||||
case MD_AST_NODE_TYPE_SREC_ASSIGNMENT:
|
||||
return cst_statement_alloc_srec_assignment(past, type_inferencing);
|
||||
return cst_statement_alloc_srec_assignment(pnode, type_inferencing);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT:
|
||||
return cst_statement_alloc_oosvar_assignment(past, type_inferencing);
|
||||
return cst_statement_alloc_oosvar_assignment(pnode, type_inferencing);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_OOSVAR_FROM_FULL_SREC_ASSIGNMENT:
|
||||
return cst_statement_alloc_oosvar_from_full_srec_assignment(past, type_inferencing);
|
||||
return cst_statement_alloc_oosvar_from_full_srec_assignment(pnode, type_inferencing);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_FULL_SREC_FROM_OOSVAR_ASSIGNMENT:
|
||||
return cst_statement_alloc_full_srec_from_oosvar_assignment(past, type_inferencing);
|
||||
return cst_statement_alloc_full_srec_from_oosvar_assignment(pnode, type_inferencing);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_UNSET:
|
||||
return cst_statement_alloc_unset(past, type_inferencing);
|
||||
return cst_statement_alloc_unset(pnode, type_inferencing);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_EMITF:
|
||||
return cst_statement_alloc_emitf(past, type_inferencing);
|
||||
return cst_statement_alloc_emitf(pnode, type_inferencing);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_EMITP:
|
||||
return cst_statement_alloc_emit_or_emitp(past, type_inferencing, TRUE);
|
||||
return cst_statement_alloc_emit_or_emitp(pnode, type_inferencing, TRUE);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_EMIT:
|
||||
return cst_statement_alloc_emit_or_emitp(past, type_inferencing, FALSE);
|
||||
return cst_statement_alloc_emit_or_emitp(pnode, type_inferencing, FALSE);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_CONDITIONAL_BLOCK: // xxx rename to ..._COND
|
||||
return cst_statement_alloc_conditional_block(past, type_inferencing);
|
||||
return cst_statement_alloc_conditional_block(pnode, type_inferencing);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_WHILE:
|
||||
return cst_statement_alloc_while(past, type_inferencing);
|
||||
return cst_statement_alloc_while(pnode, type_inferencing);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_FILTER:
|
||||
return cst_statement_alloc_filter(past, type_inferencing);
|
||||
return cst_statement_alloc_filter(pnode, type_inferencing);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_DUMP:
|
||||
return cst_statement_alloc_dump(past, type_inferencing);
|
||||
return cst_statement_alloc_dump(pnode, type_inferencing);
|
||||
break;
|
||||
default:
|
||||
return cst_statement_alloc_bare_boolean(past, type_inferencing);
|
||||
return cst_statement_alloc_bare_boolean(pnode, type_inferencing);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -613,7 +610,7 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc_conditional_block(mlr_dsl_as
|
|||
|
||||
for (sllve_t* pe = past->pchildren->phead->pnext; 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);
|
||||
mlr_dsl_cst_statement_t *pstatement = cst_statement_alloc(pbody_ast_node, type_inferencing, FALSE); // xxx stub
|
||||
sllv_append(pblock_statements, pstatement);
|
||||
}
|
||||
|
||||
|
|
@ -634,7 +631,7 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc_while(mlr_dsl_ast_node_t* pa
|
|||
|
||||
for (sllve_t* pe = pright->pchildren->phead->pnext; 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);
|
||||
mlr_dsl_cst_statement_t *pstatement = cst_statement_alloc(pbody_ast_node, type_inferencing, FALSE); // xxx stub
|
||||
sllv_append(pblock_statements, pstatement);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue