X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=expr.c;fp=expr.c;h=5a9155c67832c1ee049d899415a0c924b40b4a07;hp=2361817784d7c0eccab31b9060de867613c1ff7d;hb=3f937a2ab53c5fa20f5468e59c278da9d8c54b02;hpb=9aa8503cdc9933350f14299d326ec7ee379721b8 diff --git a/expr.c b/expr.c index 2361817..5a9155c 100644 --- a/expr.c +++ b/expr.c @@ -93,24 +93,97 @@ void InitExpression(void) symbolNum = 0; } +extern int correctMathRules; +int xor(void); +int and(void); +int rel(void); +int shift(void); +int sum(void); +int product(void); + // -// Binary operators (all the same precedence) +// Binary operators (all the same precedence, +// except if -4 is passed to the command line) // +#define precedence(HIERARCHY_HIGHER, HIERARCHY_CURRENT) \ +do \ +{ \ + if (HIERARCHY_HIGHER() != OK) \ + return ERROR; \ + while (tokenClass[*tok] == HIERARCHY_CURRENT) \ + { \ + TOKEN t = *tok++; \ + if (HIERARCHY_HIGHER() != OK) \ + return ERROR; \ + *evalTokenBuffer.u32++ = t; \ + } \ +}while (0) + int expr0(void) { - if (expr1() != OK) - return ERROR; - - while (tokenClass[*tok] >= MULT) + if ( correctMathRules == 0 ) { - TOKEN t = *tok++; - if (expr1() != OK) return ERROR; - *evalTokenBuffer.u32++ = t; + while (tokenClass[*tok] >= MULT) + { + TOKEN t = *tok++; + + if (expr1() != OK) + return ERROR; + + *evalTokenBuffer.u32++ = t; + } } + else + { + // The order of C precedence (lower to higher): + // bitwise XOR ^ + // bitwise OR | + // bitwise AND & + // relational = < <= >= > != + // shifts << >> + // sum + - + // product * / + precedence(xor, OR); + } + return OK; +} +int xor(void) +{ + precedence(and, XOR); + return OK; +} + +int and(void) +{ + precedence(rel, AND); + return OK; +} + +int rel(void) +{ + precedence(shift, REL); + return OK; +} + +int shift(void) +{ + precedence(sum, SHIFT); + return OK; +} + +int sum(void) +{ + precedence(product, ADD); + return OK; +} + +int product(void) +{ + precedence(expr1, MULT); return OK; }