From ecbc58fb917c292f05bed401afe7be0a80971d80 Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Wed, 23 Sep 2015 17:53:39 +0200 Subject: different operators can have the same precedence now * SciTECO now has the same operator precedence table as C. * It is numerically important whether different operators have the same precedence. E.g. "5*2/4" used to be evaluated by SciTECO as "5*(2/4)" since division had a higher precedence than multiplication. Within in real (!) numbers this would be the expected evaluation order. Users of other programming languages however would expect the expression to be evaluated as "(5*2)/4" which makes a numerical difference when working with integers. * Operator precedence has been implemented by encoding it into the enumeration values used to represent different operators. Calculating the precedence of a given operator can then be done very efficiently and elegantly (in our case using a plain right shift operation). * documentation updated. We use a precedence table now. --- src/expressions.h | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) (limited to 'src/expressions.h') diff --git a/src/expressions.h b/src/expressions.h index f97ec1c..e49880c 100644 --- a/src/expressions.h +++ b/src/expressions.h @@ -150,31 +150,45 @@ public: } }; -/* +/** * Arithmetic expression stacks */ extern class Expressions { public: - /* reflects also operator precedence */ + /** + * Operator type. + * The enumeration value divided by 16 represents + * its precedence (the lower, the higher). + * In other words, the value's lower nibble is + * reserved for enumerating operators of the + * same precedence. + */ enum Operator { - OP_NIL = 0, - OP_POW, // ^* - OP_MOD, // ^/ + OP_NIL = 0, + OP_POW = 0x10, // ^* + OP_MOD = 0x20, // ^/ OP_DIV, // / OP_MUL, // * - OP_SUB, // - + OP_SUB = 0x30, // - OP_ADD, // + - OP_AND, // & - OP_XOR, // ^# - OP_OR, // # + OP_AND = 0x40, // & + OP_XOR = 0x50, // ^# + OP_OR = 0x60, // # // pseudo operators: - OP_NEW, + OP_NEW = 0xF0, OP_BRACE, OP_LOOP, OP_NUMBER }; private: + /** Get operator precedence */ + inline gint + precedence(Operator op) + { + return op >> 4; + } + ValueStack numbers; ValueStack operators; -- cgit v1.2.3