2333**+
может быть неожиданным, но на самом деле это не так, просто неправильно ассоциируется.
То, как вы вычисляете приоритет, вы сообщаете алгоритму, что случай, когда aRHS == '*' && aLHS == '*'
равен false
, т.е. оператор не является левоассоциативным. Это. То же самое для всех остальных случаев, когда операторы равны, , кроме ^
, которые вы ошибочно делаете левоассоциативными, когда они ассоциативно справа.
При определении приоритета в этом алгоритме принято использовать таблицу, а не цепочку if-else, и проверять наличие> =, а не> с точки зрения приоритета.
Версия алгоритма Dijkstra Shunting-yard, приведенная в Википедии, имеет это вместо вашего условия:
while ((there is a function at the top of the operator stack)
or (there is an operator at the top of the operator stack with greater precedence)
or (the operator at the top of the operator stack has equal precedence and is left associative))
and (the operator at the top of the operator stack is not a left bracket):
pop operators from the operator stack onto the output queue.