Browse Source

fcl-passrc: fixed precedence of multiply and power

mattias 1 year ago
parent
commit
3822465e2f

+ 2 - 2
packages/fcl-passrc/src/pparser.pp

@@ -2872,9 +2872,9 @@ begin
   case t of
   //  tkDot:
   //    Result:=5;
-    tknot,tkAt,tkAtAt:
+    tknot, tkAt, tkAtAt, tkPower:
       Result:=4;
-    tkMul, tkDivision, tkdiv, tkmod, tkand, tkShl,tkShr, tkas, tkPower, tkis:
+    tkMul, tkDivision, tkdiv, tkmod, tkand, tkShl,tkShr, tkas, tkis:
       // Note that "is" has same precedence as "and" in Delphi and fpc, even though
       // some docs say otherwise. e.g. "Obj is TObj and aBool"
       Result:=3;

+ 14 - 0
packages/fcl-passrc/tests/tcexprparser.pas

@@ -142,6 +142,8 @@ type
     Procedure TestPrecedencePlusMod;
     Procedure TestPrecedenceMultiplyDiv;
     Procedure TestPrecedenceDivMultiply;
+    Procedure TestPrecedenceMultiplyPower;
+    Procedure TestPrecedencePowerMultiply;
     Procedure TestTypeCast;
     procedure TestTypeCast2;
     Procedure TestCreate;
@@ -583,6 +585,18 @@ begin
   AssertLeftPrecedence(1,eopDiv,2,eopMultiply,3);
 end;
 
+procedure TTestExpressions.TestPrecedenceMultiplyPower;
+begin
+  ParseExpression('1 * 2 ** 3');
+  AssertRightPrecedence(1,eopMultiply,2,eopPower,3);
+end;
+
+procedure TTestExpressions.TestPrecedencePowerMultiply;
+begin
+  ParseExpression('1 ** 2 * 3');
+  AssertLeftPrecedence(1,eopPower,2,eopMultiply,3);
+end;
+
 procedure TTestExpressions.TestTypeCast;
 begin
   DeclareVar('TSDOBaseDataObjectClass');

+ 15 - 0
packages/pastojs/tests/tcconverter.pas

@@ -112,6 +112,7 @@ type
     Procedure TestBinaryGreater;
     Procedure TestBinaryGreaterThanEqual;
     Procedure TestBinaryIs;
+    Procedure TestBinaryPower;
     Procedure TestCallExpressionNone;
     Procedure TestCallExpressionOne;
     Procedure TestCallExpressionTwo;
@@ -1167,6 +1168,20 @@ begin
   AssertIdentifier('Correct right literal for is',E.B,'b');
 end;
 
+procedure TTestExpressionConverter.TestBinaryPower;
+Var
+  B : TBinaryExpr;
+  E : TJSRelationalExpressionInstanceOf;
+
+begin
+  B:=CreateBinary(eopPower);
+  B.left:=CreateIdent('a');
+  B.Right:=CreateIdent('b');
+  E:=TJSRelationalExpressionInstanceOf(TestBinaryExpression(B,TJSRelationalExpressionInstanceOf));
+  AssertIdentifier('Correct left literal for power',E.A,'a');
+  AssertIdentifier('Correct right literal for power',E.B,'b');
+end;
+
 procedure TTestExpressionConverter.TestCallExpressionNone;
 Var
   B : TParamsExpr;