| 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(); }