rev 643 - in trunk: pr/test src
SVN User <[email protected]> Sat, 19 Jun 2004 02:25:55 -0400
| Newsgroups | gmane.comp.lang.prothon.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: mark
Date: 2004-06-19 02:25:52 -0400 (Sat, 19 Jun 2004)
New Revision: 643
Modified:
trunk/pr/test/test.pr
trunk/src/builtins-list.c
trunk/src/prothon.y
Log:
added +! and *! to list methods, added syntax for all op! binary operators
Modified: trunk/pr/test/test.pr
===================================================================
--- trunk/pr/test/test.pr 2004-06-19 05:37:24 UTC (rev 642)
+++ trunk/pr/test/test.pr 2004-06-19 06:25:52 UTC (rev 643)
@@ -1,17 +1,15 @@
#!/usr/bin/env prothon
-i=0
-print i
-i += 1
-print i
-i *= 2
-print i
-i **=3
-print i
-i //= 2
-print i
+l = [1,2]
+print l +! [3,4]
+print l
-a = 'a'
-a += 'bc'
-print a
+print l *! 2
+print l
+print l *! 1
+print l
+
+print l *! 0
+print l
+
Modified: trunk/src/builtins-list.c
===================================================================
--- trunk/src/builtins-list.c 2004-06-19 05:37:24 UTC (rev 642)
+++ trunk/src/builtins-list.c 2004-06-19 06:25:52 UTC (rev 643)
@@ -594,6 +594,19 @@
return res;
}
+DEF(List, iadd_, FORM_RPARAM) {
+ int i;
+ BIN_CONTENT_CHK(List);
+ read_unlock(ist, self);
+ if (has_proto(ist, parms[1], OBJ(SEQ_PROTO)) && !has_proto(ist, parms[1], OBJ(STRING_PROTO)))
+ for(i=0; i < (int) list_len(ist, parms[1]); i++)
+ list_append(ist, self, list_item(ist, parms[1], i));
+ else
+ list_append(ist, self, parms[1]);
+ read_lock(ist, self);
+ return self;
+}
+
DEF(List, mul_, FORM_RPARAM){
obj_p res;
list_p lstp, selfp = (list_p)(self->data.ptr);
@@ -621,6 +634,34 @@
return res;
}
+DEF(List, imul_, FORM_RPARAM){
+ list_p lstp, selfp = (list_p)(self->data.ptr);
+ int i, size, times, len = (int) list_len(ist, self);
+ BIN_CONTENT_CHK(List);
+ if (!has_proto(ist, parms[1], OBJ(INT_PROTO))) {
+ raise_exception(ist, OBJ(TYPE_EXC), "multiply times parameter must be an integer");
+ return NULL;
+ }
+ times = (int)parms[1]->data.i64;
+ size = len*times;
+ if(times == 0) { read_unlock(ist, self); list_clear(ist, self); read_lock(ist, self); return self; }
+ if(times == 1) return self;
+ lstp = pr_malloc(list_sizeof(size));
+ if(!lstp) {
+ raise_exception(ist, OBJ(OUTOFMEMORY_EXC), "memory allocation failed for list multiplication");
+ return NULL;
+ }
+ lstpsetsize(lstp, size);
+ lstplen(lstp) = size;
+ for(i=0; i < times; i++)
+ memcpy(&(lstp->item[i*len]), selfp->item, len*sizeof(obj_p));
+ def_write_lock(self);
+ pr_free(self->data.ptr);
+ self->data.ptr = lstp;
+ def_write_unlock(self);
+ return self;
+}
+
DEF(List, append_BANG, FORM_RPARAM) {
list_p lstp;
BIN_CONTENT_CHK(List);
@@ -792,7 +833,9 @@
MODULE_ADD_SYM(List, setItem_);
MODULE_ADD_SYM(List, delItem_);
MODULE_ADD_SYM(List, add_);
+ MODULE_ADD_SYM(List, iadd_);
MODULE_ADD_SYM(List, mul_);
+ MODULE_ADD_SYM(List, imul_);
MODULE_ADD_SYM(List, append_BANG);
MODULE_ADD_SYM(List, extend_BANG);
MODULE_ADD_SYM(List, insert_BANG);
Modified: trunk/src/prothon.y
===================================================================
--- trunk/src/prothon.y 2004-06-19 05:37:24 UTC (rev 642)
+++ trunk/src/prothon.y 2004-06-19 06:25:52 UTC (rev 643)
@@ -144,6 +144,19 @@
%nonassoc LSH_EQ
%nonassoc EXP_EQ
+%nonassoc ADD_BANG
+%nonassoc SUB_BANG
+%nonassoc MUL_BANG
+%nonassoc DIV_BANG
+%nonassoc TDV_BANG
+%nonassoc REM_BANG
+%nonassoc BAND_BANG
+%nonassoc BOR_BANG
+%nonassoc BXOR_BANG
+%nonassoc RSH_BANG
+%nonassoc LSH_BANG
+%nonassoc EXP_BANG
+
%right '='
%nonassoc '['
@@ -484,51 +497,21 @@
| NOT { $$ = (void *)(unsigned long)ISNOT__QUES; }
;
expr:
- expr OR expr
- { $$ = expr_andor_expr(yylex_param, $1, $3, OR_FLAG); }
-
- | expr AND expr
- { $$ = expr_andor_expr(yylex_param, $1, $3, AND_FLAG); }
-
- | expr IN_ expr
- { $$ = binary(yylex_param, $1, IN__QUES, $3); }
-
- | expr NOT IN_ expr %prec NOT_IN
- { $$ = binary(yylex_param, $1, NOTIN__QUES, $4); }
-
- | expr IS is_not_check expr
- { $$ = binary(yylex_param, $1, (int)(intptr_t)$3, $4); }
-
- | NOT expr
- { $$ = unary(yylex_param, NOT__QUES, $2); }
-
- | expr '<' expr %prec EQ
- { $$ = binary(yylex_param, $1, LT__QUES, $3); }
-
- | expr LE expr %prec EQ
- { $$ = binary(yylex_param, $1, LE__QUES, $3); }
-
- | expr '>' expr %prec EQ
- { $$ = binary(yylex_param, $1, GT__QUES , $3); }
-
- | expr GE expr %prec EQ
- { $$ = binary(yylex_param, $1, GE__QUES, $3); }
-
- | expr NE expr %prec EQ
- { $$ = binary(yylex_param, $1, NE__QUES, $3); }
-
- | expr EQ expr %prec EQ
- { $$ = binary(yylex_param, $1, EQ__QUES, $3); }
-
- | expr '|' expr
- { $$ = binary(yylex_param, $1, OR_, $3); }
-
- | expr '^' expr
- { $$ = binary(yylex_param, $1, XOR_, $3); }
-
- | expr '&' expr
- { $$ = binary(yylex_param, $1, AND_, $3); }
-
+ expr OR expr { $$ = expr_andor_expr(yylex_param, $1, $3, OR_FLAG); }
+ | expr AND expr { $$ = expr_andor_expr(yylex_param, $1, $3, AND_FLAG); }
+ | expr IN_ expr { $$ = binary(yylex_param, $1, IN__QUES, $3); }
+ | expr NOT IN_ expr %prec NOT_IN { $$ = binary(yylex_param, $1, NOTIN__QUES, $4); }
+ | expr IS is_not_check expr { $$ = binary(yylex_param, $1, (int)(intptr_t)$3, $4); }
+ | NOT expr { $$ = unary(yylex_param, NOT__QUES, $2); }
+ | expr '<' expr %prec EQ { $$ = binary(yylex_param, $1, LT__QUES, $3); }
+ | expr LE expr %prec EQ { $$ = binary(yylex_param, $1, LE__QUES, $3); }
+ | expr '>' expr %prec EQ { $$ = binary(yylex_param, $1, GT__QUES , $3); }
+ | expr GE expr %prec EQ { $$ = binary(yylex_param, $1, GE__QUES, $3); }
+ | expr NE expr %prec EQ { $$ = binary(yylex_param, $1, NE__QUES, $3); }
+ | expr EQ expr %prec EQ { $$ = binary(yylex_param, $1, EQ__QUES, $3); }
+ | expr '|' expr { $$ = binary(yylex_param, $1, OR_, $3); }
+ | expr '^' expr { $$ = binary(yylex_param, $1, XOR_, $3); }
+ | expr '&' expr { $$ = binary(yylex_param, $1, AND_, $3); }
| expr LSH expr { $$ = binary(yylex_param, $1, LSHIFT_, $3); }
| expr RSH expr { $$ = binary(yylex_param, $1, RSHIFT_, $3); }
| expr '+' expr { $$ = binary(yylex_param, $1, ADD_, $3); }
@@ -537,6 +520,18 @@
| expr '/' expr { $$ = binary(yylex_param, $1, DIV_, $3); }
| expr TDV expr { $$ = binary(yylex_param, $1, FLOORDIV_, $3); }
| expr '%' expr { $$ = binary(yylex_param, $1, MOD_, $3); }
+ | expr ADD_BANG expr { $$ = binary(yylex_param, $1, IADD_, $3); }
+ | expr SUB_BANG expr { $$ = binary(yylex_param, $1, ISUB_, $3); }
+ | expr MUL_BANG expr { $$ = binary(yylex_param, $1, IMUL_, $3); }
+ | expr DIV_BANG expr { $$ = binary(yylex_param, $1, IDIV_, $3); }
+ | expr TDV_BANG expr { $$ = binary(yylex_param, $1, IFLOORDIV_, $3); }
+ | expr REM_BANG expr { $$ = binary(yylex_param, $1, IMOD_, $3); }
+ | expr BAND_BANG expr { $$ = binary(yylex_param, $1, IAND_, $3); }
+ | expr BOR_BANG expr { $$ = binary(yylex_param, $1, IOR_, $3); }
+ | expr BXOR_BANG expr { $$ = binary(yylex_param, $1, IXOR_, $3); }
+ | expr RSH_BANG expr { $$ = binary(yylex_param, $1, IRSHIFT_, $3); }
+ | expr LSH_BANG expr { $$ = binary(yylex_param, $1, ILSHIFT_, $3); }
+ | expr EXP_BANG expr { $$ = binary(yylex_param, $1, IPOW_, $3); }
| '+' expr %prec UPL { $$ = unary(yylex_param, POS_, $2); }
| '-' expr %prec UMI { $$ = unary(yylex_param, NEG_, $2); }
| '~' expr { $$ = unary(yylex_param, INV_, $2); }
@@ -1018,6 +1013,8 @@
int c3;
if ((c3=getch(state)) == '=')
return LSH_EQ;
+ else if (c3 == '!')
+ return LSH_BANG;
ungetch(c3, state);
return LSH;
}
@@ -1031,6 +1028,8 @@
int c3;
if ((c3=getch(state)) == '=')
return RSH_EQ;
+ else if (c3 == '!')
+ return RSH_BANG;
ungetch(c3, state);
return RSH;
}
@@ -1040,10 +1039,14 @@
int c2 = getch(state);
if (c2 == '=')
return DIV_EQ;
+ else if (c2 == '!')
+ return DIV_BANG;
if (c2 == '/') {
int c3 = getch(state);
if (c3 == '=')
return TDV_EQ;
+ else if (c3 == '!')
+ return TDV_BANG;
ungetch(c3, state);
return TDV;
}
@@ -1053,10 +1056,14 @@
int c2 = getch(state);
if (c2 == '=')
return MUL_EQ;
+ else if (c2 == '!')
+ return MUL_BANG;
if (c2 == '*') {
int c3 = getch(state);
if (c3 == '=')
return EXP_EQ;
+ else if (c3 == '!')
+ return EXP_BANG;
ungetch(c3, state);
return EXP;
}
@@ -1078,36 +1085,48 @@
int c2;
if ((c2=getch(state)) == '=')
return ADD_EQ;
+ else if (c2 == '!')
+ return ADD_BANG;
ungetch(c2, state);
}
if (c == '-'){
int c2;
if ((c2=getch(state)) == '=')
return SUB_EQ;
+ else if (c2 == '!')
+ return SUB_BANG;
ungetch(c2, state);
}
if (c == '%'){
int c2;
if ((c2=getch(state)) == '=')
return REM_EQ;
+ else if (c2 == '!')
+ return REM_BANG;
ungetch(c2, state);
}
if (c == '&'){
int c2;
if ((c2=getch(state)) == '=')
return BAND_EQ;
+ else if (c2 == '!')
+ return BAND_BANG;
ungetch(c2, state);
}
if (c == '|'){
int c2;
if ((c2=getch(state)) == '=')
return BOR_EQ;
+ else if (c2 == '!')
+ return BOR_BANG;
ungetch(c2, state);
}
if (c == '^'){
int c2;
if ((c2=getch(state)) == '=')
return BXOR_EQ;
+ else if (c2 == '!')
+ return BXOR_BANG;
ungetch(c2, state);
}
/* process LABEL or english keyword*/