diff --git a/packages/fcl-js/src/jsparser.pp b/packages/fcl-js/src/jsparser.pp index c17d83d279..c231635e6d 100644 --- a/packages/fcl-js/src/jsparser.pp +++ b/packages/fcl-js/src/jsparser.pp @@ -6,46 +6,13 @@ unit jsparser; interface uses - Classes, SysUtils, jsscanner, jstree; + Classes, SysUtils, jsscanner, jstree, jstoken; Const SEmptyLabel = ''; Type - - { TJSLabelSet } - - TJSLabelSet = Class(TObject) - private - FCOnt: Boolean; - FNext: TJSLabelSet; - FTarget: Cardinal; - Public - Property Target : Cardinal Read FTarget Write FTarget; - Property Next : TJSLabelSet Read FNext Write FNext; // Linked list - Property Continuable : Boolean Read FCOnt Write FCont; - end; - - { TJSLabel } - - TJSLabel = Class(TObject) - private - FLabelSet: TJSLabelSet; - FLocationLine: Integer; - FLocationPos: Integer; - FLocationSource: String; - FName: String; - FNext: TJSLabel; - Public - Property Name : String Read FName Write FName; - Property LabelSet : TJSLabelSet Read FLabelSet Write FLabelSet; - Property LocationSource : String Read FLocationSource Write FLocationSource; - Property LocationLine : Integer Read FLocationLine Write FLocationLine; - Property LocationPos : Integer Read FLocationPos Write FLocationPos; - Property Next : TJSLabel Read FNext Write FNext; - end; - { TJSParser } TJSParser = Class(TObject) @@ -601,7 +568,7 @@ begin begin While CurrentToken=tjsComma do GetNextToken; - If (CurrentToken in [tjsIdentifier,jsscanner.tjsString,tjsnumber]) then + If (CurrentToken in [tjsIdentifier,jstoken.tjsString,tjsnumber]) then begin E:=N.Elements.AddElement; E.Name:=CurrenttokenString; @@ -724,7 +691,7 @@ begin GetNextToken; end; tjsNumber : Result:=ParseNumericLiteral; - jsscanner.tjsString : Result:=ParseStringLiteral; + jstoken.tjsString : Result:=ParseStringLiteral; tjsDiv, tjsDivEq : Result:=ParseRegularExpressionLiteral else @@ -777,6 +744,7 @@ function TJSParser.ParseMemberExpression: TJSElement; Var M : TJSDotMemberExpression; + N : TJSNewMemberExpression; B : TJSBracketMemberExpression; C : TJSCallExpression; Done : Boolean; @@ -787,7 +755,16 @@ begin tjsFunction : Result:=ParseFunctionExpression(); tjsNew : begin GetNextToken; - Result:=ParseMemberExpression(); + N:=TJSNewMemberExpression(CreateElement(TJSNewMemberExpression)); + try + Result:=N; + N.Mexpr:=ParseMemberExpression(); + if (CurrentToken=tjsBraceOpen) then + N.Args:=ParseArguments; + except + FreeAndNil(N); + Raise; + end; end; else Result:=ParsePrimaryExpression() @@ -1481,7 +1458,7 @@ begin tjsDo : begin GetNextToken; - W:=TJSWhileStatement(CreateElement(TJSWhileStatement)); + W:=TJSDoWhileStatement(CreateElement(TJSDoWhileStatement)); Result:=W; W.Body:=ParseStatement; Consume(tjsWhile); @@ -1604,6 +1581,7 @@ begin end; Consume(tjsSemicolon,True); C.Target:=L.Labelset.Target; + C.TargetName:=L.Name; except FreeAndNil(C); Raise; @@ -1631,6 +1609,7 @@ begin end; Consume(tjsSemicolon,True); B.Target:=L.Labelset.Target; + B.TargetName:=L.Name; except FreeAndNil(B); Raise; @@ -1722,7 +1701,9 @@ begin Consume(tjsCurlyBraceClose); finally LeaveLabel; + FreeCurrentLabelSet; end; + Result:=N; except FreeAndNil(N); Raise; @@ -1753,7 +1734,7 @@ function TJSParser.ParseTryStatement : TJSElement; Var BO,BC,BF : TJSElement; - Id : TJSString; + Id : jstree.TJSString; T : TJSTryStatement; begin @@ -1913,7 +1894,7 @@ begin FCurrentLabelSet:=Nil; LS.target:=CurrentLabelSet.Target; Repeat - EnterLabel(CurrentTokenString); + LS.TheLabel:=EnterLabel(CurrentTokenString); Consume(tjsIdentifier); Consume(tjsColon); Until (CurrentToken<>tjsIdentifier) or (PeekNextToken<>tjsColon); @@ -2037,13 +2018,13 @@ function TJSParser.ParseSourceElements : TJSSourceElements; Const StatementTokens = [tjsNULL, tjsTRUE, tjsFALSE, - tjsTHIS, tjsIdentifier,jsscanner.tjsSTRING,tjsNUMBER, + tjsTHIS, tjsIdentifier,jstoken.tjsSTRING,tjsNUMBER, tjsBraceOpen,tjsCurlyBraceOpen,tjsSquaredBraceOpen, tjsNew,tjsDelete,tjsVoid,tjsTypeOf, tjsPlusPlus,tjsMinusMinus, tjsPlus,tjsMinus,tjsNot,tjsNE,tjsSNE,tjsSemicolon, - tjsVAR,tjsIF,tjsDO,tjsWHILE,tjsFOR,jsscanner.tjsCONTINUE,jsscanner.tjsBREAK,jsscanner.tjsReturn, - tjsWith,jsscanner.tjsSWITCH,tjsThrow,TjsTry,tjsDIV,tjsDIVEQ]; + tjsVAR,tjsIF,tjsDO,tjsWHILE,tjsFOR,jstoken.tjsCONTINUE,jstoken.tjsBREAK,jstoken.tjsReturn, + tjsWith,jstoken.tjsSWITCH,tjsThrow,TjsTry,tjsDIV,tjsDIVEQ]; Var F : TJSFunctionDeclarationStatement; @@ -2060,7 +2041,7 @@ begin FCurrentVars:=Result.Vars; Repeat {$ifdef debugparser} Writeln('Sourceelements start:',GetEnumName(TypeInfo(TJSToken),Ord(CurrentToken)), ' As string: ',CurrentTokenString);{$endif debugparser} - If (CurrentToken=jsscanner.tjsFunction) then + If (CurrentToken=jstoken.tjsFunction) then begin If (PeekNextToken<>tjsBraceOpen) then begin