From db510ba69e90039a9649a4bf3c8e6b7bdc5a09bd Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Thu, 24 Sep 2015 04:07:03 +0200 Subject: cleaned up operator precedence code * use small values for low precedence --- src/expressions.cpp | 2 +- src/expressions.h | 31 ++++++++++++++++++------------- 2 files changed, 19 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/expressions.cpp b/src/expressions.cpp index 6b1e8fe..b59b409 100644 --- a/src/expressions.cpp +++ b/src/expressions.cpp @@ -94,7 +94,7 @@ Expressions::push_calc(Expressions::Operator op) /* calculate if op has lower precedence than op on stack */ if (first >= 0 && - precedence(operators.peek(first)) <= precedence(op)) + precedence(op) <= precedence(operators.peek(first))) calc(); return push(op); diff --git a/src/expressions.h b/src/expressions.h index e49880c..f357a1d 100644 --- a/src/expressions.h +++ b/src/expressions.h @@ -158,27 +158,32 @@ public: /** * Operator type. * The enumeration value divided by 16 represents - * its precedence (the lower, the higher). + * its precedence (small values mean low precedence). * In other words, the value's lower nibble is * reserved for enumerating operators of the * same precedence. */ enum Operator { - OP_NIL = 0, - OP_POW = 0x10, // ^* - OP_MOD = 0x20, // ^/ + /* + * Pseudo operators + */ + OP_NIL = 0x00, + OP_NEW, + OP_BRACE, + OP_LOOP, + OP_NUMBER, + /* + * Real operators + */ + OP_POW = 0x60, // ^* + OP_MOD = 0x50, // ^/ OP_DIV, // / OP_MUL, // * - OP_SUB = 0x30, // - + OP_SUB = 0x40, // - OP_ADD, // + - OP_AND = 0x40, // & - OP_XOR = 0x50, // ^# - OP_OR = 0x60, // # - // pseudo operators: - OP_NEW = 0xF0, - OP_BRACE, - OP_LOOP, - OP_NUMBER + OP_AND = 0x30, // & + OP_XOR = 0x20, // ^# + OP_OR = 0x10 // # }; private: -- cgit v1.2.3