mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-19 20:19:25 +02:00
* Some clean-up patches by Mattias
git-svn-id: trunk@34204 -
This commit is contained in:
parent
ef1369fef2
commit
62f39e0037
@ -25,8 +25,6 @@ Type
|
||||
FPrevious,
|
||||
FCurrent : TJSToken;
|
||||
FCurrentString : String;
|
||||
FNextNewLine : Boolean;
|
||||
FNextBol : Boolean;
|
||||
FFreeScanner : Boolean;
|
||||
FCurrentVars : TJSElementNodes;
|
||||
FPeekToken: TJSToken;
|
||||
@ -557,8 +555,6 @@ function TJSParser.ParseObjectLiteral: TJSElement;
|
||||
Var
|
||||
N : TJSObjectLiteral;
|
||||
E : TJSObjectLiteralElement;
|
||||
I : Integer;
|
||||
|
||||
begin
|
||||
Consume(tjsCurlyBraceOpen);
|
||||
N:=TJSObjectLiteral(CreateElement(TJSObjectLiteral));
|
||||
@ -618,9 +614,6 @@ function TJSParser.ParseStringLiteral: TJSElement;
|
||||
|
||||
Var
|
||||
L : TJSLiteral;
|
||||
D : Double;
|
||||
I : Integer;
|
||||
|
||||
begin
|
||||
{$ifdef debugparser} Writeln('Parsing string literal');{$endif debugparser}
|
||||
Result:=Nil;
|
||||
@ -746,7 +739,6 @@ Var
|
||||
M : TJSDotMemberExpression;
|
||||
N : TJSNewMemberExpression;
|
||||
B : TJSBracketMemberExpression;
|
||||
C : TJSCallExpression;
|
||||
Done : Boolean;
|
||||
|
||||
begin
|
||||
@ -758,7 +750,7 @@ begin
|
||||
N:=TJSNewMemberExpression(CreateElement(TJSNewMemberExpression));
|
||||
try
|
||||
Result:=N;
|
||||
N.Mexpr:=ParseMemberExpression();
|
||||
N.MExpr:=ParseMemberExpression();
|
||||
if (CurrentToken=tjsBraceOpen) then
|
||||
N.Args:=ParseArguments;
|
||||
except
|
||||
@ -1378,7 +1370,6 @@ end;
|
||||
function TJSParser.ParseVariableStatement : TJSElement;
|
||||
|
||||
Var
|
||||
E : TJSElement;
|
||||
V : TJSVariableStatement;
|
||||
|
||||
begin
|
||||
@ -1429,7 +1420,7 @@ begin
|
||||
I:=TJSIfStatement(CreateElement(TJSIfStatement));
|
||||
I.Cond:=C;
|
||||
I.BTrue:=Btrue;
|
||||
I.bfalse:=BFalse;
|
||||
I.BFalse:=BFalse;
|
||||
Result:=I;
|
||||
except
|
||||
FreeAndNil(C);
|
||||
@ -1641,8 +1632,6 @@ function TJSParser.ParseWithStatement : TJSElement;
|
||||
|
||||
Var
|
||||
W : TJSWithStatement;
|
||||
N : TJSElement;
|
||||
|
||||
begin
|
||||
W:=TJSWithStatement(CreateElement(TJSWithStatement));
|
||||
try
|
||||
@ -1655,6 +1644,7 @@ begin
|
||||
FreeAndNil(W);
|
||||
Raise;
|
||||
end;
|
||||
Result:=W;
|
||||
end;
|
||||
|
||||
function TJSParser.ParseSwitchStatement : TJSElement;
|
||||
@ -1662,7 +1652,6 @@ function TJSParser.ParseSwitchStatement : TJSElement;
|
||||
|
||||
Var
|
||||
N : TJSSwitchStatement;
|
||||
C : TJSElement;
|
||||
Ca : TJSCaseElement;
|
||||
|
||||
begin
|
||||
@ -1883,8 +1872,6 @@ function TJSParser.ParseLabeledStatement : TJSElement;
|
||||
Var
|
||||
OL : TJSLabelSet;
|
||||
LS : TJSLabeledStatement;
|
||||
LN : String;
|
||||
|
||||
begin
|
||||
LS:=TJSLabeledStatement(CreateElement(TJSLabeledStatement));
|
||||
try
|
||||
@ -2046,7 +2033,7 @@ begin
|
||||
If (PeekNextToken<>tjsBraceOpen) then
|
||||
begin
|
||||
F:=Self.ParseFunctionDeclaration;
|
||||
Result.functions.AddNode.Node:=F;
|
||||
Result.Functions.AddNode.Node:=F;
|
||||
end
|
||||
else
|
||||
begin
|
||||
@ -2095,8 +2082,6 @@ end;
|
||||
Function TJSParser.ParseProgram: TJSFunctionDeclarationStatement;
|
||||
|
||||
Var
|
||||
F : TJSFunctionDeclarationStatement;
|
||||
FD : TJSFuncDef;
|
||||
B : TJSElement;
|
||||
begin
|
||||
{$ifdef debugparser} Writeln('>>> Entering FunctionDeclarationStatement');{$endif}
|
||||
|
@ -8,7 +8,7 @@ type
|
||||
|
||||
TJSToken = (tjsUnknown,
|
||||
// Specials
|
||||
tjsEOF,tjsWhiteSpace,tjsChar,tjsString, tjsIdentifier,tjsNumber, tjsComment,tjsREGEX, tjsRESERVED,
|
||||
tjsEOF,tjsWhiteSpace,tjsChar,tjsString{this bites TJSString}, tjsIdentifier,tjsNumber, tjsComment,tjsREGEX, tjsRESERVED,
|
||||
tjsANDAND, tjsANDEQ,
|
||||
tjsBraceOpen,tjsBraceClose,tjsSQuaredBraceOpen,tjsSQuaredBraceClose,tjsCurlyBraceOpen,tjsCurlyBraceClose,
|
||||
tjsCOMMA,tjsCOLON, tjsDOT,tjsSEMICOLON, tjsASSIGN,tjsGT,tjsLT, tjsConditional,
|
||||
|
@ -73,45 +73,47 @@ Type
|
||||
TJSObject = Class(TObject);
|
||||
|
||||
|
||||
{ TJSLabelSet }
|
||||
{ TJSLabelSet }
|
||||
|
||||
TJSLabelSet = Class(TJSObject)
|
||||
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;
|
||||
TJSLabelSet = Class(TJSObject)
|
||||
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 }
|
||||
|
||||
TJSLabel = Class(TJSObject)
|
||||
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;
|
||||
TJSLabel = Class(TJSObject)
|
||||
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;
|
||||
|
||||
{ TJSFuncDef }
|
||||
TJSString = jsbase.TJSString; // beware of jstoken.tjsString
|
||||
|
||||
{ TJSFuncDef - e.g. 'function Name(Params)Body' }
|
||||
|
||||
TJSFuncDef = Class(TJSObject)
|
||||
private
|
||||
FBody: TJSFunctionBody;
|
||||
FIsEmpty: Boolean;
|
||||
FName: String;
|
||||
FName: TJSString;
|
||||
FParams: TStrings;
|
||||
procedure SetParams(const AValue: TStrings);
|
||||
Public
|
||||
@ -119,13 +121,13 @@ Type
|
||||
Destructor Destroy; override;
|
||||
Property Params : TStrings Read FParams Write SetParams;
|
||||
Property Body : TJSFunctionBody Read FBody Write FBody;
|
||||
Property Name : String Read FName Write FName;
|
||||
Property Name : TJSString Read FName Write FName;
|
||||
Property IsEmpty : Boolean Read FIsEmpty Write FIsEmpty;
|
||||
end;
|
||||
|
||||
TJSString = WideString;
|
||||
{ TJSElement }
|
||||
|
||||
TJSElement = Class (TJSObject)
|
||||
TJSElement = Class(TJSObject)
|
||||
private
|
||||
FFlags: TJSElementFlags;
|
||||
FLine: Integer;
|
||||
@ -140,9 +142,12 @@ Type
|
||||
end;
|
||||
TJSElementClass = Class of TJSElement;
|
||||
|
||||
{ TJSEmptyBlockStatement }
|
||||
{ TJSEmptyBlockStatement - empty curly brackets }
|
||||
|
||||
TJSEmptyBlockStatement = Class(TJSElement);
|
||||
|
||||
{ TJSEmptyStatement - a dummy placeholder, needs sometimes a single semicolon }
|
||||
|
||||
TJSEmptyStatement = Class(TJSElement);
|
||||
|
||||
{ TJSLiteral }
|
||||
@ -156,15 +161,6 @@ Type
|
||||
Property Value : TJSValue Read FValue Write FValue;
|
||||
end;
|
||||
|
||||
(* { TJSStringLiteral }
|
||||
|
||||
TJSStringLiteral = Class(TJSElement)
|
||||
private
|
||||
FValue: TJSString;
|
||||
Public
|
||||
Property Value : TJSString Read FValue Write FValue;
|
||||
end;
|
||||
*)
|
||||
{ TJSRegularExpressionLiteral }
|
||||
|
||||
TJSRegularExpressionLiteral = Class(TJSElement)
|
||||
@ -182,18 +178,20 @@ Type
|
||||
Property Argv[AIndex : integer] : TJSValue Read GetA Write SetA;
|
||||
end;
|
||||
|
||||
{ TJSPrimaryExpressionIdent }
|
||||
TJSPrimaryExpression = Class(TJSElement);
|
||||
|
||||
TJSPrimaryExpressionThis = Class(TJSPrimaryExpression); // 'this'
|
||||
|
||||
{ TJSPrimaryExpressionIdent }
|
||||
|
||||
TJSPrimaryExpressionIdent = Class(TJSPrimaryExpression)
|
||||
private
|
||||
FName: TJSString;
|
||||
Public
|
||||
Property Name : TJSString Read FName Write FName;
|
||||
end;
|
||||
TJSPrimaryExpressionThis = Class(TJSPrimaryExpression);
|
||||
|
||||
{ TJSArrayLiteralElement }
|
||||
{ TJSArrayLiteralElement - an item of a TJSArrayLiteralElements }
|
||||
|
||||
TJSArrayLiteralElement = Class(TCollectionItem)
|
||||
private
|
||||
@ -205,7 +203,7 @@ Type
|
||||
Property ElementIndex : Integer Read FFindex Write FFIndex;
|
||||
end;
|
||||
|
||||
{ TJSArrayLiteralElements }
|
||||
{ TJSArrayLiteralElements - Elements property of TJSArrayLiteral }
|
||||
|
||||
TJSArrayLiteralElements = Class(TCollection)
|
||||
private
|
||||
@ -226,7 +224,7 @@ Type
|
||||
Property Elements : TJSArrayLiteralElements Read FElements;
|
||||
end;
|
||||
|
||||
{ TJSObjectLiteralElement }
|
||||
{ TJSObjectLiteralElement - an item of TJSObjectLiteralElements }
|
||||
|
||||
TJSObjectLiteralElement = Class(TCollectionItem)
|
||||
private
|
||||
@ -238,7 +236,7 @@ Type
|
||||
Property Name : TJSString Read FName Write FName;
|
||||
end;
|
||||
|
||||
{ TJSObjectLiteralElements }
|
||||
{ TJSObjectLiteralElements - Elements property of TJSObjectLiteral }
|
||||
|
||||
TJSObjectLiteralElements = Class(TCollection)
|
||||
private
|
||||
@ -263,17 +261,17 @@ Type
|
||||
|
||||
TJSArguments = Class(TJSArrayLiteral);
|
||||
|
||||
{ TJSMemberExpression }
|
||||
{ TJSMemberExpression - base class }
|
||||
|
||||
TJSMemberExpression = Class(TJSElement)
|
||||
private
|
||||
FMexpr: TJSElement;
|
||||
Public
|
||||
Destructor Destroy; override;
|
||||
Property Mexpr : TJSElement Read FMexpr Write FMexpr;
|
||||
Property MExpr : TJSElement Read FMexpr Write FMexpr;
|
||||
end;
|
||||
|
||||
{ TJSNewMemberExpression }
|
||||
{ TJSNewMemberExpression - e.g. 'new MExpr(Args)' }
|
||||
|
||||
TJSNewMemberExpression = Class(TJSMemberExpression)
|
||||
private
|
||||
@ -283,7 +281,7 @@ Type
|
||||
Property Args : TJSArguments Read FArgs Write FArgs;
|
||||
end;
|
||||
|
||||
{ TJSDotMemberExpression }
|
||||
{ TJSDotMemberExpression - e.g. 'MExpr.Name' }
|
||||
|
||||
TJSDotMemberExpression = Class(TJSMemberExpression)
|
||||
private
|
||||
@ -292,7 +290,7 @@ Type
|
||||
Property Name : TJSString Read FName Write FName;
|
||||
end;
|
||||
|
||||
{ TJSBracketMemberExpression }
|
||||
{ TJSBracketMemberExpression - e.g. 'MExpr[Name]' }
|
||||
|
||||
TJSBracketMemberExpression = Class(TJSMemberExpression)
|
||||
private
|
||||
@ -302,7 +300,7 @@ Type
|
||||
Property Name : TJSElement Read FName Write FName;
|
||||
end;
|
||||
|
||||
{ TJSCallExpression }
|
||||
{ TJSCallExpression - e.g. 'Expr(Args)'}
|
||||
|
||||
TJSCallExpression = Class(TJSElement)
|
||||
private
|
||||
@ -314,7 +312,7 @@ Type
|
||||
Property Args : TJSArguments Read FArgs Write FArgs;
|
||||
end;
|
||||
|
||||
{ TJSUnary }
|
||||
{ TJSUnary - e.g. 'PrefixOperator A PostFixOperator', '--i' }
|
||||
|
||||
TJSUnary = Class(TJSElement)
|
||||
private
|
||||
@ -329,87 +327,103 @@ Type
|
||||
end;
|
||||
TJSUnaryClass = class of TJSUnary;
|
||||
|
||||
{ TJSVariableStatement }
|
||||
{ TJSVariableStatement - e.g. 'var A' }
|
||||
|
||||
TJSVariableStatement = Class(TJSUnary);
|
||||
|
||||
{ TJSExpressionStatement - ? }
|
||||
|
||||
TJSExpressionStatement = Class(TJSUnary);
|
||||
|
||||
{ TJSThrowStatement }
|
||||
{ TJSThrowStatement - e.g. 'throw A' }
|
||||
|
||||
TJSThrowStatement = Class(TJSUnary)
|
||||
Public
|
||||
Class function PrefixOperatorToken : tjsToken; Override;
|
||||
end;
|
||||
|
||||
TJSUnaryExpression = Class(TJSUnary);
|
||||
|
||||
{ TJSUnaryDeleteExpression }
|
||||
{ TJSUnaryDeleteExpression - e.g. 'delete A' }
|
||||
|
||||
TJSUnaryDeleteExpression = Class(TJSUnaryExpression)
|
||||
Public
|
||||
Class function PrefixOperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSUnaryVoidExpression }
|
||||
{ TJSUnaryVoidExpression - e.g. 'void A' }
|
||||
|
||||
TJSUnaryVoidExpression = Class(TJSUnaryExpression)
|
||||
Public
|
||||
Class function PrefixOperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSUnaryTypeOfExpression }
|
||||
{ TJSUnaryTypeOfExpression - e.g. 'typeof A' }
|
||||
|
||||
TJSUnaryTypeOfExpression = Class(TJSUnaryExpression)
|
||||
Public
|
||||
Class function PrefixOperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSUnaryPrePlusPlusExpression }
|
||||
{ TJSUnaryPrePlusPlusExpression - e.g. '++A' }
|
||||
|
||||
TJSUnaryPrePlusPlusExpression = Class(TJSUnaryExpression)
|
||||
Public
|
||||
Class function PrefixOperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSUnaryPreMinusMinusExpression }
|
||||
{ TJSUnaryPreMinusMinusExpression - e.g. '--A' }
|
||||
|
||||
TJSUnaryPreMinusMinusExpression = Class(TJSUnaryExpression)
|
||||
Public
|
||||
Class function PrefixOperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSUnaryPlusExpression }
|
||||
{ TJSUnaryPlusExpression - e.g. '+A' }
|
||||
|
||||
TJSUnaryPlusExpression = Class(TJSUnaryExpression)
|
||||
Public
|
||||
Class function PrefixOperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSUnaryMinusExpression }
|
||||
{ TJSUnaryMinusExpression - e.g. '-A' }
|
||||
|
||||
TJSUnaryMinusExpression = Class(TJSUnaryExpression)
|
||||
Public
|
||||
Class function PrefixOperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSUnaryInvExpression }
|
||||
{ TJSUnaryInvExpression - e.g. '~A' }
|
||||
|
||||
TJSUnaryInvExpression = Class(TJSUnaryExpression)
|
||||
Public
|
||||
Class function PrefixOperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSUnaryNotExpression }
|
||||
{ TJSUnaryNotExpression - e.g. '!A' }
|
||||
|
||||
TJSUnaryNotExpression = Class(TJSUnaryExpression)
|
||||
Public
|
||||
Class function PrefixOperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSUnaryPostPlusPlusExpression }
|
||||
{ TJSUnaryPostPlusPlusExpression - e.g. 'A++' }
|
||||
|
||||
TJSUnaryPostPlusPlusExpression = Class(TJSUnaryExpression)
|
||||
Public
|
||||
Class function PostFixOperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSUnaryPostMinusMinusExpression }
|
||||
{ TJSUnaryPostMinusMinusExpression - e.g. 'A--' }
|
||||
|
||||
TJSUnaryPostMinusMinusExpression = Class(TJSUnaryExpression)
|
||||
Public
|
||||
Class function PostFixOperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
{ TJSBinary }
|
||||
{ TJSBinary - base class }
|
||||
|
||||
TJSBinary = Class(TJSElement)
|
||||
private
|
||||
@ -425,42 +439,49 @@ Type
|
||||
{ TJSStatementList }
|
||||
|
||||
TJSStatementList = Class(TJSBinary); // A->first statement, B->next in list, chained.
|
||||
TJSVariableDeclarationList = Class(TJSBinary);
|
||||
|
||||
{ TJSVariableDeclarationList }
|
||||
|
||||
TJSVariableDeclarationList = Class(TJSBinary); // A->first variable, B->next in list, chained.
|
||||
|
||||
{ TJSWithStatement }
|
||||
|
||||
TJSWithStatement = Class(TJSBinary); // A-> with expression, B->statement(s)
|
||||
|
||||
{ TJSBinaryExpression }
|
||||
{ TJSBinaryExpression - e.g. A operator B }
|
||||
|
||||
TJSBinaryExpression = Class(TJSBinary)
|
||||
Public
|
||||
Class function OperatorToken : tjsToken; virtual;
|
||||
Class function OperatorString : string;
|
||||
Class Function AllowCompact : Boolean; virtual;
|
||||
end;
|
||||
|
||||
{ TJSLogicalOrExpression }
|
||||
{ TJSLogicalOrExpression - e.g. A || B }
|
||||
|
||||
TJSLogicalOrExpression = Class (TJSBinaryExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSLogicalAndExpression }
|
||||
{ TJSLogicalAndExpression - e.g. A && B }
|
||||
|
||||
TJSLogicalAndExpression = Class (TJSBinaryExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSBitwiseAndExpression }
|
||||
{ TJSBitwiseAndExpression - e.g. A & B }
|
||||
|
||||
TJSBitwiseAndExpression = Class (TJSBinaryExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSBitwiseOrExpression }
|
||||
{ TJSBitwiseOrExpression - e.g. A | B }
|
||||
|
||||
TJSBitwiseOrExpression = Class (TJSBinaryExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSBitwiseXOrExpression }
|
||||
{ TJSBitwiseXOrExpression - e.g. A ^ B }
|
||||
|
||||
TJSBitwiseXOrExpression = Class (TJSBinaryExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
@ -468,25 +489,25 @@ Type
|
||||
|
||||
TJSEqualityExpression = Class (TJSBinaryExpression);
|
||||
|
||||
{ TJSEqualityExpressionEQ }
|
||||
{ TJSEqualityExpressionEQ - e.g. A == B }
|
||||
|
||||
TJSEqualityExpressionEQ = Class(TJSEqualityExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSEqualityExpressionNE }
|
||||
{ TJSEqualityExpressionNE - e.g. A != B }
|
||||
|
||||
TJSEqualityExpressionNE = Class(TJSEqualityExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSEqualityExpressionSEQ }
|
||||
{ TJSEqualityExpressionSEQ strict equal - e.g. A === B }
|
||||
|
||||
TJSEqualityExpressionSEQ = Class(TJSEqualityExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSEqualityExpressionSNE }
|
||||
{ TJSEqualityExpressionSNE not strict equal - e.g. A !== B }
|
||||
|
||||
TJSEqualityExpressionSNE = Class(TJSEqualityExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
@ -494,38 +515,38 @@ Type
|
||||
|
||||
TJSRelationalExpression = Class(TJSBinaryExpression);
|
||||
|
||||
{ TJSRelationalExpressionLT }
|
||||
{ TJSRelationalExpressionLT lower than - e.g. A < B }
|
||||
|
||||
TJSRelationalExpressionLT = Class(TJSRelationalExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSRelationalExpressionGT }
|
||||
{ TJSRelationalExpressionGT greater than - e.g. A > B }
|
||||
|
||||
TJSRelationalExpressionGT = Class(TJSRelationalExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSRelationalExpressionLE }
|
||||
{ TJSRelationalExpressionLE lower equal - e.g. A <= B }
|
||||
|
||||
TJSRelationalExpressionLE = Class(TJSRelationalExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSRelationalExpressionGE }
|
||||
{ TJSRelationalExpressionGE greater equal - e.g. A >= B }
|
||||
|
||||
TJSRelationalExpressionGE = Class(TJSRelationalExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSRelationalExpressionIn }
|
||||
{ TJSRelationalExpressionIn - e.g. A in B }
|
||||
|
||||
TJSRelationalExpressionIn = Class(TJSRelationalExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
Class Function AllowCompact : Boolean; override;
|
||||
end;
|
||||
|
||||
{ TJSRelationalExpressionInstanceOf }
|
||||
{ TJSRelationalExpressionInstanceOf - e.g. A instanceof B }
|
||||
|
||||
TJSRelationalExpressionInstanceOf = Class(TJSRelationalExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
@ -534,19 +555,19 @@ Type
|
||||
|
||||
TJSShiftExpression = Class(TJSBinaryExpression);
|
||||
|
||||
{ TJSLShiftExpression }
|
||||
{ TJSLShiftExpression - e.g. A << B }
|
||||
|
||||
TJSLShiftExpression = Class(TJSShiftExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSRShiftExpression }
|
||||
{ TJSRShiftExpression right shift keep sign - e.g. A >> B }
|
||||
|
||||
TJSRShiftExpression = Class(TJSShiftExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSURShiftExpression }
|
||||
{ TJSURShiftExpression right shift unsigned, insert zeroes - e.g. A >>> B }
|
||||
|
||||
TJSURShiftExpression = Class(TJSShiftExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
@ -554,13 +575,13 @@ Type
|
||||
|
||||
TJSAdditiveExpression = Class(TJSBinaryExpression);
|
||||
|
||||
{ TJSAdditiveExpressionPlus }
|
||||
{ TJSAdditiveExpressionPlus - e.g. A + B }
|
||||
|
||||
TJSAdditiveExpressionPlus = Class(TJSAdditiveExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSAdditiveExpressionMinus }
|
||||
{ TJSAdditiveExpressionMinus - e.g. A - B }
|
||||
|
||||
TJSAdditiveExpressionMinus = Class(TJSAdditiveExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
@ -568,31 +589,31 @@ Type
|
||||
|
||||
TJSMultiplicativeExpression = Class(TJSBinaryExpression);
|
||||
|
||||
{ TJSMultiplicativeExpressionMul }
|
||||
{ TJSMultiplicativeExpressionMul - e.g. A * B }
|
||||
|
||||
TJSMultiplicativeExpressionMul = Class(TJSMultiplicativeExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSMultiplicativeExpressionDiv }
|
||||
{ TJSMultiplicativeExpressionDiv - e.g. A / B }
|
||||
|
||||
TJSMultiplicativeExpressionDiv = Class(TJSMultiplicativeExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSMultiplicativeExpressionMod }
|
||||
{ TJSMultiplicativeExpressionMod - e.g. A % B }
|
||||
|
||||
TJSMultiplicativeExpressionMod = Class(TJSMultiplicativeExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSCommaExpression }
|
||||
{ TJSCommaExpression - e.g. A , B }
|
||||
|
||||
TJSCommaExpression = Class(TJSBinaryExpression)
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSConditionalExpression }
|
||||
{ TJSConditionalExpression - e.g. A ? B :C }
|
||||
|
||||
TJSConditionalExpression = Class(TJSElement)
|
||||
private
|
||||
@ -606,7 +627,7 @@ Type
|
||||
Property C : TJSElement Read FC Write FC;
|
||||
end;
|
||||
|
||||
{ TJSAssignStatement }
|
||||
{ TJSAssignStatement - e.g. LHS operator Expr }
|
||||
|
||||
TJSAssignStatement = Class(TJSElement)
|
||||
private
|
||||
@ -622,79 +643,91 @@ Type
|
||||
|
||||
TJSAssignStatementClass = Class of TJSAssignStatement;
|
||||
|
||||
{ TJSSimpleAssignStatement }
|
||||
{ TJSSimpleAssignStatement - e.g. LHS=Expr }
|
||||
|
||||
TJSSimpleAssignStatement = Class(TJSAssignStatement)
|
||||
Public
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSMulEqAssignStatement }
|
||||
{ TJSMulEqAssignStatement - e.g. LHS*=Expr }
|
||||
|
||||
TJSMulEqAssignStatement = Class(TJSAssignStatement)
|
||||
Public
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSDivEqAssignStatement }
|
||||
{ TJSDivEqAssignStatement - e.g. LHS/=Expr }
|
||||
|
||||
TJSDivEqAssignStatement = Class(TJSAssignStatement)
|
||||
Public
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSModEqAssignStatement }
|
||||
{ TJSModEqAssignStatement - e.g. LHS%=Expr }
|
||||
|
||||
TJSModEqAssignStatement = Class(TJSAssignStatement)
|
||||
Public
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSAddEqAssignStatement }
|
||||
{ TJSAddEqAssignStatement - e.g. LHS+=Expr }
|
||||
|
||||
TJSAddEqAssignStatement = Class(TJSAssignStatement)
|
||||
Public
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSSubEqAssignStatement }
|
||||
{ TJSSubEqAssignStatement - e.g. LHS-=Expr }
|
||||
|
||||
TJSSubEqAssignStatement = Class(TJSAssignStatement)
|
||||
Public
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSLShiftEqAssignStatement }
|
||||
{ TJSLShiftEqAssignStatement - e.g. LHS<<=Expr }
|
||||
|
||||
TJSLShiftEqAssignStatement = Class(TJSAssignStatement)
|
||||
Public
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSRShiftEqAssignStatement }
|
||||
{ TJSRShiftEqAssignStatement - e.g. LHS>>=Expr keep sign }
|
||||
|
||||
TJSRShiftEqAssignStatement = Class(TJSAssignStatement)
|
||||
Public
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSURShiftEqAssignStatement }
|
||||
{ TJSURShiftEqAssignStatement - e.g. LHS>>>=Expr unsigned, insert zeroes }
|
||||
|
||||
TJSURShiftEqAssignStatement = Class(TJSAssignStatement)
|
||||
Public
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSANDEqAssignStatement }
|
||||
{ TJSANDEqAssignStatement - e.g. LHS&=Expr }
|
||||
|
||||
TJSANDEqAssignStatement = Class(TJSAssignStatement)
|
||||
Public
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSOREqAssignStatement }
|
||||
{ TJSOREqAssignStatement - e.g. LHS|=Expr }
|
||||
|
||||
TJSOREqAssignStatement = Class(TJSAssignStatement)
|
||||
Public
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSXOREqAssignStatement }
|
||||
{ TJSXOREqAssignStatement - e.g. LHS^=Expr }
|
||||
|
||||
TJSXOREqAssignStatement = Class(TJSAssignStatement)
|
||||
Public
|
||||
Class function OperatorToken : tjsToken; override;
|
||||
end;
|
||||
|
||||
{ TJSVarDeclaration }
|
||||
{ TJSVarDeclaration - e.g. Name=Init }
|
||||
|
||||
TJSVarDeclaration = Class(TJSElement)
|
||||
private
|
||||
@ -706,7 +739,7 @@ Type
|
||||
Property Init : TJSElement Read FInit Write FInit;
|
||||
end;
|
||||
|
||||
{ TJSIfStatement }
|
||||
{ TJSIfStatement - e.g. if (Cond) btrue else bfalse }
|
||||
|
||||
TJSIfStatement = Class(TJSElement)
|
||||
private
|
||||
@ -716,13 +749,13 @@ Type
|
||||
Public
|
||||
Destructor Destroy; override;
|
||||
Property Cond : TJSElement Read FCond Write FCond;
|
||||
Property btrue : TJSElement Read FBTrue Write FBTrue;
|
||||
Property bfalse : TJSElement Read FBFalse Write FBFalse;
|
||||
Property BTrue : TJSElement Read FBTrue Write FBTrue;
|
||||
Property BFalse : TJSElement Read FBFalse Write FBFalse;
|
||||
end;
|
||||
|
||||
{ TJSWhileStatement }
|
||||
|
||||
{ TJSTargetStatement }
|
||||
{ TJSTargetStatement
|
||||
- base class for statements targetable by continue and break
|
||||
- TargetName can be empty }
|
||||
|
||||
TJSTargetStatement = Class(TJSElement)
|
||||
private
|
||||
@ -733,17 +766,17 @@ Type
|
||||
Property TargetName : TJSString Read FTargetName Write FTargetName;
|
||||
end;
|
||||
|
||||
{ TJSBodyStatement }
|
||||
{ TJSBodyStatement - base class }
|
||||
|
||||
TJSBodyStatement = Class(TJSTargetStatement)
|
||||
private
|
||||
FBody: TJSElement;
|
||||
Public
|
||||
Destructor Destroy; override;
|
||||
Property body : TJSElement Read FBody Write FBody;
|
||||
Property Body : TJSElement Read FBody Write FBody;
|
||||
end;
|
||||
|
||||
{ TJSCondLoopStatement }
|
||||
{ TJSCondLoopStatement - base class for do..while and while..do }
|
||||
|
||||
TJSCondLoopStatement = Class(TJSBodyStatement)
|
||||
private
|
||||
@ -753,10 +786,15 @@ Type
|
||||
Property Cond : TJSElement Read FCond Write FCond;
|
||||
end;
|
||||
|
||||
{ TJSWhileStatement - e.g. 'while(Cond) Body' }
|
||||
|
||||
TJSWhileStatement = Class(TJSCondLoopStatement);
|
||||
|
||||
{ TJSDoWhileStatement - e.g. 'do Body while(Cond)' }
|
||||
|
||||
TJSDoWhileStatement = Class(TJSWhileStatement);
|
||||
|
||||
{ TJSForStatement }
|
||||
{ TJSForStatement - e.g. 'for(Init;Cond;Incr) Body' }
|
||||
|
||||
TJSForStatement = Class(TJSCondLoopStatement)
|
||||
private
|
||||
@ -768,7 +806,7 @@ Type
|
||||
Property Init : TJSElement Read FInit Write FInit;
|
||||
end;
|
||||
|
||||
{ TJSForInStatement }
|
||||
{ TJSForInStatement - e.g. 'for(LHS in List) Body' }
|
||||
|
||||
TJSForInStatement = Class(TJSBodyStatement)
|
||||
private
|
||||
@ -780,11 +818,15 @@ Type
|
||||
Property List : TJSElement Read FList Write FList;
|
||||
end;
|
||||
|
||||
{ TJSContinueStatement - e.g. 'continue'}
|
||||
|
||||
TJSContinueStatement = Class(TJSTargetStatement);
|
||||
|
||||
{ TJSBreakStatement - e.g. 'break' }
|
||||
|
||||
TJSBreakStatement = Class(TJSTargetStatement);
|
||||
|
||||
{ TJSReturn }
|
||||
{ TJSReturn - e.g. 'return Expr'}
|
||||
|
||||
TJSReturnStatement = Class(TJSElement)
|
||||
private
|
||||
@ -794,7 +836,7 @@ Type
|
||||
Property Expr : TJSElement Read FExpr Write FExpr;
|
||||
end;
|
||||
|
||||
{ TJSCaseElement }
|
||||
{ TJSCaseElement - element of TJSCaseElements, e.g. 'case Expr: Body' }
|
||||
|
||||
TJSCaseElement = Class(TCollectionItem)
|
||||
private
|
||||
@ -806,7 +848,7 @@ Type
|
||||
Property Body : TJSElement Read FBody Write FBody;
|
||||
end;
|
||||
|
||||
{ TJSCaseElements }
|
||||
{ TJSCaseElements - Cases property of TJSSwitch }
|
||||
|
||||
TJSCaseElements = Class(TCollection)
|
||||
private
|
||||
@ -816,7 +858,7 @@ Type
|
||||
Property Cases[AIndex : Integer] : TJSCaseElement Read GetC ;default;
|
||||
end;
|
||||
|
||||
{ TJSSwitch }
|
||||
{ TJSSwitch - e.g. switch(Cond) Cases }
|
||||
|
||||
TJSSwitchStatement = Class(TJSTargetStatement)
|
||||
private
|
||||
@ -828,10 +870,10 @@ Type
|
||||
Destructor Destroy; override;
|
||||
Property Cond : TJSelement Read FCond Write FCond;
|
||||
Property Cases : TJSCaseElements Read FCases;
|
||||
Property TheDefault : TJSCaseelement Read FDefault Write FDefault;
|
||||
Property TheDefault : TJSCaseelement Read FDefault Write FDefault; // one of Cases
|
||||
end;
|
||||
|
||||
{ TJSLabeledStatement }
|
||||
{ TJSLabeledStatement - e.g. 'TheLabel : A' }
|
||||
|
||||
TJSLabeledStatement = Class(TJSUnary)
|
||||
private
|
||||
@ -839,11 +881,11 @@ Type
|
||||
FTarget: Integer;
|
||||
Public
|
||||
Destructor Destroy; override;
|
||||
Property target: Integer Read FTarget Write FTarget;
|
||||
Property Target: Integer Read FTarget Write FTarget;
|
||||
Property TheLabel : TJSLabel Read FLabel Write Flabel;
|
||||
end;
|
||||
|
||||
{ TJSTryStatement }
|
||||
{ TJSTryStatement - e.g. 'try Block catch(Ident) BCatch finally BFinally' }
|
||||
|
||||
TJSTryStatement = Class(TJSElement)
|
||||
private
|
||||
@ -864,9 +906,9 @@ Type
|
||||
TJSTryFinallyStatement = Class(TJSTryStatement);
|
||||
|
||||
|
||||
{ TJSFunction }
|
||||
{ TJSFunctionDeclarationStatement - as TJSFuncDef, except as a statement }
|
||||
|
||||
TJSFunctionDeclarationStatement = Class(TJSelement)
|
||||
TJSFunctionDeclarationStatement = Class(TJSElement)
|
||||
private
|
||||
FFuncDef: TJSFuncDef;
|
||||
Public
|
||||
@ -874,16 +916,16 @@ Type
|
||||
Property AFunction : TJSFuncDef Read FFuncDef Write FFuncDef;
|
||||
end;
|
||||
|
||||
{ TJSFunctionBody }
|
||||
{ TJSFunctionBody - the statement block of a function }
|
||||
|
||||
TJSFunctionBody = Class(TJSUnary)
|
||||
private
|
||||
FisProgram: Boolean;
|
||||
FIsProgram: Boolean;
|
||||
Public
|
||||
Property isProgram : Boolean Read FisProgram Write FIsProgram;
|
||||
Property isProgram : Boolean Read FIsProgram Write FIsProgram;
|
||||
end;
|
||||
|
||||
{ TJSElementNode }
|
||||
{ TJSElementNode - element of TJSElementNodes }
|
||||
|
||||
TJSElementNode = Class(TCollectionItem)
|
||||
private
|
||||
@ -893,7 +935,7 @@ Type
|
||||
Property Node : TJSElement Read FNode Write FNode;
|
||||
end;
|
||||
|
||||
{ TJSElementNodes }
|
||||
{ TJSElementNodes - }
|
||||
|
||||
TJSElementNodes = Class(TCollection)
|
||||
private
|
||||
@ -904,6 +946,7 @@ Type
|
||||
end;
|
||||
|
||||
{ TJSSourceElements }
|
||||
|
||||
TJSSourceElements = Class(TJSElement)
|
||||
private
|
||||
FFunctions: TJSElementNodes;
|
||||
@ -913,11 +956,10 @@ Type
|
||||
Constructor Create(ALine,ARow : Integer; const ASource : String = ''); override;
|
||||
Destructor Destroy; override;
|
||||
Property Statements : TJSElementNodes Read FStatements;
|
||||
Property functions : TJSElementNodes Read FFunctions;
|
||||
Property Functions : TJSElementNodes Read FFunctions;
|
||||
Property Vars : TJSElementNodes Read FVars;
|
||||
end;
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
{$IFDEF NOCLASSES}
|
||||
@ -1444,7 +1486,7 @@ end;
|
||||
|
||||
{ TJSElement }
|
||||
|
||||
constructor TJSElement.Create(ALine, ARow: Integer; Const ASource: String = '');
|
||||
constructor TJSElement.Create(ALine, ARow: Integer; const ASource: String);
|
||||
begin
|
||||
FLine:=ALine;
|
||||
FRow:=ARow;
|
||||
@ -1809,7 +1851,6 @@ begin
|
||||
Result:=TJSElementNode(Items[Aindex])
|
||||
end;
|
||||
|
||||
|
||||
function TJSElementNodes.AddNode: TJSElementNode;
|
||||
begin
|
||||
Result:=TJSElementNode(Add);
|
||||
|
@ -622,13 +622,10 @@ end;
|
||||
|
||||
Procedure TJSWriter.WriteMemberExpression(el : TJSMemberExpression);
|
||||
|
||||
Var
|
||||
I : integer;
|
||||
A : TJSArguments;
|
||||
begin
|
||||
if el is TJSNewMemberExpression then
|
||||
Write('new ');
|
||||
WriteJS(el.mexpr);
|
||||
WriteJS(el.MExpr);
|
||||
if el is TJSDotMemberExpression then
|
||||
begin
|
||||
write('.');
|
||||
@ -651,9 +648,6 @@ end;
|
||||
|
||||
Procedure TJSWriter.WriteCallExpression(El : TJSCallExpression);
|
||||
|
||||
Var
|
||||
I : integer;
|
||||
A : TJSArguments;
|
||||
begin
|
||||
WriteJS(El.Expr);
|
||||
if Assigned(El.Args) then
|
||||
@ -743,21 +737,19 @@ Procedure TJSWriter.WriteBinary(El : TJSBinary);
|
||||
|
||||
Var
|
||||
S : AnsiString;
|
||||
B : Boolean;
|
||||
T : TJSToken;
|
||||
|
||||
AllowCompact : Boolean;
|
||||
begin
|
||||
Write('(');
|
||||
WriteJS(EL.A);
|
||||
B:=False;
|
||||
AllowCompact:=False;
|
||||
if (el is TJSBinaryExpression) then
|
||||
begin
|
||||
S:=TJSBinaryExpression(El).OperatorString;
|
||||
B:=TJSBinaryExpression(El).AllowCompact;
|
||||
AllowCompact:=TJSBinaryExpression(El).AllowCompact;
|
||||
end;
|
||||
If Not (B and (woCompact in Options)) then
|
||||
If Not (AllowCompact and (woCompact in Options)) then
|
||||
S:=' '+S+' ';
|
||||
Write(s);
|
||||
Write(S);
|
||||
WriteJS(EL.B);
|
||||
Write(')');
|
||||
end;
|
||||
@ -778,7 +770,6 @@ Procedure TJSWriter.WriteAssignStatement(El : TJSAssignStatement);
|
||||
|
||||
Var
|
||||
S : AnsiString;
|
||||
T : TJSToken;
|
||||
begin
|
||||
WriteJS(EL.LHS);
|
||||
S:=El.OperatorString;
|
||||
@ -823,7 +814,7 @@ begin
|
||||
if Assigned(El.List) then
|
||||
WriteJS(El.List);
|
||||
Write(') ');
|
||||
if Assigned(El.body) then
|
||||
if Assigned(El.Body) then
|
||||
WriteJS(El.Body);
|
||||
end;
|
||||
|
||||
@ -840,7 +831,7 @@ begin
|
||||
if Assigned(El.Incr) then
|
||||
WriteJS(El.Incr);
|
||||
Write(') ');
|
||||
if Assigned(El.body) then
|
||||
if Assigned(El.Body) then
|
||||
WriteJS(El.Body);
|
||||
end;
|
||||
|
||||
@ -851,7 +842,7 @@ begin
|
||||
if El is TJSDoWhileStatement then
|
||||
begin
|
||||
Write('do ');
|
||||
if Assigned(El.body) then
|
||||
if Assigned(El.Body) then
|
||||
WriteJS(El.Body);
|
||||
Write(' while (');
|
||||
If Assigned(El.Cond) then
|
||||
@ -864,7 +855,7 @@ begin
|
||||
If Assigned(El.Cond) then
|
||||
WriteJS(EL.Cond);
|
||||
Write(') ');
|
||||
if Assigned(El.body) then
|
||||
if Assigned(El.Body) then
|
||||
WriteJS(El.Body);
|
||||
end;
|
||||
end;
|
||||
|
@ -4,7 +4,7 @@ program testjs;
|
||||
|
||||
uses
|
||||
cwstring,Classes, consoletestrunner, tcscanner, jsparser, jsscanner, jstree, jsbase,
|
||||
tcparser, jswriter, tctextwriter, tcwriter, jstoken;
|
||||
tcparser, jswriter, tcwriter, jstoken;
|
||||
|
||||
var
|
||||
Application: TTestRunner;
|
||||
|
Loading…
Reference in New Issue
Block a user