From: Peep P. <so...@us...> - 2004-03-21 13:12:48
|
Update of /cvsroot/agd/server/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25264/src Modified Files: compile.c interpret.h lang.h lang.y lex.l Log Message: New operators - ** and **=. Index: lex.l =================================================================== RCS file: /cvsroot/agd/server/src/lex.l,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- lex.l 21 Mar 2004 08:51:36 -0000 1.8 +++ lex.l 21 Mar 2004 13:02:37 -0000 1.9 @@ -234,6 +234,8 @@ "=" RET(c, '=', L_ASSIGN); "++" RET(s, "++", L_INC); "+" RET(c, '+', L_PLUS); +"**" RET(s, "**", L_POW); +"**=" RET(s, "**=", L_POWE); "*" RET(c, '*', L_MUL); "/" RET(c, '/', L_DIV); "%" RET(c, '%', L_MOD); @@ -243,7 +245,6 @@ "/=" RET(s, "/=", L_DE); "%=" RET(s, "%=", L_MOE); - "({" RET(s, "({", L_OPEN_ARRAY); "([" RET(s, "([", L_OPEN_MAPPING); "(:" RET(s, "(:", L_OPEN_FUNP); Index: lang.h =================================================================== RCS file: /cvsroot/agd/server/src/lang.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- lang.h 21 Mar 2004 09:00:57 -0000 1.3 +++ lang.h 21 Mar 2004 13:02:37 -0000 1.4 @@ -50,25 +50,27 @@ L_DE = 276, L_MOE = 277, L_MUE = 278, - L_AND = 279, - L_OR = 280, - L_NE = 281, - L_EQ = 282, - L_MINUS = 283, - L_PLUS = 284, - L_GE = 285, - L_LE = 286, - L_GT = 287, - L_LT = 288, - L_MOD = 289, - L_DIV = 290, - L_MUL = 291, - L_DEREF = 292, - L_DEC = 293, - L_INC = 294, - L_NOT = 295, - L_NEG = 296, - L_TYPECAST = 297 + L_POWE = 279, + L_AND = 280, + L_OR = 281, + L_NE = 282, + L_EQ = 283, + L_MINUS = 284, + L_PLUS = 285, + L_GE = 286, + L_LE = 287, + L_GT = 288, + L_LT = 289, + L_MOD = 290, + L_DIV = 291, + L_MUL = 292, + L_POW = 293, + L_DEREF = 294, + L_DEC = 295, + L_INC = 296, + L_NOT = 297, + L_NEG = 298, + L_TYPECAST = 299 }; #endif #define L_RETURN 258 @@ -92,25 +94,27 @@ #define L_DE 276 #define L_MOE 277 #define L_MUE 278 -#define L_AND 279 -#define L_OR 280 -#define L_NE 281 -#define L_EQ 282 -#define L_MINUS 283 -#define L_PLUS 284 -#define L_GE 285 -#define L_LE 286 -#define L_GT 287 -#define L_LT 288 -#define L_MOD 289 -#define L_DIV 290 -#define L_MUL 291 -#define L_DEREF 292 -#define L_DEC 293 -#define L_INC 294 -#define L_NOT 295 -#define L_NEG 296 -#define L_TYPECAST 297 +#define L_POWE 279 +#define L_AND 280 +#define L_OR 281 +#define L_NE 282 +#define L_EQ 283 +#define L_MINUS 284 +#define L_PLUS 285 +#define L_GE 286 +#define L_LE 287 +#define L_GT 288 +#define L_LT 289 +#define L_MOD 290 +#define L_DIV 291 +#define L_MUL 292 +#define L_POW 293 +#define L_DEREF 294 +#define L_DEC 295 +#define L_INC 296 +#define L_NOT 297 +#define L_NEG 298 +#define L_TYPECAST 299 @@ -127,7 +131,7 @@ def_id_t *id; } YYSTYPE; /* Line 1240 of yacc.c. */ -#line 131 "lang.h" +#line 135 "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.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- lang.y 21 Mar 2004 10:35:53 -0000 1.10 +++ lang.y 21 Mar 2004 13:02:37 -0000 1.11 @@ -51,6 +51,7 @@ %right L_ASSIGN %left L_PE /* Pluq-equals */ L_ME /* Minus-equals */ %left L_MUE /* Multiply-equals */ L_MOE /* Modulo-equals */ L_DE /* Divide-equals */ +%left L_POWE /* Power-equals */ %left L_OR L_AND %left L_EQ L_NE %left L_PLUS L_MINUS @@ -58,11 +59,13 @@ %left '?' %left L_LT L_GT L_LE L_GE %left L_MUL L_DIV L_MOD +%left L_POW %left L_DEREF /* L_DEREF _is_ a valid lval for call_other. i.e: ob->get_another_ob()->call(), as long as ob->get_another_ob() returns T_OBJECT. */ %right '[' ']' %nonassoc L_NEG L_NOT L_INC L_DEC +/*%left L_COMM*/ %nonassoc L_TYPECAST %type <str> string string_con2 @@ -823,6 +826,53 @@ array_push(&$$.arr, (void *) F_MOD); array_push(&$$.arr, (void *) F_ASSIGN); } +/* + | expr L_COMM expr + { + $$.side_effect = $1.side_effect || $3.side_effect; + $$.lval = $$.direct_type = 0; + $$.type = $1.type; + + array_concat(&$$.arr, &$1.arr); + array_concat(&$$.arr, &$3.arr); + array_push(&$$.arr, (void *) F_POP); + } +*/ + | expr L_POW expr + { + $$.side_effect = $1.side_effect || $3.side_effect; + $$.lval = $$.direct_type = 0; + $$.type = $1.type; + + check_operand(F_POW, $1.type, $3.type); + + init_array(&$$.arr); + if($1.direct_type && $3.direct_type) { + int i1, i2, res; + i1 = (int) $1.arr.data[1]; + i2 = (int) $3.arr.data[1]; + array_push(&$$.arr, (void *) F_PUSH_INT); + array_push(&$$.arr, (void *) pow(i1, i2)); + } else { + array_concat(&$$.arr, &$1.arr); + array_concat(&$$.arr, &$3.arr); + array_push(&$$.arr, (void *) F_POW); + } + } + | expr L_POWE expr + { + $$.side_effect = 1; + $$.lval = $$.direct_type = 0; + $$.type = $1.type; + + check_operand(F_POWE, $1.type, $3.type); + /* Once for F_POW, once for F_ASSIGN. */ + array_concat(&$$.arr, &$1.arr); + array_concat(&$$.arr, &$1.arr); + array_concat(&$$.arr, &$3.arr); + array_push(&$$.arr, (void *) F_POW); + array_push(&$$.arr, (void *) F_ASSIGN); + } | expr L_INC { check_operand(F_POSTINC, $1.type, 0); Index: compile.c =================================================================== RCS file: /cvsroot/agd/server/src/compile.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- compile.c 20 Mar 2004 20:26:36 -0000 1.16 +++ compile.c 21 Mar 2004 13:02:37 -0000 1.17 @@ -224,6 +224,12 @@ case F_RANGE: SET_OPERATOR("[]", 1, 0, 0, 1, 0); break; + case F_POW: + SET_OPERATOR("**", 2, 1, 1, 0, 0); + break; + case F_POWE: + SET_OPERATOR("**=", 2, 1, 1, 0, 0); + break; } } } Index: interpret.h =================================================================== RCS file: /cvsroot/agd/server/src/interpret.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- interpret.h 20 Mar 2004 19:18:42 -0000 1.8 +++ interpret.h 21 Mar 2004 13:02:37 -0000 1.9 @@ -50,6 +50,9 @@ #define F_PREDEC 43 #define F_RANGE 44 #define F_RANGE_LVALUE 45 +#define F_COMM 46 +#define F_POW 47 +#define F_POWE 48 #define F_HIGHEST F_RANGE_LVALUE |