free(else_branch);
}
+static void
+do_arrow(struct tree* t, struct list* where)
+{
+ int v;
+ struct code ins;
+
+ v = evaluate(t->pt.arrow.s, -1, where);
+ ins.u.arrow.what = v;
+
+ if (t->pt.arrow.left == K_COPY)
+ ins.u.arrow.copy = 1;
+ else
+ ins.u.arrow.copy = 0;
+ switch (t->pt.arrow.right) {
+ case K_EMPTY:
+ ins.opcode = STORE;
+ break;
+ case K_PIPE:
+ ins.opcode = PIPE;
+ break;
+ case K_MAIL:
+ ins.opcode = MAIL;
+ break;
+ default:
+ die("do_arrow: This cannot happen ;-)");
+ }
+ new_instr(ins, where);
+}
+
static void
reset_temp_var_count(void)
{
break;
case ST_EMPTY:
break;
+ case ST_LEAF: //warn?
+ break;
case ST_ASS:
do_ass(t, where);
break;
break;
case ST_COND:
eval_cond(t, -1, where); // warn?
+ case ST_ARROW:
+ do_arrow(t, where);
default:
die("compile: got to default");
}
%token <str> CONST
%token <n> NUM
%token <str> VAR
-%token <str> KW_DISCARD
-%token <str> KW_PIPE KW_MAIL KW_COPY
+%token <n> KW_DISCARD
+%token <n> KW_PIPE KW_MAIL KW_COPY
%token '(' ')' '{' '}' ';'
%nonassoc KW_IF
%nonassoc KW_ELSE
%type <tr> arrow
%type <tr> cond
%type <n> rop
-%type <str> left
-%type <str> right
+%type <n> left
+%type <n> right
%type <tr> leaves
%%
arrow: left ARROW right ass_right {
$$ = tree_malloc(ST_ARROW);
$$->pt.arrow.s = $4;
- $$->pt.arrow.kw_left = $1;
- $$->pt.arrow.kw_right = $3;
+ $$->pt.arrow.left = $1;
+ $$->pt.arrow.right = $3;
}
| left ARROW KW_DISCARD { //FIXME: actually left does not make sense here
$$ = tree_malloc(ST_ARROW);
$$->pt.arrow.s = NULL;
- $$->pt.arrow.kw_left = NULL;
- $$->pt.arrow.kw_right = "discard";
+ $$->pt.arrow.left = K_EMPTY;
+ $$->pt.arrow.right = K_DISCARD;
}
;
-left: /* empty */ { $$ = NULL;}
- | KW_COPY { $$ = "copy"; }
+left: /* empty */ { $$ = K_EMPTY;}
+ | KW_COPY { $$ = K_COPY; }
;
-right: /* empty */ { $$ = NULL; }
- | KW_PIPE { $$ = "pipe"; }
- | KW_MAIL { $$ = "mail"; }
+right: /* empty */ { $$ = K_EMPTY; }
+ | KW_PIPE { $$ = K_PIPE; }
+ | KW_MAIL { $$ = K_MAIL; }
;
ass_right: leaves