From: Peep P. <so...@us...> - 2004-06-12 16:44:31
|
Update of /cvsroot/agd/server/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2679 Modified Files: lang.y Log Message: lvalues work. Index: lang.y =================================================================== RCS file: /cvsroot/agd/server/src/lang.y,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- lang.y 8 Jun 2004 20:41:49 -0000 1.18 +++ lang.y 12 Jun 2004 16:44:22 -0000 1.19 @@ -29,13 +29,12 @@ break_allowed, continue_allowed, is_new_declaration; -/*typedef struct arr_t arr_t;*/ extern int scope_level; extern program_t *this_prog; extern function_t *curr_fun; -void do_assign_expr(expr_t *result, expr_t *left, int type2, int op); +void do_assign_expr(expr_t *result, expr_t *left, int type2, int op, int index); void do_expr(expr_t *result, expr_t *op1, expr_t *op2, int operator); void do_inc_expr(expr_t *result, expr_t *expr, int op); @@ -321,20 +320,27 @@ ; assign_expr: - expr '=' { add_token(F_MAKE_LVALUE); } - expr { do_assign_expr(&$$, &$1, $4.type, F_ASSIGN); } - | expr L_PLUS_EQ { add_token(F_MAKE_LVALUE); } - expr { do_assign_expr(&$$, &$1, $4.type, F_ADD_EQ); } - | expr L_MINUS_EQ { add_token(F_MAKE_LVALUE); } - expr { do_assign_expr(&$$, &$1, $4.type, F_SUB_EQ); } - | expr L_MUL_EQ { add_token(F_MAKE_LVALUE); } - expr { do_assign_expr(&$$, &$1, $4.type, F_MUL_EQ); } - | expr L_DIV_EQ { add_token(F_MAKE_LVALUE); } - expr { do_assign_expr(&$$, &$1, $4.type, F_DIV_EQ); } - | expr L_MOD_EQ { add_token(F_MAKE_LVALUE); } - expr { do_assign_expr(&$$, &$1, $4.type, F_MOD_EQ); } - | expr L_POW_EQ { add_token(F_MAKE_LVALUE); } - expr { do_assign_expr(&$$, &$1, $4.type, F_POW_EQ); } + expr '=' { $<i>$ = curr_fun->codelen - 2; } + expr { do_assign_expr(&$$, &$1, $4.type, F_ASSIGN, $<i>3); } + | expr L_PLUS_EQ { $<i>$ = curr_fun->codelen - 2; } + expr { do_assign_expr(&$$, &$1, $4.type, F_ADD_EQ, $<i>3); } + | expr L_MINUS_EQ { $<i>$ = curr_fun->codelen - 2; } + expr { do_assign_expr(&$$, &$1, $4.type, F_SUB_EQ, $<i>3); } + | expr L_MUL_EQ { $<i>$ = curr_fun->codelen - 2; } + expr { do_assign_expr(&$$, &$1, $4.type, F_MUL_EQ, $<i>3); } + | expr L_DIV_EQ { $<i>$ = curr_fun->codelen - 2; } + expr { do_assign_expr(&$$, &$1, $4.type, F_DIV_EQ, $<i>3); } + | expr L_MOD_EQ { $<i>$ = curr_fun->codelen - 2; } + expr { do_assign_expr(&$$, &$1, $4.type, F_MOD_EQ, $<i>3); } + | expr L_POW_EQ { $<i>$ = curr_fun->codelen - 2; } + expr { do_assign_expr(&$$, &$1, $4.type, F_POW_EQ, $<i>3); } + ; + +inc_expr: + expr L_INC { do_inc_expr(&$$, &$1, F_POSTINC); } + | L_INC expr { do_inc_expr(&$$, &$2, F_PREINC); } + | expr L_DEC { do_inc_expr(&$$, &$1, F_POSTDEC); } + | L_DEC expr { do_inc_expr(&$$, &$2, F_PREDEC); } ; arith_expr: @@ -359,29 +365,6 @@ | expr L_EQ expr { do_expr(&$$, &$1, &$3, F_EQ); } ; -inc_expr: - expr L_INC - { - add_token(F_MAKE_LVALUE); - do_inc_expr(&$$, &$1, F_POSTINC); - } - | L_INC expr - { - add_token(F_MAKE_LVALUE); - do_inc_expr(&$$, &$2, F_PREINC); - } - | expr L_DEC - { - add_token(F_MAKE_LVALUE); - do_inc_expr(&$$, &$1, F_POSTDEC); - } - | L_DEC expr - { - add_token(F_MAKE_LVALUE); - do_inc_expr(&$$, &$2, F_PREDEC); - } - ; - neg_expr: '-' expr %prec L_NEG { @@ -1143,8 +1126,32 @@ ; %% -void do_assign_expr(expr_t *result, expr_t *left, int type2, int op) +void make_lvalue(int index) +{ + int replace; + + /* Turn it into a lvalue. */ + switch(curr_fun->code[index]) { + case F_PUSH_LVAR: + replace = F_PUSH_LVAR_LVALUE; + break; + case F_PUSH_GVAR: + replace = F_PUSH_GVAR_LVALUE; + break; + case F_INDEX: + replace = F_INDEX_LVALUE; + break; + case F_SLICE: + replace = F_SLICE_LVALUE; + break; + } + curr_fun->code[index] = replace; +} + +void do_assign_expr(expr_t *result, expr_t *left, int type2, int op, int index) { + make_lvalue(index); + if(!left->lval) { comp_error("invalid lvalue"); } @@ -1172,6 +1179,8 @@ void do_inc_expr(expr_t *result, expr_t *expr, int op) { + make_lvalue(curr_fun->codelen - 2); + if(!expr->lval) { comp_error("invalid lvalue"); } |