diff --git a/c/dsls/mlr_dsl_lexer.l b/c/dsls/mlr_dsl_lexer.l index 0409caab5..293f79608 100644 --- a/c/dsls/mlr_dsl_lexer.l +++ b/c/dsls/mlr_dsl_lexer.l @@ -426,6 +426,10 @@ return MD_TOKEN_REGEXI; } +"map" { + *yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY); + return MD_TOKEN_MAP; +} "var" { *yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY); return MD_TOKEN_VAR; diff --git a/c/dsls/mlr_dsl_parse.y b/c/dsls/mlr_dsl_parse.y index 90e5caa44..7b3427811 100644 --- a/c/dsls/mlr_dsl_parse.y +++ b/c/dsls/mlr_dsl_parse.y @@ -119,6 +119,7 @@ md_statement_not_braced_end(A) ::= md_int_local_definition(B). { A = B; } md_statement_not_braced_end(A) ::= md_float_local_definition(B). { A = B; } md_statement_not_braced_end(A) ::= md_boolean_local_definition(B). { A = B; } md_statement_not_braced_end(A) ::= md_string_local_definition(B). { A = B; } +md_statement_not_braced_end(A) ::= md_map_local_declaration(B). { A = B; } md_statement_not_braced_end(A) ::= md_local_assignment(B). { A = B; } // For user-defined functions @@ -653,6 +654,9 @@ md_boolean_local_definition(A) ::= MD_TOKEN_BOOLEAN md_local_variable(N) MD_TOKE md_string_local_definition(A) ::= MD_TOKEN_STRING md_local_variable(N) MD_TOKEN_ASSIGN md_rhs(B). { A = mlr_dsl_ast_node_alloc_binary("local", MD_AST_NODE_TYPE_STRING_LOCAL_DEFINITION, N, B); } +md_map_local_declaration(A) ::= MD_TOKEN_MAP md_local_variable(N). { + A = mlr_dsl_ast_node_alloc_unary("local", MD_AST_NODE_TYPE_MAP_LOCAL_DECLARATION, N); +} md_local_assignment(A) ::= md_local_variable(B) MD_TOKEN_ASSIGN(O) md_rhs(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_LOCAL_ASSIGNMENT, B, C); diff --git a/c/mapping/mlr_dsl_ast.c b/c/mapping/mlr_dsl_ast.c index b291f1813..91df682df 100644 --- a/c/mapping/mlr_dsl_ast.c +++ b/c/mapping/mlr_dsl_ast.c @@ -244,6 +244,7 @@ char* mlr_dsl_ast_node_describe_type(mlr_dsl_ast_node_type_t type) { case MD_AST_NODE_TYPE_FLOAT_LOCAL_DEFINITION: return "FLOAT_LOCAL_DEFINITION"; break; case MD_AST_NODE_TYPE_BOOLEAN_LOCAL_DEFINITION: return "BOOLEAN_LOCAL_DEFINITION"; break; case MD_AST_NODE_TYPE_STRING_LOCAL_DEFINITION: return "STRING_LOCAL_DEFINITION"; break; + case MD_AST_NODE_TYPE_MAP_LOCAL_DECLARATION: return "MAP_LOCAL_DECLARATION"; break; case MD_AST_NODE_TYPE_UNTYPED_PARAMETER_DEFINITION: return "UNTYPED_PARAMETER_DEFINITION"; break; case MD_AST_NODE_TYPE_NUMERIC_PARAMETER_DEFINITION: return "NUMERIC_PARAMETER_DEFINITION"; break; case MD_AST_NODE_TYPE_INT_PARAMETER_DEFINITION: return "INT_PARAMETER_DEFINITION"; break; @@ -255,7 +256,7 @@ char* mlr_dsl_ast_node_describe_type(mlr_dsl_ast_node_type_t type) { case MD_AST_NODE_TYPE_BEGIN: return "BEGIN"; break; case MD_AST_NODE_TYPE_END: return "END"; break; case MD_AST_NODE_TYPE_STRING_LITERAL: return "STRING_LITERAL"; break; - case MD_AST_NODE_TYPE_NUMERIC_LITERAL: return "NUMERIC_LITERAL"; break; + case MD_AST_NODE_TYPE_NUMERIC_LITERAL: return "NUMERIC_LITERAL"; break; case MD_AST_NODE_TYPE_BOOLEAN_LITERAL: return "BOOLEAN_LITERAL"; break; case MD_AST_NODE_TYPE_REGEXI: return "REGEXI"; break; case MD_AST_NODE_TYPE_FIELD_NAME: return "FIELD_NAME"; break; diff --git a/c/mapping/mlr_dsl_ast.h b/c/mapping/mlr_dsl_ast.h index c08220f9a..628624849 100644 --- a/c/mapping/mlr_dsl_ast.h +++ b/c/mapping/mlr_dsl_ast.h @@ -20,6 +20,7 @@ typedef enum _mlr_dsl_ast_node_type_t { MD_AST_NODE_TYPE_FLOAT_LOCAL_DEFINITION, MD_AST_NODE_TYPE_BOOLEAN_LOCAL_DEFINITION, MD_AST_NODE_TYPE_STRING_LOCAL_DEFINITION, + MD_AST_NODE_TYPE_MAP_LOCAL_DECLARATION, MD_AST_NODE_TYPE_UNTYPED_PARAMETER_DEFINITION, MD_AST_NODE_TYPE_NUMERIC_PARAMETER_DEFINITION, MD_AST_NODE_TYPE_INT_PARAMETER_DEFINITION, diff --git a/c/todo.txt b/c/todo.txt index 8ea2568c8..bfcf1cdd5 100644 --- a/c/todo.txt +++ b/c/todo.txt @@ -41,9 +41,7 @@ MAPVARS: - function return value - ? for-oosvar map-valued boundvars?!? - - ? for-local -- with keylist etc.? + - for-local -- with keylist etc. just as for oosvars * needs assert_not_map