mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 11:09:42 +02:00
* Fixed known memory leaks, removed some debug statements and change TJSPrimaryExpressionIdent.AString -> name
git-svn-id: trunk@26822 -
This commit is contained in:
parent
5c158507cf
commit
cc88c609c8
@ -1,6 +1,6 @@
|
||||
unit jsparser;
|
||||
|
||||
{$define debugparser}
|
||||
{ $define debugparser}
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
interface
|
||||
@ -140,6 +140,7 @@ Type
|
||||
Public
|
||||
Constructor Create(AInput: TStream);
|
||||
Constructor Create(AScanner : TJSScanner);
|
||||
Destructor Destroy; override;
|
||||
Function Parse : TJSElement;
|
||||
Function ParseProgram : TJSFunctionDeclarationStatement;
|
||||
Function CurrentToken : TJSToken;
|
||||
@ -182,18 +183,18 @@ Resourcestring
|
||||
|
||||
{ TJSScanner }
|
||||
|
||||
function TJSParser.CurrentToken: TJSToken;
|
||||
Function TJSParser.CurrentToken: TJSToken;
|
||||
|
||||
begin
|
||||
Result:=FCurrent;
|
||||
end;
|
||||
|
||||
function TJSParser.CurrentTokenString: String;
|
||||
Function TJSParser.CurrentTokenString: String;
|
||||
begin
|
||||
Result:=FCurrentString;
|
||||
end;
|
||||
|
||||
function TJSParser.GetNextToken: TJSToken;
|
||||
Function TJSParser.GetNextToken: TJSToken;
|
||||
begin
|
||||
FPrevious:=FCurrent;
|
||||
If (FPeekToken<>tjsunknown) then
|
||||
@ -211,7 +212,7 @@ begin
|
||||
{$ifdef debugparser}Writeln('GetNextToken (',FScanner.CurLine,',',FScanner.CurColumn,'): ',GetEnumName(TypeInfo(TJSToken),Ord(FCurrent)), ' As string: ',FCurrentString);{$endif debugparser}
|
||||
end;
|
||||
|
||||
function TJSParser.PeekNextToken: TJSToken;
|
||||
Function TJSParser.PeekNextToken: TJSToken;
|
||||
begin
|
||||
If (FPeekToken=tjsUnknown) then
|
||||
begin
|
||||
@ -222,13 +223,13 @@ begin
|
||||
Result:=FPeekToken;
|
||||
end;
|
||||
|
||||
function TJSParser.IsEndOfLine: Boolean;
|
||||
Function TJSParser.IsEndOfLine: Boolean;
|
||||
begin
|
||||
Result:=FScanner.IsEndOfLine;
|
||||
end;
|
||||
|
||||
|
||||
function TJSParser.CurPos: Integer;
|
||||
Function TJSParser.CurPos: Integer;
|
||||
begin
|
||||
If Assigned(FScanner) then
|
||||
Result:=FScanner.CurColumn
|
||||
@ -236,7 +237,7 @@ begin
|
||||
Result:=0;
|
||||
end;
|
||||
|
||||
function TJSParser.CurLine: Integer;
|
||||
Function TJSParser.CurLine: Integer;
|
||||
begin
|
||||
If Assigned(FScanner) then
|
||||
Result:=FScanner.CurRow
|
||||
@ -252,12 +253,12 @@ begin
|
||||
Result:='';
|
||||
end;
|
||||
|
||||
procedure TJSParser.CheckParser;
|
||||
Procedure TJSParser.CheckParser;
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
Procedure TJSParser.LeaveLabel;
|
||||
procedure TJSParser.LeaveLabel;
|
||||
|
||||
Var
|
||||
L : TJSLabel;
|
||||
@ -324,7 +325,7 @@ begin
|
||||
Result:=L;
|
||||
end;
|
||||
|
||||
function TJSParser.CurrentLabelSet: TJSLabelSet;
|
||||
Function TJSParser.CurrentLabelSet: TJSLabelSet;
|
||||
|
||||
Var
|
||||
LS : TJSLabelSet;
|
||||
@ -344,12 +345,12 @@ begin
|
||||
Result:=FCurrentLabelSet;
|
||||
end;
|
||||
|
||||
function TJSParser.CreateElement(AElementClass: TJSElementClass): TJSElement;
|
||||
Function TJSParser.CreateElement(AElementClass: TJSElementClass): TJSElement;
|
||||
begin
|
||||
Result:=AElementClass.Create(CurLine,CurPos,CurSource);
|
||||
end;
|
||||
|
||||
procedure TJSParser.Error(Msg: String);
|
||||
Procedure TJSParser.Error(Msg: String);
|
||||
|
||||
Var
|
||||
ErrAt : String;
|
||||
@ -363,12 +364,12 @@ begin
|
||||
Raise Exception.Create(ErrAt+Msg)
|
||||
end;
|
||||
|
||||
procedure TJSParser.Error(Fmt: String; Args: array of const);
|
||||
Procedure TJSParser.Error(Fmt: String; Args: Array of const);
|
||||
begin
|
||||
Error(Format(Fmt,Args));
|
||||
end;
|
||||
|
||||
constructor TJSParser.Create(AInput: TStream);
|
||||
Constructor TJSParser.Create(AInput: TStream);
|
||||
begin
|
||||
FInput:=AInput;
|
||||
FCurrent:=TJSUnknown;
|
||||
@ -376,16 +377,23 @@ begin
|
||||
FFreeScanner:=True;
|
||||
end;
|
||||
|
||||
constructor TJSParser.Create(AScanner: TJSScanner);
|
||||
Constructor TJSParser.Create(AScanner: TJSScanner);
|
||||
begin
|
||||
FCurrent:=TJSUnknown;
|
||||
FScanner:=AScanner;
|
||||
FFreeScanner:=False;
|
||||
end;
|
||||
|
||||
Destructor TJSParser.Destroy;
|
||||
begin
|
||||
if FFreeScanner then
|
||||
FreeAndNil(FScanner);
|
||||
inherited;
|
||||
end;
|
||||
|
||||
|
||||
Procedure TJSParser.Expect(aToken : TJSToken);
|
||||
|
||||
procedure TJSParser.Expect(aToken: TJSToken);
|
||||
|
||||
begin
|
||||
{$ifdef debugparser} Writeln('Expecting : ',GetEnumName(TypeInfo(TJSToken),Ord(AToken)), ' As string: ',TokenInfos[AToken]);{$endif debugparser}
|
||||
@ -406,7 +414,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TJSParser.Consume(aToken: TJSToken; AllowSemiColonInsert : Boolean = False);
|
||||
procedure TJSParser.Consume(aToken: TJSToken; AllowSemicolonInsert: Boolean);
|
||||
begin
|
||||
{$ifdef debugparser} Writeln('Consuming : ',GetEnumName(TypeInfo(TJSToken),Ord(AToken)), ' As string: ',TokenInfos[AToken]);{$endif debugparser}
|
||||
Expect(aToken);
|
||||
@ -540,7 +548,7 @@ begin
|
||||
{$ifdef debugparser} Writeln('<<< ParseBlock');{$endif debugparser}
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseArrayLiteral : TJSElement;
|
||||
function TJSParser.ParseArrayLiteral: TJSElement;
|
||||
|
||||
Var
|
||||
N : TJSArrayLiteral;
|
||||
@ -577,7 +585,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseObjectLiteral : TJSElement;
|
||||
function TJSParser.ParseObjectLiteral: TJSElement;
|
||||
|
||||
Var
|
||||
N : TJSObjectLiteral;
|
||||
@ -615,7 +623,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseNumericLiteral : TJSElement;
|
||||
function TJSParser.ParseNumericLiteral: TJSElement;
|
||||
|
||||
Var
|
||||
L : TJSLiteral;
|
||||
@ -639,7 +647,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseStringLiteral : TJSElement;
|
||||
function TJSParser.ParseStringLiteral: TJSElement;
|
||||
|
||||
Var
|
||||
L : TJSLiteral;
|
||||
@ -660,7 +668,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseRegularExpressionLiteral : TJSElement;
|
||||
function TJSParser.ParseRegularExpressionLiteral: TJSElement;
|
||||
|
||||
Var
|
||||
S,pa,fl : String;
|
||||
@ -693,7 +701,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseLiteral : TJSElement;
|
||||
function TJSParser.ParseLiteral: TJSElement;
|
||||
|
||||
Var
|
||||
L : TJSLiteral;
|
||||
@ -724,7 +732,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
Function TJSParser.ParsePrimaryExpression : TJSElement;
|
||||
function TJSParser.ParsePrimaryExpression: TJSElement;
|
||||
|
||||
Var
|
||||
R : TJSPrimaryExpressionIdent;
|
||||
@ -743,18 +751,16 @@ begin
|
||||
begin
|
||||
R:=TJSPrimaryExpressionIdent(CreateElement(TJSPrimaryExpressionIdent));
|
||||
Result:=R;
|
||||
R.AString:=CurrentTokenString;
|
||||
R.Name:=CurrentTokenString;
|
||||
GetNextToken;
|
||||
end;
|
||||
tjsSquaredBraceOpen: Result:=ParseArrayLiteral;
|
||||
tjsCurlyBraceOpen: Result:=ParseObjectLiteral;
|
||||
tjsBraceOpen:
|
||||
begin
|
||||
Writeln('Found brace !!');
|
||||
Consume(tjsBraceOpen);
|
||||
Result:=ParseExpression;
|
||||
Consume(tjsBraceClose);
|
||||
Writeln('Closed brace !!');
|
||||
end;
|
||||
else
|
||||
Result:=ParseLiteral;
|
||||
@ -767,7 +773,7 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
Function TJSParser.ParseMemberExpression : TJSElement;
|
||||
function TJSParser.ParseMemberExpression: TJSElement;
|
||||
|
||||
Var
|
||||
M : TJSDotMemberExpression;
|
||||
@ -821,7 +827,7 @@ begin
|
||||
{$ifdef debugparser} Writeln('Exit ParseMemberExpression');{$endif debugparser}
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseArguments : TJSarguments;
|
||||
function TJSParser.ParseArguments: TJSarguments;
|
||||
|
||||
Var
|
||||
E : TJSArrayLiteralElement;
|
||||
@ -847,7 +853,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseLeftHandSideExpression : TJSElement;
|
||||
function TJSParser.ParseLeftHandSideExpression: TJSElement;
|
||||
|
||||
Var
|
||||
M : TJSDotMemberExpression;
|
||||
@ -888,7 +894,6 @@ begin
|
||||
end;
|
||||
tjsBraceOpen:
|
||||
begin
|
||||
Writeln('Call expression !!');
|
||||
C:=TJSCallExpression(CreateElement(TJSCallExpression));
|
||||
C.Expr:=Result;
|
||||
Result:=C;
|
||||
@ -907,7 +912,7 @@ begin
|
||||
{$ifdef debugparser} Writeln('Exit ParseLeftHandSideExpression');{$endif debugparser}
|
||||
end;
|
||||
|
||||
Function TJSParser.ParsePostFixExpression : TJSElement;
|
||||
function TJSParser.ParsePostFixExpression: TJSElement;
|
||||
Var
|
||||
R : TJSUnaryExpression;
|
||||
|
||||
@ -933,7 +938,7 @@ begin
|
||||
{$ifdef debugparser} Writeln('Exit ParsePostfixExpression');{$endif debugparser}
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseUnaryExpression : TJSElement;
|
||||
function TJSParser.ParseUnaryExpression: TJSElement;
|
||||
|
||||
Var
|
||||
C : TJSElementClass;
|
||||
@ -973,7 +978,7 @@ begin
|
||||
{$ifdef debugparser} Writeln('Exit ParseUnaryExpression');{$endif debugparser}
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseMultiplicativeExpression : TJSElement;
|
||||
function TJSParser.ParseMultiplicativeExpression: TJSElement;
|
||||
|
||||
Var
|
||||
C : TJSElementClass;
|
||||
@ -1005,7 +1010,7 @@ begin
|
||||
{$ifdef debugparser} Writeln('Exit ParseMultiplicativeExpression');{$endif debugparser}
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseAdditiveExpression : TJSElement;
|
||||
function TJSParser.ParseAdditiveExpression: TJSElement;
|
||||
|
||||
Var
|
||||
C : TJSElementClass;
|
||||
@ -1035,7 +1040,7 @@ begin
|
||||
{$ifdef debugparser} Writeln('Exit ParseAdditiveExpression');{$endif debugparser}
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseShiftExpression : TJSElement;
|
||||
function TJSParser.ParseShiftExpression: TJSElement;
|
||||
|
||||
Var
|
||||
C : TJSElementClass;
|
||||
@ -1066,7 +1071,7 @@ begin
|
||||
{$ifdef debugparser} Writeln('Exit ParseShiftExpression');{$endif debugparser}
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseRelationalExpression: TJSElement;
|
||||
function TJSParser.ParseRelationalExpression: TJSElement;
|
||||
|
||||
Var
|
||||
S : Set of TJSToken;
|
||||
@ -1104,7 +1109,7 @@ begin
|
||||
{$ifdef debugparser} Writeln('Exit ParseRelationalExpression');{$endif debugparser}
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseEqualityExpression: TJSElement;
|
||||
function TJSParser.ParseEqualityExpression: TJSElement;
|
||||
|
||||
Var
|
||||
C : TJSElementClass;
|
||||
@ -1137,7 +1142,7 @@ begin
|
||||
{$ifdef debugparser} Writeln('Exit ParseEqualityExpression');{$endif debugparser}
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseBitwiseAndExpression : TJSElement;
|
||||
function TJSParser.ParseBitwiseAndExpression: TJSElement;
|
||||
|
||||
Var
|
||||
L : TJSBitwiseAndExpression;
|
||||
@ -1161,7 +1166,7 @@ begin
|
||||
{$ifdef debugparser} Writeln('Exit ParseBitwiseAndExpression');{$endif debugparser}
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseBitwiseXORExpression : TJSElement;
|
||||
function TJSParser.ParseBitwiseXORExpression: TJSElement;
|
||||
|
||||
Var
|
||||
L : TJSBitwiseXOrExpression;
|
||||
@ -1185,7 +1190,7 @@ begin
|
||||
{$ifdef debugparser} Writeln('Exit ParseBitwiseXorExpression');{$endif debugparser}
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseBitwiseORExpression : TJSElement;
|
||||
function TJSParser.ParseBitwiseORExpression: TJSElement;
|
||||
|
||||
Var
|
||||
L : TJSBitwiseOrExpression;
|
||||
@ -1209,7 +1214,7 @@ begin
|
||||
{$ifdef debugparser} Writeln('Exit ParseBitWiseOrExpression');{$endif debugparser}
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseLogicalAndExpression : TJSElement;
|
||||
function TJSParser.ParseLogicalAndExpression: TJSElement;
|
||||
|
||||
Var
|
||||
L : TJSLogicalAndExpression;
|
||||
@ -1233,7 +1238,7 @@ begin
|
||||
{$ifdef debugparser} Writeln('Exit ParseLogicalAndExpression');{$endif debugparser}
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseLogicalORExpression : TJSElement;
|
||||
function TJSParser.ParseLogicalORExpression: TJSElement;
|
||||
|
||||
Var
|
||||
L : TJSLogicalOrExpression;
|
||||
@ -1245,13 +1250,10 @@ begin
|
||||
If (CurrentToken<>tjsOROR) then
|
||||
exit;
|
||||
GetNextToken;
|
||||
Writeln('a');
|
||||
L:=TJSLogicalOrExpression(CreateElement(TJSLogicalOrExpression));
|
||||
L.A:=Result;
|
||||
Writeln('B');
|
||||
Result:=L;
|
||||
L.B:=ParseLogicalOrExpression();
|
||||
Writeln('C');
|
||||
IsLHS:=False;
|
||||
except
|
||||
FreeAndNil(Result);
|
||||
@ -1260,7 +1262,7 @@ begin
|
||||
{$ifdef debugparser} Writeln('Exit ParseLogicalOrExpression');{$endif debugparser}
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseConditionalExpression : TJSElement;
|
||||
function TJSParser.ParseConditionalExpression: TJSElement;
|
||||
|
||||
Var
|
||||
N : TJSConditionalExpression;
|
||||
@ -1290,7 +1292,7 @@ begin
|
||||
{$ifdef debugparser} Writeln('Exit ParseConditionalExpression');{$endif debugparser}
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseAssignmentExpression : TJSElement;
|
||||
function TJSParser.ParseAssignmentExpression: TJSElement;
|
||||
|
||||
Var
|
||||
N : TJSElement;
|
||||
@ -1343,7 +1345,7 @@ begin
|
||||
{$ifdef debugparser} Writeln('Exit ParseAssignmentExpression');{$endif debugparser}
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseVariableDeclaration : TJSElement;
|
||||
function TJSParser.ParseVariableDeclaration: TJSElement;
|
||||
|
||||
Var
|
||||
V : TJSVarDeclaration;
|
||||
@ -1360,9 +1362,7 @@ begin
|
||||
V.Init:=ParseAssignmentExpression;
|
||||
end;
|
||||
Result:=V;
|
||||
Writeln('Adding variable ',V.Name);
|
||||
FCurrentVars.AddNode.Node:=Result;
|
||||
Writeln('Current var count: ',FCurrentVars.Count);
|
||||
except
|
||||
FreeAndNil(V);
|
||||
Raise;
|
||||
@ -1370,14 +1370,14 @@ begin
|
||||
{$ifdef debugparser} Writeln('Exit ParseVariableDeclaration');{$endif debugparser}
|
||||
end;
|
||||
|
||||
Function TJSParser.ParseVariableDeclarationList : TJSElement;
|
||||
function TJSParser.ParseVariableDeclarationList: TJSElement;
|
||||
|
||||
Var
|
||||
E,N : TJSElement;
|
||||
L : TJSVariableDeclarationList;
|
||||
|
||||
begin
|
||||
Writeln('ParseVariableDeclarationList entry');
|
||||
{$ifdef debugparser} Writeln('ParseVariableDeclarationList entry');{$endif debugparser}
|
||||
E:=ParseVariableDeclaration;
|
||||
If (CurrentToken<>tjsComma) then
|
||||
Result:=E
|
||||
@ -1395,7 +1395,7 @@ begin
|
||||
Raise;
|
||||
end;
|
||||
end;
|
||||
Writeln('ParseVariableDeclarationList exit');
|
||||
{$ifdef debugparser} Writeln('ParseVariableDeclarationList exit');{$endif debugparser}
|
||||
end;
|
||||
|
||||
function TJSParser.ParseVariableStatement : TJSElement;
|
||||
@ -1405,7 +1405,7 @@ Var
|
||||
V : TJSVariableStatement;
|
||||
|
||||
begin
|
||||
Writeln('ParseVariableStatement entry');
|
||||
{$ifdef debugparser} Writeln('ParseVariableStatement entry');{$endif debugparser}
|
||||
Result:=Nil;
|
||||
Consume(tjsVar);
|
||||
Result:=ParseVariableDeclarationList;
|
||||
@ -1418,7 +1418,7 @@ begin
|
||||
FreeAndNil(Result);
|
||||
Raise;
|
||||
end;
|
||||
Writeln('ParseVariableStatement exit');
|
||||
{$ifdef debugparser} Writeln('ParseVariableStatement exit');{$endif debugparser}
|
||||
end;
|
||||
|
||||
function TJSParser.ParseEmptyStatement : TJSElement;
|
||||
@ -1574,6 +1574,7 @@ begin
|
||||
end; // Case
|
||||
Finally
|
||||
LeaveLabel;
|
||||
FreeCurrentLabelSet;
|
||||
end;
|
||||
except
|
||||
FreeAndNil(N);
|
||||
@ -1877,7 +1878,7 @@ begin
|
||||
try
|
||||
F:=ParseFunctionExpression;
|
||||
I:=TJSPrimaryExpressionIdent(CreateElement(TJSPrimaryExpressionIdent));
|
||||
I.AString:=F.AFunction.Name;
|
||||
I.Name:=F.AFunction.Name;
|
||||
A:=TJSAssignStatement(CreateElement(TJSAssignStatement));
|
||||
A.LHS:=I;
|
||||
I:=Nil;
|
||||
@ -2110,7 +2111,7 @@ begin
|
||||
{$ifdef debugparser} Writeln('<<< Exiting FunctionBody');{$endif}
|
||||
end;
|
||||
|
||||
function TJSParser.ParseProgram : TJSFunctionDeclarationStatement;
|
||||
Function TJSParser.ParseProgram: TJSFunctionDeclarationStatement;
|
||||
|
||||
Var
|
||||
F : TJSFunctionDeclarationStatement;
|
||||
@ -2127,7 +2128,7 @@ begin
|
||||
{$ifdef debugparser} Writeln('<<< Exiting FunctionDeclarationStatement');{$endif}
|
||||
end;
|
||||
|
||||
function TJSParser.Parse: TJSElement;
|
||||
Function TJSParser.Parse: TJSElement;
|
||||
|
||||
Var
|
||||
Body : TJSElement;
|
||||
|
Loading…
Reference in New Issue
Block a user