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*/