print iterate

This commit is contained in:
John Kerl 2016-06-09 15:51:10 -07:00
parent e96ed050e3
commit 2d025eb17c
6 changed files with 38 additions and 1 deletions

View file

@ -172,6 +172,7 @@ char* mlr_dsl_ast_node_describe_type(mlr_dsl_ast_node_type_t type) {
case MD_AST_NODE_TYPE_EMITP: return "emitp"; break;
case MD_AST_NODE_TYPE_EMIT: return "emit"; break;
case MD_AST_NODE_TYPE_DUMP: return "dump"; break;
case MD_AST_NODE_TYPE_PRINT: return "print"; break;
case MD_AST_NODE_TYPE_ALL: return "all"; break;
case MD_AST_NODE_TYPE_ENV: return "env"; break;
case MD_AST_NODE_TYPE_WHILE: return "while"; break;

View file

@ -37,6 +37,7 @@ typedef enum _mlr_dsl_ast_node_type_t {
MD_AST_NODE_TYPE_EMITP,
MD_AST_NODE_TYPE_EMIT,
MD_AST_NODE_TYPE_DUMP,
MD_AST_NODE_TYPE_PRINT,
MD_AST_NODE_TYPE_ALL,
MD_AST_NODE_TYPE_NOP, // only for parser internals; should not be in the AST returned by the parser
MD_AST_NODE_TYPE_WHILE,

View file

@ -55,6 +55,10 @@
*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_DUMP);
return MD_TOKEN_DUMP;
}
"print" {
*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_PRINT);
return MD_TOKEN_PRINT;
}
"begin" {
*yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY);
return MD_TOKEN_BEGIN;

View file

@ -136,6 +136,7 @@ md_statement_not_braced_end ::= md_emitf.
md_statement_not_braced_end ::= md_emitp.
md_statement_not_braced_end ::= md_emit.
md_statement_not_braced_end ::= md_dump.
md_statement_not_braced_end ::= md_print.
// Valid only within for/while, but we accept them here syntactically and reject them in the AST-to-CST
// conversion, where we can produce much more informative error messages:
@ -650,6 +651,9 @@ md_emit_args(A) ::= md_emit_args(B) MD_TOKEN_COMMA md_rhs(C). {
md_dump(A) ::= MD_TOKEN_DUMP(O). {
A = mlr_dsl_ast_node_alloc_zary(O->text, MD_AST_NODE_TYPE_DUMP);
}
md_print(A) ::= MD_TOKEN_PRINT(O) md_rhs(B). {
A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_PRINT, B);
}
// ================================================================
// Begin RHS precedence chain

View file

@ -30,6 +30,7 @@ static mlr_dsl_cst_statement_t* alloc_break(mlr_dsl_a
static mlr_dsl_cst_statement_t* alloc_continue(mlr_dsl_ast_node_t* pnode, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_filter(mlr_dsl_ast_node_t* pnode, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* pnode, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_print(mlr_dsl_ast_node_t* pnode, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_bare_boolean(mlr_dsl_ast_node_t* pnode, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_if_item(
@ -69,6 +70,7 @@ static void handle_emitp_all(mlr_dsl_cst_statement_t* s,
static void handle_emit(mlr_dsl_cst_statement_t* s, variables_t* v, cst_outputs_t* o);
static void handle_emit_all(mlr_dsl_cst_statement_t* s, variables_t* v, cst_outputs_t* o);
static void handle_dump(mlr_dsl_cst_statement_t* s, variables_t* v, cst_outputs_t* o);
static void handle_print(mlr_dsl_cst_statement_t* s, variables_t* v, cst_outputs_t* o);
static void handle_filter(mlr_dsl_cst_statement_t* s, variables_t* v, cst_outputs_t* o);
static void handle_conditional_block(mlr_dsl_cst_statement_t* s, variables_t* v, cst_outputs_t* o);
static void handle_while(mlr_dsl_cst_statement_t* s, variables_t* v, cst_outputs_t* o);
@ -401,6 +403,9 @@ static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, i
case MD_AST_NODE_TYPE_DUMP:
return alloc_dump(pnode, type_inferencing, context_flags);
break;
case MD_AST_NODE_TYPE_PRINT:
return alloc_print(pnode, type_inferencing, context_flags);
break;
default:
return alloc_bare_boolean(pnode, type_inferencing, context_flags);
break;
@ -1080,6 +1085,7 @@ static mlr_dsl_cst_statement_t* alloc_filter(mlr_dsl_ast_node_t* pnode, int type
return pstatement;
}
// ----------------------------------------------------------------
static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags)
{
@ -1089,6 +1095,18 @@ static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* pnode, int type_i
return pstatement;
}
// ----------------------------------------------------------------
static mlr_dsl_cst_statement_t* alloc_print(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
pstatement->pnode_handler = handle_print;
// xxx
return pstatement;
}
// ----------------------------------------------------------------
static mlr_dsl_cst_statement_t* alloc_bare_boolean(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags)
{
@ -1603,6 +1621,15 @@ static void handle_dump(
mlhmmv_print_json_stacked(pvars->poosvars, FALSE);
}
// ----------------------------------------------------------------
static void handle_print(
mlr_dsl_cst_statement_t* pnode,
variables_t* pvars,
cst_outputs_t* pcst_outputs)
{
printf("STUB\n");
}
// ----------------------------------------------------------------
static void handle_filter(
mlr_dsl_cst_statement_t* pnode,

View file

@ -11,7 +11,6 @@ TOP OF LIST:
! heterogenize feature?
COOKBOOK:
* cookbook example: key<->val inverter
* cookbook https://github.com/johnkerl/miller/issues/103 to fix up short csv data lines
mlr --from jb.csv --fs comma --nidx put '
@maxnf = max(@maxnf, NF);
@ -21,6 +20,7 @@ COOKBOOK:
$[@nf] = ""
}
'
* rename example also w/ for-srec?
gentoo? http://euscan.gentooexperimental.org/package/sys-apps/miller/