1414 */
1515package net .rptools .parser ;
1616
17- import static net .rptools .parser .ExpressionParserTokenTypes .ASSIGNEE ;
18- import static net .rptools .parser .ExpressionParserTokenTypes .FUNCTION ;
19- import static net .rptools .parser .ExpressionParserTokenTypes .HEXNUMBER ;
20- import static net .rptools .parser .ExpressionParserTokenTypes .NUMBER ;
21- import static net .rptools .parser .ExpressionParserTokenTypes .OPERATOR ;
22- import static net .rptools .parser .ExpressionParserTokenTypes .STRING ;
23- import static net .rptools .parser .ExpressionParserTokenTypes .UNARY_OPERATOR ;
24- import static net .rptools .parser .ExpressionParserTokenTypes .VARIABLE ;
17+ import static net .rptools .parser .ExpressionParserTokenTypes .*;
2518
2619import antlr .collections .AST ;
2720import java .util .HashMap ;
@@ -35,12 +28,23 @@ public class InlineTreeFormatter {
3528
3629 static {
3730 // P(1) E(2) MD(3) AS(4):
38- ORDER_OF_OPERATIONS .put ("=" , 0 );
31+ // provide order-of for all operators as per
32+ // https://en.wikipedia.org/wiki/Order_of_operations#Programming_languages
33+ // Note that parser historically places operator = first
34+ ORDER_OF_OPERATIONS .put ("=" , 1 );
3935 ORDER_OF_OPERATIONS .put ("^" , 2 );
4036 ORDER_OF_OPERATIONS .put ("*" , 3 );
4137 ORDER_OF_OPERATIONS .put ("/" , 3 );
4238 ORDER_OF_OPERATIONS .put ("+" , 4 );
4339 ORDER_OF_OPERATIONS .put ("-" , 4 );
40+ ORDER_OF_OPERATIONS .put ("<" , 6 );
41+ ORDER_OF_OPERATIONS .put ("<=" , 6 );
42+ ORDER_OF_OPERATIONS .put (">" , 6 );
43+ ORDER_OF_OPERATIONS .put (">=" , 6 );
44+ ORDER_OF_OPERATIONS .put ("==" , 7 );
45+ ORDER_OF_OPERATIONS .put ("!=" , 7 );
46+ ORDER_OF_OPERATIONS .put ("&&" , 11 );
47+ ORDER_OF_OPERATIONS .put ("||" , 13 );
4448 }
4549
4650 public String format (AST node ) throws EvaluationException , ParameterException {
@@ -50,6 +54,12 @@ public String format(AST node) throws EvaluationException, ParameterException {
5054 return sb .toString ();
5155 }
5256
57+ private int getOrderOfOperator (String op ) {
58+ Integer result = ORDER_OF_OPERATIONS .get (op );
59+ // revert to a default high order of for any not mapped operator
60+ return result == null ? Integer .MAX_VALUE : result ;
61+ }
62+
5363 private void format (AST node , StringBuilder sb ) throws EvaluationException , ParameterException {
5464 if (node == null ) return ;
5565
@@ -59,6 +69,8 @@ private void format(AST node, StringBuilder sb) throws EvaluationException, Para
5969 case VARIABLE :
6070 case NUMBER :
6171 case HEXNUMBER :
72+ case TRUE :
73+ case FALSE :
6274 {
6375 sb .append (node .getText ());
6476 return ;
@@ -73,12 +85,12 @@ private void format(AST node, StringBuilder sb) throws EvaluationException, Para
7385 }
7486 case OPERATOR :
7587 {
76- int currentLevel = ORDER_OF_OPERATIONS . get (node .getText ());
88+ int currentLevel = getOrderOfOperator (node .getText ());
7789
7890 AST child = node .getFirstChild ();
7991 while (child != null ) {
8092 if (child .getType () == OPERATOR ) {
81- int childLevel = ORDER_OF_OPERATIONS . get (child .getText ());
93+ int childLevel = getOrderOfOperator (child .getText ());
8294 if (currentLevel < childLevel ) sb .append ("(" );
8395 format (child , sb );
8496 if (currentLevel < childLevel ) sb .append (")" );
0 commit comments