fcl-passrc: fixed precedence of multiply and power

This commit is contained in:
mattias 2024-02-28 11:36:30 +01:00
parent f1bc31b057
commit 3822465e2f
3 changed files with 31 additions and 2 deletions
packages
fcl-passrc
pastojs/tests

View File

@ -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;

View File

@ -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');

View File

@ -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;