From e01d4b5591d2684af59e9dbb30330da9aa145794 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Wed, 9 Jun 2010 22:42:27 +0200 Subject: [PATCH] gesamt: bei leeren expression, baum bis zum ersten O_CALL durchwandern --- gesamt/code.bfe | 2 +- gesamt/parser.y | 4 +++- gesamt/tree.c | 11 +++++++++++ gesamt/tree.h | 1 + 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/gesamt/code.bfe b/gesamt/code.bfe index 11c6734..a95ed5b 100644 --- a/gesamt/code.bfe +++ b/gesamt/code.bfe @@ -287,7 +287,7 @@ void gen_sub_field(struct treenode *bnode) begin: ret # 0 # printf("\n"); begin: assign # 0 # begin: ifstat # 0 # -begin: args # 0 # +begin: expr # 0 # assign: O_ASSIGN(expr, O_ID) # 1 # KIDREG2PARM(1); printf("\tmovq %%%s, %%%s\n", BN_REG, KID_REG(1)); diff --git a/gesamt/parser.y b/gesamt/parser.y index 4b45352..88b808e 100644 --- a/gesamt/parser.y +++ b/gesamt/parser.y @@ -200,7 +200,9 @@ Statement: @i @Statement.node@ = new_node(O_EXPR, @Expr.node@, TREENULL); @reg @Statement.node@->reg = @Expr.node@->reg = next_reg((char *)NULL, @Expr.gparamges@); - @gen write_tree(@Statement.node@, 0); burm_label(@Statement.node@); burm_reduce(@Statement.node@, 1); + @gen { + just_calls(@Statement.node@); + } @} | IF Expr THEN Statseq END diff --git a/gesamt/tree.c b/gesamt/tree.c index 7d70718..1c3f888 100644 --- a/gesamt/tree.c +++ b/gesamt/tree.c @@ -147,3 +147,14 @@ void write_tree(struct treenode *node, int indent) } } +void just_calls(struct treenode *node) +{ + if(node == TREENULL) { + return; + } else if(node->op == O_CALL) { + write_tree(node, 0); burm_label(node); burm_reduce(node, 1); + } else { + just_calls(node->kids[0]); + just_calls(node->kids[1]); + } +} diff --git a/gesamt/tree.h b/gesamt/tree.h index 8a651e7..e7fd68f 100644 --- a/gesamt/tree.h +++ b/gesamt/tree.h @@ -56,5 +56,6 @@ struct treenode *new_call(char *name, struct treenode *l, struct treenode *r, in struct treenode *new_arg(struct treenode *l, struct treenode *r, int soffset); struct treenode *new_nothing(void); void write_tree(struct treenode *node, int ident); +void just_calls(struct treenode *node); #endif -- 2.25.1