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