Ilya Zakharevich on Thu, 19 Jan 2006 01:03:33 +0100


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

[PATCH 2.2.11+] Support for ** (power)


This adds support for '**' as a synonim for '^' (to simplify rapid
development via cut-and-paste from programs with C-ish syntax).

Enjoy,
Ilya

--- ./src/language/anal.c~	Thu Nov 10 10:26:24 2005
+++ ./src/language/anal.c	Wed Jan 18 15:48:30 2006
@@ -853,7 +853,8 @@ L3:
 L:
   switch(*analyseur)
   {
-    case '*': analyseur++; act(gmul);
+    case '*':
+	analyseur++; act(gmul);
     case '/': analyseur++; act(gdiv);
     case '%': analyseur++; act(gmod);
     case '\\':
@@ -1322,6 +1323,9 @@ facteur(void)
         if (!x) err(talker2, "not a proper member definition",
                     mark.member, mark.start);
         break;
+      case '*':
+	  if (analyseur[1] == '*') analyseur++;	/* FALL THROUGH */
+	  else goto do_default;
       case '^':
 	analyseur++; p1 = facteur();
         NO_BREAK("after ^", old);
@@ -1347,6 +1351,7 @@ facteur(void)
 	} /* Fall through */
 
       default:
+      do_default:
         return (plus || x==gnil)? x: gneg(x);
     }
 }
@@ -2167,7 +2172,10 @@ identifier(void)
         gp_function_name="O";
         res = truc();
         NO_BREAK("in O()", ch1);
-	if (*analyseur=='^') { analyseur++; m = readlong(); } else m = 1;
+	if (   *analyseur=='^'
+	    || (*analyseur=='*' && analyseur[1] == '*' && ++analyseur)) {
+	    analyseur++; m = readlong();
+	} else m = 1;
 	res = ggrando(res,m); break;
 
       case 80: /* if then else */
@@ -2893,6 +2901,9 @@ skipfacteur(void)
         if (*analyseur == '=' && analyseur[1] != '=')
           { analyseur++; skipseq(); }
         break;
+      case '*':
+	  if (analyseur[1] == '*') analyseur++;	/* FALL THROUGH */
+	  else goto do_default;
       case '^':
 	analyseur++; skipfacteur(); break;
       case '~': case '\'':
@@ -2906,7 +2917,9 @@ skipfacteur(void)
       }
       case '!':
 	if (analyseur[1] != '=') { analyseur++; break; }
-      default: return;
+      default:
+      do_default:
+	return;
     }
 }
 
@@ -3109,7 +3122,10 @@ skipidentifier(void)
     switch(EpVALENCE(ep))
     {
       case 50: skiptruc();
-	if (*analyseur == '^') { analyseur++; skipfacteur(); };
+	if (   *analyseur=='^'
+	    || (*analyseur=='*' && analyseur[1] == '*' && ++analyseur)) {
+	    analyseur++; skipfacteur(); 
+	};
 	break;
       case 80: skipexpr(); match(','); skipseq();
           if (*analyseur != ')') { match(','); skipseq(); }