From fbfd8e534c7e47b82f10d5c434328a28658b10dc Mon Sep 17 00:00:00 2001 From: Søren Sandmann Pedersen Date: Thu, 14 Jun 2012 14:35:42 -0400 Subject: Add support for multiple comma separated expressions --- ast.c | 4 ++-- ast.h | 4 ++-- examples/str.nl | 3 ++- graph.c | 13 +++++++++---- interpret.c | 5 ++++- main.c | 6 +++++- parser.c | 6 +++--- prepare.c | 7 +++++-- 8 files changed, 32 insertions(+), 16 deletions(-) diff --git a/ast.c b/ast.c index 280b046..454b72e 100644 --- a/ast.c +++ b/ast.c @@ -131,11 +131,11 @@ ast_statement_new_definition (ast_definition_t *def) } ast_statement_t * -ast_statement_new_print (ast_expression_t *expr) +ast_statement_new_print (ast_expression_t **exprs) { ast_statement_t *statement = statement_new (AST_PRINT_STATEMENT); - statement->print.expr = expr; + statement->print.exprs = exprs; g_assert (statement->common.type == AST_PRINT_STATEMENT); diff --git a/ast.h b/ast.h index c391fe2..e94e7e2 100644 --- a/ast.h +++ b/ast.h @@ -964,7 +964,7 @@ struct ast_print_statement_t { ast_statement_common_t common; - ast_expression_t * expr; + ast_expression_t ** exprs; }; struct ast_loop_statement_t @@ -1385,7 +1385,7 @@ ast_case_t * ast_case_new_expression (ast_expression_t *expression, ast_statement_t * ast_statement_new_switch (ast_expression_t *condition, ast_case_t **cases); ast_statement_t * ast_statement_new_definition (ast_definition_t *definition); -ast_statement_t * ast_statement_new_print (ast_expression_t *expr); +ast_statement_t * ast_statement_new_print (ast_expression_t **exprs); ast_statement_t * ast_statement_new_expression (ast_expression_t *expr); ast_statement_t * ast_statement_new_compound (ast_statement_t *first, ast_statement_t *second); diff --git a/examples/str.nl b/examples/str.nl index cc0dec7..5631bf8 100644 --- a/examples/str.nl +++ b/examples/str.nl @@ -1 +1,2 @@ -print "Hello World"; +print "Hello World", "asdf", "asdf", 1234, 1234, true; + diff --git a/graph.c b/graph.c index f7b13ba..1bfef56 100644 --- a/graph.c +++ b/graph.c @@ -608,6 +608,7 @@ graph_statement (ast_statement_t *statement, ast_t *ast = (ast_t *)statement; ast_function_definition_t *function; node_t *label = NULL; + int i, len; switch (statement->common.type) { @@ -700,10 +701,14 @@ graph_statement (ast_statement_t *statement, break; case AST_PRINT_STATEMENT: - node = graph_expression (statement->print.expr, node); - node = node_new_to_string (statement->print.expr->common.type_spec, - node, ast); - node = node_new_print (1, node, ast); + len = i = array_length ((void **)statement->print.exprs); + while (i--) + { + node = graph_expression (statement->print.exprs[i], node); + node = node_new_to_string ( + statement->print.exprs[i]->common.type_spec, node, ast); + } + node = node_new_print (len, node, ast); break; case AST_EXPRESSION_STATEMENT: diff --git a/interpret.c b/interpret.c index 26cd923..74f036f 100644 --- a/interpret.c +++ b/interpret.c @@ -297,8 +297,11 @@ interpret (ast_t *ast) { val = stack_pop (stack); - g_print ("%s\n", (char *)val.pointer_val); + g_print ("%s", (char *)val.pointer_val); + if (i < current->print.n_exprs - 1) + g_print (", "); } + g_print ("\n"); break; case NODE_POP: diff --git a/main.c b/main.c index fdda69e..2a84bee 100644 --- a/main.c +++ b/main.c @@ -306,7 +306,11 @@ dump_statement (ast_statement_t *statement) case AST_PRINT_STATEMENT: g_print ("print "); - dump_expression (statement->print.expr); + for (i = 0; statement->print.exprs[i]; ++i) + { + dump_expression (statement->print.exprs[i]); + g_print (", "); + } g_print ("; "); break; diff --git a/parser.c b/parser.c index c90fead..d2ef6cf 100644 --- a/parser.c +++ b/parser.c @@ -387,13 +387,13 @@ parse_print_statement (const token_t *in, ast_statement_t **result) { const token_t *t = in; - ast_expression_t *expr; + ast_expression_t **exprs; if ((t = parse_token (t, TOKEN_PRINT)) && - (t = parse_expression (t, &expr)) && + (t = parse_expressions (t, &exprs)) && (t = parse_token (t, TOKEN_SEMICOLON))) { - *result = ast_statement_new_print (expr); + *result = ast_statement_new_print (exprs); return t; } diff --git a/prepare.c b/prepare.c index 00436f5..fcd5292 100644 --- a/prepare.c +++ b/prepare.c @@ -444,8 +444,11 @@ prepare_statement (ast_statement_t *statement, break; case AST_PRINT_STATEMENT: - if (!prepare_expression (statement->print.expr, parent, info)) - return FALSE; + for (i = 0; statement->print.exprs[i]; ++i) + { + if (!prepare_expression (statement->print.exprs[i], parent, info)) + return FALSE; + } break; case AST_EXPRESSION_STATEMENT: -- cgit v1.2.3