summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@redhat.com>2012-06-14 14:35:42 -0400
committerSøren Sandmann Pedersen <ssp@redhat.com>2012-06-14 14:35:42 -0400
commitfbfd8e534c7e47b82f10d5c434328a28658b10dc (patch)
treecffb40b5da238fcbf56ea015d8187b063890c821
parenta04ee9ff196726d48da67d5b95611c118184a815 (diff)
Add support for multiple comma separated expressions
-rw-r--r--ast.c4
-rw-r--r--ast.h4
-rw-r--r--examples/str.nl3
-rw-r--r--graph.c13
-rw-r--r--interpret.c5
-rw-r--r--main.c6
-rw-r--r--parser.c6
-rw-r--r--prepare.c7
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: