|
From: Peep P. <so...@us...> - 2004-07-23 17:04:06
|
Update of /cvsroot/agd/server/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13410 Modified Files: vars.h lang.y lang.h instr.h Log Message: Bitwise operators. Index: lang.h =================================================================== RCS file: /cvsroot/agd/server/src/lang.h,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- lang.h 21 Jul 2004 12:13:09 -0000 1.12 +++ lang.h 23 Jul 2004 17:03:56 -0000 1.13 @@ -48,23 +48,30 @@ L_OPEN_FUNP = 274, L_CLOSE_FUNP = 275, L_RANGE = 276, - L_MINUS_EQ = 277, - L_PLUS_EQ = 278, - L_DIV_EQ = 279, - L_MOD_EQ = 280, - L_MUL_EQ = 281, - L_POW_EQ = 282, - L_AND = 283, - L_OR = 284, - L_NE = 285, - L_EQ = 286, - L_GE = 287, - L_LE = 288, - L_POW = 289, - L_ARROW = 290, - L_DEC = 291, - L_INC = 292, - L_NEG = 293 + L_BSR_EQ = 277, + L_BSL_EQ = 278, + L_BAND_EQ = 279, + L_BOR_EQ = 280, + L_BXOR_EQ = 281, + L_MINUS_EQ = 282, + L_PLUS_EQ = 283, + L_DIV_EQ = 284, + L_MOD_EQ = 285, + L_MUL_EQ = 286, + L_POW_EQ = 287, + L_AND = 288, + L_OR = 289, + L_NE = 290, + L_EQ = 291, + L_GE = 292, + L_LE = 293, + L_BSL = 294, + L_BSR = 295, + L_POW = 296, + L_ARROW = 297, + L_DEC = 298, + L_INC = 299, + L_NEG = 300 }; #endif #define L_IF 258 @@ -86,23 +93,30 @@ #define L_OPEN_FUNP 274 #define L_CLOSE_FUNP 275 #define L_RANGE 276 -#define L_MINUS_EQ 277 -#define L_PLUS_EQ 278 -#define L_DIV_EQ 279 -#define L_MOD_EQ 280 -#define L_MUL_EQ 281 -#define L_POW_EQ 282 -#define L_AND 283 -#define L_OR 284 -#define L_NE 285 -#define L_EQ 286 -#define L_GE 287 -#define L_LE 288 -#define L_POW 289 -#define L_ARROW 290 -#define L_DEC 291 -#define L_INC 292 -#define L_NEG 293 +#define L_BSR_EQ 277 +#define L_BSL_EQ 278 +#define L_BAND_EQ 279 +#define L_BOR_EQ 280 +#define L_BXOR_EQ 281 +#define L_MINUS_EQ 282 +#define L_PLUS_EQ 283 +#define L_DIV_EQ 284 +#define L_MOD_EQ 285 +#define L_MUL_EQ 286 +#define L_POW_EQ 287 +#define L_AND 288 +#define L_OR 289 +#define L_NE 290 +#define L_EQ 291 +#define L_GE 292 +#define L_LE 293 +#define L_BSL 294 +#define L_BSR 295 +#define L_POW 296 +#define L_ARROW 297 +#define L_DEC 298 +#define L_INC 299 +#define L_NEG 300 @@ -122,7 +136,7 @@ void *ptr; /* for() uses this. */ } YYSTYPE; /* Line 1240 of yacc.c. */ -#line 126 "lang.h" +#line 140 "lang.h" # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 Index: lang.y =================================================================== RCS file: /cvsroot/agd/server/src/lang.y,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- lang.y 23 Jul 2004 14:24:05 -0000 1.25 +++ lang.y 23 Jul 2004 17:03:56 -0000 1.26 @@ -81,23 +81,27 @@ %token L_OPEN_ARRAY L_CLOSE_ARRAY %token L_OPEN_FUNP L_CLOSE_FUNP - /* operators */ %nonassoc L_RANGE %right '=' +%left L_BXOR_EQ L_BOR_EQ L_BAND_EQ L_BSL_EQ L_BSR_EQ %left L_PLUS_EQ L_MINUS_EQ %left L_MUL_EQ L_MOD_EQ L_DIV_EQ %left L_POW_EQ %left L_OR L_AND +%left '|' +%left '^' +%left '&' %left L_EQ L_NE %left '?' %left '<' '>' L_LE L_GE +%left L_BSR L_BSL %left '+' '-' %left ':' %left '*' '/' '%' %left L_POW %left L_ARROW -%nonassoc L_NEG '!' L_INC L_DEC +%nonassoc L_NEG '!' L_INC L_DEC '~' %left '[' ']' %nonassoc '(' ')' @@ -338,6 +342,17 @@ 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); } + + | expr L_BXOR_EQ { $<i>$ = curr_fun->codelen - 2; } + expr { do_assign_expr(&$$, &$1, $4.type, F_BXOR_EQ, $<i>3); } + | expr L_BOR_EQ { $<i>$ = curr_fun->codelen - 2; } + expr { do_assign_expr(&$$, &$1, $4.type, F_BOR_EQ, $<i>3); } + | expr L_BAND_EQ { $<i>$ = curr_fun->codelen - 2; } + expr { do_assign_expr(&$$, &$1, $4.type, F_BAND_EQ, $<i>3); } + | expr L_BSL_EQ { $<i>$ = curr_fun->codelen - 2; } + expr { do_assign_expr(&$$, &$1, $4.type, F_BSL_EQ, $<i>3); } + | expr L_BSR_EQ { $<i>$ = curr_fun->codelen - 2; } + expr { do_assign_expr(&$$, &$1, $4.type, F_BSR_EQ, $<i>3); } ; inc_expr: @@ -359,6 +374,13 @@ | expr '/' expr { do_expr(&$$, &$1, &$3, F_DIV); } | expr '%' expr { do_expr(&$$, &$1, &$3, F_MOD); } | expr L_POW expr { do_expr(&$$, &$1, &$3, F_POW); } + + | expr '&' expr { do_expr(&$$, &$1, &$3, F_BAND); } + | expr '|' expr { do_expr(&$$, &$1, &$3, F_BOR); } + | expr '~' expr { do_expr(&$$, &$1, &$3, F_BNOT); } + | expr '^' expr { do_expr(&$$, &$1, &$3, F_BXOR); } + | expr L_BSL expr { do_expr(&$$, &$1, &$3, F_BSL); } + | expr L_BSR expr { do_expr(&$$, &$1, &$3, F_BSR); } ; compare_expr: Index: vars.h =================================================================== RCS file: /cvsroot/agd/server/src/vars.h,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- vars.h 21 Jul 2004 11:54:01 -0000 1.9 +++ vars.h 23 Jul 2004 17:03:56 -0000 1.10 @@ -8,6 +8,7 @@ int compare_vars(variable_t *v1, variable_t *v2); variable_t *add_vars(variable_t *v1, variable_t *v2); variable_t *sub_vars(variable_t *v1, variable_t *v2); +variable_t *band_vars(variable_t *v1, variable_t *v2); char *type2str(int t); #endif Index: instr.h =================================================================== RCS file: /cvsroot/agd/server/src/instr.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- instr.h 21 Jul 2004 12:06:31 -0000 1.4 +++ instr.h 23 Jul 2004 17:03:56 -0000 1.5 @@ -24,37 +24,49 @@ #define F_CALL_OTHER 18 #define F_ASSIGN 19 /* Pops two variables off the stack, and assigns upper one's value to the lower one. (the lower one should be a T_LVALUE) */ -#define F_ADD 20 -#define F_ADD_EQ 21 -#define F_SUB 22 -#define F_SUB_EQ 23 -#define F_MUL 24 -#define F_MUL_EQ 25 -#define F_DIV 26 -#define F_DIV_EQ 27 -#define F_MOD 28 -#define F_MOD_EQ 29 -#define F_POW 30 -#define F_POW_EQ 31 -#define F_NOT 32 -#define F_EQ 33 -#define F_NE 34 -#define F_GT 35 -#define F_GE 36 -#define F_LT 37 -#define F_LE 38 -#define F_NEG 39 -#define F_AND 40 /* Have to keep these in because of check_operand() */ -#define F_OR 41 /* */ -#define F_POSTINC 42 -#define F_PREINC 43 -#define F_POSTDEC 44 -#define F_PREDEC 45 -#define F_INDEX 46 /* Single index into an array or string. */ -#define F_INDEX_LVALUE 47 -#define F_SLICE 48 -#define F_SLICE_LVALUE 49 -#define F_COMM 50 +#define F_ADD 20 /* + */ +#define F_ADD_EQ 21 /* += */ +#define F_SUB 22 /* - */ +#define F_SUB_EQ 23 /* -=*/ +#define F_MUL 24 /* * */ +#define F_MUL_EQ 25 /* *= */ +#define F_DIV 26 /* / */ +#define F_DIV_EQ 27 /* /= */ +#define F_MOD 28 /* % */ +#define F_MOD_EQ 29 /* %= */ +#define F_POW 30 /* ** */ +#define F_POW_EQ 31 /* **= */ -#define F_HIGHEST F_COMM +#define F_BAND 32 /* & */ +#define F_BAND_EQ 33 /* &= */ +#define F_BOR 34 /* | */ +#define F_BOR_EQ 35 /* |= */ +#define F_BNOT 36 /* ~ */ +#define F_BNOT_EQ 37 /* ~= */ +#define F_BXOR 38 /* ^ */ +#define F_BXOR_EQ 39 /* ^= */ +#define F_BSR 40 /* >> */ +#define F_BSR_EQ 41 /* >>= */ +#define F_BSL 42 /* << */ +#define F_BSL_EQ 43 /* <<= */ + +#define F_NOT 44 /* ! */ +#define F_EQ 45 /* == */ +#define F_NE 46 /* != */ +#define F_GT 47 /* > */ +#define F_GE 48 /* >= */ +#define F_LT 49 /* < */ +#define F_LE 50 /* <= */ +#define F_NEG 51 /* -expr */ +#define F_AND 52 /* && */ /* Have to keep these in because of check_operand() */ +#define F_OR 53 /* || */ /* ------------------------------------------------ */ +#define F_POSTINC 54 /* expr++*/ +#define F_PREINC 55 /* ++expr */ +#define F_POSTDEC 56 /* expr-- */ +#define F_PREDEC 57 /* --expr */ +#define F_INDEX 58 /* [expr] */ /* Single index into an array or string. */ +#define F_INDEX_LVALUE 59 +#define F_SLICE 60 /* [expr..expr] */ +#define F_SLICE_LVALUE 61 +#define F_COMM 62 /* , */ #endif |