fcl-js: parse power token

This commit is contained in:
mattias 2024-02-28 11:35:20 +01:00
parent 0a0f213b8b
commit 2d3d5eba4a
5 changed files with 31 additions and 5 deletions

View File

@ -1821,7 +1821,7 @@ begin
Result:=TJSPrimaryExpressionThis(CreateElement(TJSPrimaryExpressionThis)); Result:=TJSPrimaryExpressionThis(CreateElement(TJSPrimaryExpressionThis));
GetNextToken; GetNextToken;
end; end;
tjsidentifier: tjsIdentifier:
begin begin
R:=TJSPrimaryExpressionIdent(CreateElement(TJSPrimaryExpressionIdent)); R:=TJSPrimaryExpressionIdent(CreateElement(TJSPrimaryExpressionIdent));
Result:=R; Result:=R;

View File

@ -698,6 +698,11 @@ begin
Inc(TokenStr); Inc(TokenStr);
Result := tjsMulEq; Result := tjsMulEq;
end end
else if (TokenStr[0]='*') then
begin
Inc(TokenStr);
Result := tjsPower;
end
else else
Result := tjsMul; Result := tjsMul;
end; end;

View File

@ -28,7 +28,7 @@ type
tjsANDAND, tjsANDEQ, tjsANDAND, tjsANDEQ,
tjsBraceOpen,tjsBraceClose,tjsSQuaredBraceOpen,tjsSQuaredBraceClose,tjsCurlyBraceOpen,tjsCurlyBraceClose, tjsBraceOpen,tjsBraceClose,tjsSQuaredBraceOpen,tjsSQuaredBraceClose,tjsCurlyBraceOpen,tjsCurlyBraceClose,
tjsCOMMA,tjsCOLON, tjsDOT,tjsSEMICOLON, tjsASSIGN,tjsGT,tjsLT, tjsConditional, tjsCOMMA,tjsCOLON, tjsDOT,tjsSEMICOLON, tjsASSIGN,tjsGT,tjsLT, tjsConditional,
tjsPLUS,tjsMINUS,tjsMUL,tjsDIV,tjsAnd,tjsOR, tjsInv, tjsMod, tjsXOR, tjsNot, tjsPLUS,tjsMINUS,tjsMUL,tjsDIV,tjsPower, tjsAnd,tjsOR, tjsInv, tjsMod, tjsXOR, tjsNot,
tjsEQ, tjsEQ,
tjsGE, tjsGE,
tjsLE, tjsLSHIFT, tjsLSHIFTEQ, tjsLE, tjsLSHIFT, tjsLSHIFTEQ,
@ -66,7 +66,7 @@ const
'&&','&=', '&&','&=',
'(',')','[',']','{','}', '(',')','[',']','{','}',
',',':','.',';','=','>','<','?', ',',':','.',';','=','>','<','?',
'+','-','*','/','&','|','~','%','^','!', '+','-','*','/','**','&','|','~','%','^','!',
'==', '==',
'>=', '>=',
'<=', '<<', '<<=', '<=', '<<', '<<=',

View File

@ -707,6 +707,12 @@ Type
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSPowerExpression - e.g. A ** B }
TJSPowerExpression = Class(TJSBinaryExpression)
Class function OperatorToken : tjsToken; override;
end;
{ TJSCommaExpression - e.g. A , B } { TJSCommaExpression - e.g. A , B }
TJSCommaExpression = Class(TJSBinaryExpression) TJSCommaExpression = Class(TJSBinaryExpression)
@ -2720,6 +2726,13 @@ begin
Result:=tjsMod; Result:=tjsMod;
end; end;
{ TJSPowerExpression }
class function TJSPowerExpression.OperatorToken: tjsToken;
begin
Result:=tjsPower;
end;
{ TJSMultiplicativeExpressionDiv } { TJSMultiplicativeExpressionDiv }
Class function TJSMultiplicativeExpressionDiv.OperatorToken: tjsToken; Class function TJSMultiplicativeExpressionDiv.OperatorToken: tjsToken;

View File

@ -67,6 +67,7 @@ type
procedure TestCurlyBraceClose; procedure TestCurlyBraceClose;
procedure TestCurlyBraceOpen; procedure TestCurlyBraceOpen;
procedure TestDiv; procedure TestDiv;
procedure TestPower;
procedure TestDiveq; procedure TestDiveq;
procedure TestXor; procedure TestXor;
procedure TestXoreq; procedure TestXoreq;
@ -183,7 +184,8 @@ type
implementation implementation
Function TTestJSScanner.CreateScanner(AInput : TJSScannerString; aVersion : TECMAVersion = ecma5) : TJSScanner; function TTestJSScanner.CreateScanner(AInput: TJSScannerString;
aVersion: TECMAVersion): TJSScanner;
begin begin
FStream:=TStringStream.Create(AInput); FStream:=TStringStream.Create(AInput);
@ -365,6 +367,11 @@ begin
CheckToken(tjsDiv,'/'); CheckToken(tjsDiv,'/');
end; end;
procedure TTestJSScanner.TestPower;
begin
CheckToken(tjsPower,'**');
end;
procedure TTestJSScanner.TestEq; procedure TTestJSScanner.TestEq;
begin begin
@ -796,7 +803,8 @@ begin
CheckToken(tjsYield,'yield',ecma2021); CheckToken(tjsYield,'yield',ecma2021);
end; end;
procedure TTestJSScanner.CheckTokens(ASource : TJSScannerString; ATokens : Array of TJSToken; aVersion: TECMAVersion = ecma5); procedure TTestJSScanner.CheckTokens(ASource: TJSScannerString;
ATokens: array of TJSToken; aVersion: TECMAVersion);
Var Var
I : Integer; I : Integer;