gesamt: leerstehende Expr's auswerten (weil da Methodenaufrufe drin sein koennten)
authorBernhard Urban <lewurm@gmail.com>
Mon, 7 Jun 2010 11:24:58 +0000 (13:24 +0200)
committerBernhard Urban <lewurm@gmail.com>
Mon, 7 Jun 2010 11:24:58 +0000 (13:24 +0200)
gesamt/TODO
gesamt/code.bfe
gesamt/parser.y
gesamt/tree.h

index 732763583f1e62a3e76fb1d6974153ffffe773ff..511b51bc401f717108aae492d4f8c0e0170f07d4 100644 (file)
@@ -1,2 +1,33 @@
 - bench.sh fixen, zomg
-- intelli_03: seiteneffekte in der ersten zeile *ahhhh*
+- intelli_03: seiteneffekte; was ist mit der auswertungsreihenfolge?
+an die mailinglist
+
+Betreff: Seiteneffekte bei Expression
+
+Hallo,
+
+wie ist die Auswertungsreihenfolge bei Expressions mit Seiteneffekten, z.B. in
+diesem Fall:
+
+test.0
+> struct a end;
+> method f()
+>      return this.a - inc();
+> end;
+> method inc()
+>      return this.a--1;
+> end;
+
+
+test.call
+> long f(long[]);
+> long ar[] = {100};
+> int ret = f(ar);
+> #define ERG1 (100 - 101)
+> #define ERG2 (101 - 101)
+> printf("ret ist %2i (sollte %2i ODER %2i sein?)\n", ret, ERG1, ERG2);
+> RET(ret == ERG1 || ret == ERG2);
+
+
+Liebe Gruesse,
+Bernhard Urban
index dba50235426bbed1fe7f5ca1fafd391771e66342..4bd1e83219cba8d57c760efedf09eb946abd7153 100644 (file)
@@ -258,7 +258,7 @@ void prep_arg(struct treenode *bnode, int moveit)
 %}
 
 %start begin
-%term O_RET=1 O_NULL=2 O_SUB=3 O_MUL=4 O_OR=5 O_LESS=6 O_EQ=7 O_ID=8 O_ADD=9 O_NUM=10 O_FIELD=11 O_MTWO=12 O_MFOUR=13 O_MEIGHT=14 O_MONE=15 O_ASSIGN=16 O_IF=17 O_BOOL=18 O_CALL=19 O_ARG=20 O_NOTHING=21
+%term O_RET=1 O_NULL=2 O_SUB=3 O_MUL=4 O_OR=5 O_LESS=6 O_EQ=7 O_ID=8 O_ADD=9 O_NUM=10 O_FIELD=11 O_MTWO=12 O_MFOUR=13 O_MEIGHT=14 O_MONE=15 O_ASSIGN=16 O_IF=17 O_BOOL=18 O_CALL=19 O_ARG=20 O_NOTHING=21 O_EXPR=22
 
 %%
 
@@ -284,6 +284,7 @@ ifstat: O_IF(O_BOOL(expr)) # 1 # /* dann braucht man kein test */
 
 
 ret: O_RET(retexpr) # 2 # printf("\t//o_ret(expr)\n"); move(BN_REG, "rax");
+ret: O_EXPR(expr) # 0 #
 
 retexpr: O_ID # 1 # printf("\t//retexpr\n"); if(bnode->param_index > -1) move(param_reg(bnode->param_index), BN_REG);
 retexpr: expr
index 2d42baaaec617b9d9ccd1fc00d8869ddd8e3ea7e..1d7a7c6d61c2d9d71cd1eacf653ab9e704d0ee82 100644 (file)
@@ -197,7 +197,10 @@ Statement:
                varsinout()
                lblcountinout()
                xxputsin(@Expr.s@,)
-           @i @Statement.node@ = TREENULL;
+               @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);
          @}
 
        | IF Expr THEN Statseq END
index a6d52c4d1937c7948ff0584fc5961d4073e0c314..8a651e73cb195e1d94699af6877f910c6a815b60 100644 (file)
@@ -14,7 +14,7 @@ enum {
        O_OR=5, O_LESS, O_EQ, O_ID, O_ADD,
        O_NUM=10, O_FIELD, O_MTWO, O_MFOUR, O_MEIGHT,
        O_MONE=15, O_ASSIGN, O_IF, O_BOOL, O_CALL,
-       O_ARG=20, O_NOTHING
+       O_ARG=20, O_NOTHING, O_EXPR
 };
 
 static char *o_names[] = {
@@ -22,7 +22,7 @@ static char *o_names[] = {
        "O_OR", "O_LESS", "O_EQ", "O_ID", "O_ADD",
        "O_NUM", "O_FIELD", "O_MTWO", "O_MFOUR", "O_MEIGHT",
        "O_MONE", "O_ASSIGN", "O_IF", "O_BOOL", "O_CALL",
-       "O_ARG", "O_NOTHING"
+       "O_ARG", "O_NOTHING", "O_EXPR"
 };
 
 struct treenode {