* Some clean-up patches by Mattias

git-svn-id: trunk@34204 -
This commit is contained in:
michael 2016-07-26 15:05:39 +00:00
parent ef1369fef2
commit 62f39e0037
5 changed files with 198 additions and 181 deletions

View File

@ -25,8 +25,6 @@ Type
FPrevious, FPrevious,
FCurrent : TJSToken; FCurrent : TJSToken;
FCurrentString : String; FCurrentString : String;
FNextNewLine : Boolean;
FNextBol : Boolean;
FFreeScanner : Boolean; FFreeScanner : Boolean;
FCurrentVars : TJSElementNodes; FCurrentVars : TJSElementNodes;
FPeekToken: TJSToken; FPeekToken: TJSToken;
@ -557,8 +555,6 @@ function TJSParser.ParseObjectLiteral: TJSElement;
Var Var
N : TJSObjectLiteral; N : TJSObjectLiteral;
E : TJSObjectLiteralElement; E : TJSObjectLiteralElement;
I : Integer;
begin begin
Consume(tjsCurlyBraceOpen); Consume(tjsCurlyBraceOpen);
N:=TJSObjectLiteral(CreateElement(TJSObjectLiteral)); N:=TJSObjectLiteral(CreateElement(TJSObjectLiteral));
@ -618,9 +614,6 @@ function TJSParser.ParseStringLiteral: TJSElement;
Var Var
L : TJSLiteral; L : TJSLiteral;
D : Double;
I : Integer;
begin begin
{$ifdef debugparser} Writeln('Parsing string literal');{$endif debugparser} {$ifdef debugparser} Writeln('Parsing string literal');{$endif debugparser}
Result:=Nil; Result:=Nil;
@ -746,7 +739,6 @@ Var
M : TJSDotMemberExpression; M : TJSDotMemberExpression;
N : TJSNewMemberExpression; N : TJSNewMemberExpression;
B : TJSBracketMemberExpression; B : TJSBracketMemberExpression;
C : TJSCallExpression;
Done : Boolean; Done : Boolean;
begin begin
@ -758,7 +750,7 @@ begin
N:=TJSNewMemberExpression(CreateElement(TJSNewMemberExpression)); N:=TJSNewMemberExpression(CreateElement(TJSNewMemberExpression));
try try
Result:=N; Result:=N;
N.Mexpr:=ParseMemberExpression(); N.MExpr:=ParseMemberExpression();
if (CurrentToken=tjsBraceOpen) then if (CurrentToken=tjsBraceOpen) then
N.Args:=ParseArguments; N.Args:=ParseArguments;
except except
@ -1378,7 +1370,6 @@ end;
function TJSParser.ParseVariableStatement : TJSElement; function TJSParser.ParseVariableStatement : TJSElement;
Var Var
E : TJSElement;
V : TJSVariableStatement; V : TJSVariableStatement;
begin begin
@ -1429,7 +1420,7 @@ begin
I:=TJSIfStatement(CreateElement(TJSIfStatement)); I:=TJSIfStatement(CreateElement(TJSIfStatement));
I.Cond:=C; I.Cond:=C;
I.BTrue:=Btrue; I.BTrue:=Btrue;
I.bfalse:=BFalse; I.BFalse:=BFalse;
Result:=I; Result:=I;
except except
FreeAndNil(C); FreeAndNil(C);
@ -1641,8 +1632,6 @@ function TJSParser.ParseWithStatement : TJSElement;
Var Var
W : TJSWithStatement; W : TJSWithStatement;
N : TJSElement;
begin begin
W:=TJSWithStatement(CreateElement(TJSWithStatement)); W:=TJSWithStatement(CreateElement(TJSWithStatement));
try try
@ -1655,6 +1644,7 @@ begin
FreeAndNil(W); FreeAndNil(W);
Raise; Raise;
end; end;
Result:=W;
end; end;
function TJSParser.ParseSwitchStatement : TJSElement; function TJSParser.ParseSwitchStatement : TJSElement;
@ -1662,7 +1652,6 @@ function TJSParser.ParseSwitchStatement : TJSElement;
Var Var
N : TJSSwitchStatement; N : TJSSwitchStatement;
C : TJSElement;
Ca : TJSCaseElement; Ca : TJSCaseElement;
begin begin
@ -1883,8 +1872,6 @@ function TJSParser.ParseLabeledStatement : TJSElement;
Var Var
OL : TJSLabelSet; OL : TJSLabelSet;
LS : TJSLabeledStatement; LS : TJSLabeledStatement;
LN : String;
begin begin
LS:=TJSLabeledStatement(CreateElement(TJSLabeledStatement)); LS:=TJSLabeledStatement(CreateElement(TJSLabeledStatement));
try try
@ -2046,7 +2033,7 @@ begin
If (PeekNextToken<>tjsBraceOpen) then If (PeekNextToken<>tjsBraceOpen) then
begin begin
F:=Self.ParseFunctionDeclaration; F:=Self.ParseFunctionDeclaration;
Result.functions.AddNode.Node:=F; Result.Functions.AddNode.Node:=F;
end end
else else
begin begin
@ -2095,8 +2082,6 @@ end;
Function TJSParser.ParseProgram: TJSFunctionDeclarationStatement; Function TJSParser.ParseProgram: TJSFunctionDeclarationStatement;
Var Var
F : TJSFunctionDeclarationStatement;
FD : TJSFuncDef;
B : TJSElement; B : TJSElement;
begin begin
{$ifdef debugparser} Writeln('>>> Entering FunctionDeclarationStatement');{$endif} {$ifdef debugparser} Writeln('>>> Entering FunctionDeclarationStatement');{$endif}

View File

@ -8,7 +8,7 @@ type
TJSToken = (tjsUnknown, TJSToken = (tjsUnknown,
// Specials // Specials
tjsEOF,tjsWhiteSpace,tjsChar,tjsString, tjsIdentifier,tjsNumber, tjsComment,tjsREGEX, tjsRESERVED, tjsEOF,tjsWhiteSpace,tjsChar,tjsString{this bites TJSString}, tjsIdentifier,tjsNumber, tjsComment,tjsREGEX, tjsRESERVED,
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,

View File

@ -73,45 +73,47 @@ Type
TJSObject = Class(TObject); TJSObject = Class(TObject);
{ TJSLabelSet } { TJSLabelSet }
TJSLabelSet = Class(TJSObject) TJSLabelSet = Class(TJSObject)
private private
FCOnt: Boolean; FCont: Boolean;
FNext: TJSLabelSet; FNext: TJSLabelSet;
FTarget: Cardinal; FTarget: Cardinal;
Public Public
Property Target : Cardinal Read FTarget Write FTarget; Property Target : Cardinal Read FTarget Write FTarget;
Property Next : TJSLabelSet Read FNext Write FNext; // Linked list Property Next : TJSLabelSet Read FNext Write FNext; // Linked list
Property Continuable : Boolean Read FCOnt Write FCont; Property Continuable : Boolean Read FCont Write FCont;
end; end;
{ TJSLabel } { TJSLabel }
TJSLabel = Class(TJSObject) TJSLabel = Class(TJSObject)
private private
FLabelSet: TJSLabelSet; FLabelSet: TJSLabelSet;
FLocationLine: Integer; FLocationLine: Integer;
FLocationPos: Integer; FLocationPos: Integer;
FLocationSource: String; FLocationSource: String;
FName: String; FName: String;
FNext: TJSLabel; FNext: TJSLabel;
Public Public
Property Name : String Read FName Write FName; Property Name : String Read FName Write FName;
Property LabelSet : TJSLabelSet Read FLabelSet Write FLabelSet; Property LabelSet : TJSLabelSet Read FLabelSet Write FLabelSet;
Property LocationSource : String Read FLocationSource Write FLocationSource; Property LocationSource : String Read FLocationSource Write FLocationSource;
Property LocationLine : Integer Read FLocationLine Write FLocationLine; Property LocationLine : Integer Read FLocationLine Write FLocationLine;
Property LocationPos : Integer Read FLocationPos Write FLocationPos; Property LocationPos : Integer Read FLocationPos Write FLocationPos;
Property Next : TJSLabel Read FNext Write FNext; Property Next : TJSLabel Read FNext Write FNext;
end; end;
{ TJSFuncDef } TJSString = jsbase.TJSString; // beware of jstoken.tjsString
{ TJSFuncDef - e.g. 'function Name(Params)Body' }
TJSFuncDef = Class(TJSObject) TJSFuncDef = Class(TJSObject)
private private
FBody: TJSFunctionBody; FBody: TJSFunctionBody;
FIsEmpty: Boolean; FIsEmpty: Boolean;
FName: String; FName: TJSString;
FParams: TStrings; FParams: TStrings;
procedure SetParams(const AValue: TStrings); procedure SetParams(const AValue: TStrings);
Public Public
@ -119,13 +121,13 @@ Type
Destructor Destroy; override; Destructor Destroy; override;
Property Params : TStrings Read FParams Write SetParams; Property Params : TStrings Read FParams Write SetParams;
Property Body : TJSFunctionBody Read FBody Write FBody; 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; Property IsEmpty : Boolean Read FIsEmpty Write FIsEmpty;
end; end;
TJSString = WideString; { TJSElement }
TJSElement = Class (TJSObject) TJSElement = Class(TJSObject)
private private
FFlags: TJSElementFlags; FFlags: TJSElementFlags;
FLine: Integer; FLine: Integer;
@ -140,9 +142,12 @@ Type
end; end;
TJSElementClass = Class of TJSElement; TJSElementClass = Class of TJSElement;
{ TJSEmptyBlockStatement } { TJSEmptyBlockStatement - empty curly brackets }
TJSEmptyBlockStatement = Class(TJSElement); TJSEmptyBlockStatement = Class(TJSElement);
{ TJSEmptyStatement - a dummy placeholder, needs sometimes a single semicolon }
TJSEmptyStatement = Class(TJSElement); TJSEmptyStatement = Class(TJSElement);
{ TJSLiteral } { TJSLiteral }
@ -156,15 +161,6 @@ Type
Property Value : TJSValue Read FValue Write FValue; Property Value : TJSValue Read FValue Write FValue;
end; end;
(* { TJSStringLiteral }
TJSStringLiteral = Class(TJSElement)
private
FValue: TJSString;
Public
Property Value : TJSString Read FValue Write FValue;
end;
*)
{ TJSRegularExpressionLiteral } { TJSRegularExpressionLiteral }
TJSRegularExpressionLiteral = Class(TJSElement) TJSRegularExpressionLiteral = Class(TJSElement)
@ -182,18 +178,20 @@ Type
Property Argv[AIndex : integer] : TJSValue Read GetA Write SetA; Property Argv[AIndex : integer] : TJSValue Read GetA Write SetA;
end; end;
{ TJSPrimaryExpressionIdent }
TJSPrimaryExpression = Class(TJSElement); TJSPrimaryExpression = Class(TJSElement);
TJSPrimaryExpressionThis = Class(TJSPrimaryExpression); // 'this'
{ TJSPrimaryExpressionIdent }
TJSPrimaryExpressionIdent = Class(TJSPrimaryExpression) TJSPrimaryExpressionIdent = Class(TJSPrimaryExpression)
private private
FName: TJSString; FName: TJSString;
Public Public
Property Name : TJSString Read FName Write FName; Property Name : TJSString Read FName Write FName;
end; end;
TJSPrimaryExpressionThis = Class(TJSPrimaryExpression);
{ TJSArrayLiteralElement } { TJSArrayLiteralElement - an item of a TJSArrayLiteralElements }
TJSArrayLiteralElement = Class(TCollectionItem) TJSArrayLiteralElement = Class(TCollectionItem)
private private
@ -205,7 +203,7 @@ Type
Property ElementIndex : Integer Read FFindex Write FFIndex; Property ElementIndex : Integer Read FFindex Write FFIndex;
end; end;
{ TJSArrayLiteralElements } { TJSArrayLiteralElements - Elements property of TJSArrayLiteral }
TJSArrayLiteralElements = Class(TCollection) TJSArrayLiteralElements = Class(TCollection)
private private
@ -226,7 +224,7 @@ Type
Property Elements : TJSArrayLiteralElements Read FElements; Property Elements : TJSArrayLiteralElements Read FElements;
end; end;
{ TJSObjectLiteralElement } { TJSObjectLiteralElement - an item of TJSObjectLiteralElements }
TJSObjectLiteralElement = Class(TCollectionItem) TJSObjectLiteralElement = Class(TCollectionItem)
private private
@ -238,7 +236,7 @@ Type
Property Name : TJSString Read FName Write FName; Property Name : TJSString Read FName Write FName;
end; end;
{ TJSObjectLiteralElements } { TJSObjectLiteralElements - Elements property of TJSObjectLiteral }
TJSObjectLiteralElements = Class(TCollection) TJSObjectLiteralElements = Class(TCollection)
private private
@ -263,17 +261,17 @@ Type
TJSArguments = Class(TJSArrayLiteral); TJSArguments = Class(TJSArrayLiteral);
{ TJSMemberExpression } { TJSMemberExpression - base class }
TJSMemberExpression = Class(TJSElement) TJSMemberExpression = Class(TJSElement)
private private
FMexpr: TJSElement; FMexpr: TJSElement;
Public Public
Destructor Destroy; override; Destructor Destroy; override;
Property Mexpr : TJSElement Read FMexpr Write FMexpr; Property MExpr : TJSElement Read FMexpr Write FMexpr;
end; end;
{ TJSNewMemberExpression } { TJSNewMemberExpression - e.g. 'new MExpr(Args)' }
TJSNewMemberExpression = Class(TJSMemberExpression) TJSNewMemberExpression = Class(TJSMemberExpression)
private private
@ -283,7 +281,7 @@ Type
Property Args : TJSArguments Read FArgs Write FArgs; Property Args : TJSArguments Read FArgs Write FArgs;
end; end;
{ TJSDotMemberExpression } { TJSDotMemberExpression - e.g. 'MExpr.Name' }
TJSDotMemberExpression = Class(TJSMemberExpression) TJSDotMemberExpression = Class(TJSMemberExpression)
private private
@ -292,7 +290,7 @@ Type
Property Name : TJSString Read FName Write FName; Property Name : TJSString Read FName Write FName;
end; end;
{ TJSBracketMemberExpression } { TJSBracketMemberExpression - e.g. 'MExpr[Name]' }
TJSBracketMemberExpression = Class(TJSMemberExpression) TJSBracketMemberExpression = Class(TJSMemberExpression)
private private
@ -302,7 +300,7 @@ Type
Property Name : TJSElement Read FName Write FName; Property Name : TJSElement Read FName Write FName;
end; end;
{ TJSCallExpression } { TJSCallExpression - e.g. 'Expr(Args)'}
TJSCallExpression = Class(TJSElement) TJSCallExpression = Class(TJSElement)
private private
@ -314,7 +312,7 @@ Type
Property Args : TJSArguments Read FArgs Write FArgs; Property Args : TJSArguments Read FArgs Write FArgs;
end; end;
{ TJSUnary } { TJSUnary - e.g. 'PrefixOperator A PostFixOperator', '--i' }
TJSUnary = Class(TJSElement) TJSUnary = Class(TJSElement)
private private
@ -329,87 +327,103 @@ Type
end; end;
TJSUnaryClass = class of TJSUnary; TJSUnaryClass = class of TJSUnary;
{ TJSVariableStatement } { TJSVariableStatement - e.g. 'var A' }
TJSVariableStatement = Class(TJSUnary); TJSVariableStatement = Class(TJSUnary);
{ TJSExpressionStatement - ? }
TJSExpressionStatement = Class(TJSUnary); TJSExpressionStatement = Class(TJSUnary);
{ TJSThrowStatement } { TJSThrowStatement - e.g. 'throw A' }
TJSThrowStatement = Class(TJSUnary) TJSThrowStatement = Class(TJSUnary)
Public
Class function PrefixOperatorToken : tjsToken; Override; Class function PrefixOperatorToken : tjsToken; Override;
end; end;
TJSUnaryExpression = Class(TJSUnary); TJSUnaryExpression = Class(TJSUnary);
{ TJSUnaryDeleteExpression } { TJSUnaryDeleteExpression - e.g. 'delete A' }
TJSUnaryDeleteExpression = Class(TJSUnaryExpression) TJSUnaryDeleteExpression = Class(TJSUnaryExpression)
Public
Class function PrefixOperatorToken : tjsToken; override; Class function PrefixOperatorToken : tjsToken; override;
end; end;
{ TJSUnaryVoidExpression } { TJSUnaryVoidExpression - e.g. 'void A' }
TJSUnaryVoidExpression = Class(TJSUnaryExpression) TJSUnaryVoidExpression = Class(TJSUnaryExpression)
Public
Class function PrefixOperatorToken : tjsToken; override; Class function PrefixOperatorToken : tjsToken; override;
end; end;
{ TJSUnaryTypeOfExpression } { TJSUnaryTypeOfExpression - e.g. 'typeof A' }
TJSUnaryTypeOfExpression = Class(TJSUnaryExpression) TJSUnaryTypeOfExpression = Class(TJSUnaryExpression)
Public
Class function PrefixOperatorToken : tjsToken; override; Class function PrefixOperatorToken : tjsToken; override;
end; end;
{ TJSUnaryPrePlusPlusExpression } { TJSUnaryPrePlusPlusExpression - e.g. '++A' }
TJSUnaryPrePlusPlusExpression = Class(TJSUnaryExpression) TJSUnaryPrePlusPlusExpression = Class(TJSUnaryExpression)
Public
Class function PrefixOperatorToken : tjsToken; override; Class function PrefixOperatorToken : tjsToken; override;
end; end;
{ TJSUnaryPreMinusMinusExpression } { TJSUnaryPreMinusMinusExpression - e.g. '--A' }
TJSUnaryPreMinusMinusExpression = Class(TJSUnaryExpression) TJSUnaryPreMinusMinusExpression = Class(TJSUnaryExpression)
Public
Class function PrefixOperatorToken : tjsToken; override; Class function PrefixOperatorToken : tjsToken; override;
end; end;
{ TJSUnaryPlusExpression } { TJSUnaryPlusExpression - e.g. '+A' }
TJSUnaryPlusExpression = Class(TJSUnaryExpression) TJSUnaryPlusExpression = Class(TJSUnaryExpression)
Public
Class function PrefixOperatorToken : tjsToken; override; Class function PrefixOperatorToken : tjsToken; override;
end; end;
{ TJSUnaryMinusExpression } { TJSUnaryMinusExpression - e.g. '-A' }
TJSUnaryMinusExpression = Class(TJSUnaryExpression) TJSUnaryMinusExpression = Class(TJSUnaryExpression)
Public
Class function PrefixOperatorToken : tjsToken; override; Class function PrefixOperatorToken : tjsToken; override;
end; end;
{ TJSUnaryInvExpression } { TJSUnaryInvExpression - e.g. '~A' }
TJSUnaryInvExpression = Class(TJSUnaryExpression) TJSUnaryInvExpression = Class(TJSUnaryExpression)
Public
Class function PrefixOperatorToken : tjsToken; override; Class function PrefixOperatorToken : tjsToken; override;
end; end;
{ TJSUnaryNotExpression } { TJSUnaryNotExpression - e.g. '!A' }
TJSUnaryNotExpression = Class(TJSUnaryExpression) TJSUnaryNotExpression = Class(TJSUnaryExpression)
Public
Class function PrefixOperatorToken : tjsToken; override; Class function PrefixOperatorToken : tjsToken; override;
end; end;
{ TJSUnaryPostPlusPlusExpression } { TJSUnaryPostPlusPlusExpression - e.g. 'A++' }
TJSUnaryPostPlusPlusExpression = Class(TJSUnaryExpression) TJSUnaryPostPlusPlusExpression = Class(TJSUnaryExpression)
Public
Class function PostFixOperatorToken : tjsToken; override; Class function PostFixOperatorToken : tjsToken; override;
end; end;
{ TJSUnaryPostMinusMinusExpression } { TJSUnaryPostMinusMinusExpression - e.g. 'A--' }
TJSUnaryPostMinusMinusExpression = Class(TJSUnaryExpression) TJSUnaryPostMinusMinusExpression = Class(TJSUnaryExpression)
Public
Class function PostFixOperatorToken : tjsToken; override; Class function PostFixOperatorToken : tjsToken; override;
end; end;
{ TJSBinary } { TJSBinary - base class }
TJSBinary = Class(TJSElement) TJSBinary = Class(TJSElement)
private private
@ -425,42 +439,49 @@ Type
{ TJSStatementList } { TJSStatementList }
TJSStatementList = Class(TJSBinary); // A->first statement, B->next in list, chained. 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) TJSWithStatement = Class(TJSBinary); // A-> with expression, B->statement(s)
{ TJSBinaryExpression } { TJSBinaryExpression - e.g. A operator B }
TJSBinaryExpression = Class(TJSBinary) TJSBinaryExpression = Class(TJSBinary)
Public
Class function OperatorToken : tjsToken; virtual; Class function OperatorToken : tjsToken; virtual;
Class function OperatorString : string; Class function OperatorString : string;
Class Function AllowCompact : Boolean; virtual; Class Function AllowCompact : Boolean; virtual;
end; end;
{ TJSLogicalOrExpression } { TJSLogicalOrExpression - e.g. A || B }
TJSLogicalOrExpression = Class (TJSBinaryExpression) TJSLogicalOrExpression = Class (TJSBinaryExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSLogicalAndExpression } { TJSLogicalAndExpression - e.g. A && B }
TJSLogicalAndExpression = Class (TJSBinaryExpression) TJSLogicalAndExpression = Class (TJSBinaryExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSBitwiseAndExpression } { TJSBitwiseAndExpression - e.g. A & B }
TJSBitwiseAndExpression = Class (TJSBinaryExpression) TJSBitwiseAndExpression = Class (TJSBinaryExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSBitwiseOrExpression } { TJSBitwiseOrExpression - e.g. A | B }
TJSBitwiseOrExpression = Class (TJSBinaryExpression) TJSBitwiseOrExpression = Class (TJSBinaryExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSBitwiseXOrExpression } { TJSBitwiseXOrExpression - e.g. A ^ B }
TJSBitwiseXOrExpression = Class (TJSBinaryExpression) TJSBitwiseXOrExpression = Class (TJSBinaryExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
@ -468,25 +489,25 @@ Type
TJSEqualityExpression = Class (TJSBinaryExpression); TJSEqualityExpression = Class (TJSBinaryExpression);
{ TJSEqualityExpressionEQ } { TJSEqualityExpressionEQ - e.g. A == B }
TJSEqualityExpressionEQ = Class(TJSEqualityExpression) TJSEqualityExpressionEQ = Class(TJSEqualityExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSEqualityExpressionNE } { TJSEqualityExpressionNE - e.g. A != B }
TJSEqualityExpressionNE = Class(TJSEqualityExpression) TJSEqualityExpressionNE = Class(TJSEqualityExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSEqualityExpressionSEQ } { TJSEqualityExpressionSEQ strict equal - e.g. A === B }
TJSEqualityExpressionSEQ = Class(TJSEqualityExpression) TJSEqualityExpressionSEQ = Class(TJSEqualityExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSEqualityExpressionSNE } { TJSEqualityExpressionSNE not strict equal - e.g. A !== B }
TJSEqualityExpressionSNE = Class(TJSEqualityExpression) TJSEqualityExpressionSNE = Class(TJSEqualityExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
@ -494,38 +515,38 @@ Type
TJSRelationalExpression = Class(TJSBinaryExpression); TJSRelationalExpression = Class(TJSBinaryExpression);
{ TJSRelationalExpressionLT } { TJSRelationalExpressionLT lower than - e.g. A < B }
TJSRelationalExpressionLT = Class(TJSRelationalExpression) TJSRelationalExpressionLT = Class(TJSRelationalExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSRelationalExpressionGT } { TJSRelationalExpressionGT greater than - e.g. A > B }
TJSRelationalExpressionGT = Class(TJSRelationalExpression) TJSRelationalExpressionGT = Class(TJSRelationalExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSRelationalExpressionLE } { TJSRelationalExpressionLE lower equal - e.g. A <= B }
TJSRelationalExpressionLE = Class(TJSRelationalExpression) TJSRelationalExpressionLE = Class(TJSRelationalExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSRelationalExpressionGE } { TJSRelationalExpressionGE greater equal - e.g. A >= B }
TJSRelationalExpressionGE = Class(TJSRelationalExpression) TJSRelationalExpressionGE = Class(TJSRelationalExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSRelationalExpressionIn } { TJSRelationalExpressionIn - e.g. A in B }
TJSRelationalExpressionIn = Class(TJSRelationalExpression) TJSRelationalExpressionIn = Class(TJSRelationalExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
Class Function AllowCompact : Boolean; override; Class Function AllowCompact : Boolean; override;
end; end;
{ TJSRelationalExpressionInstanceOf } { TJSRelationalExpressionInstanceOf - e.g. A instanceof B }
TJSRelationalExpressionInstanceOf = Class(TJSRelationalExpression) TJSRelationalExpressionInstanceOf = Class(TJSRelationalExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
@ -534,19 +555,19 @@ Type
TJSShiftExpression = Class(TJSBinaryExpression); TJSShiftExpression = Class(TJSBinaryExpression);
{ TJSLShiftExpression } { TJSLShiftExpression - e.g. A << B }
TJSLShiftExpression = Class(TJSShiftExpression) TJSLShiftExpression = Class(TJSShiftExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSRShiftExpression } { TJSRShiftExpression right shift keep sign - e.g. A >> B }
TJSRShiftExpression = Class(TJSShiftExpression) TJSRShiftExpression = Class(TJSShiftExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSURShiftExpression } { TJSURShiftExpression right shift unsigned, insert zeroes - e.g. A >>> B }
TJSURShiftExpression = Class(TJSShiftExpression) TJSURShiftExpression = Class(TJSShiftExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
@ -554,13 +575,13 @@ Type
TJSAdditiveExpression = Class(TJSBinaryExpression); TJSAdditiveExpression = Class(TJSBinaryExpression);
{ TJSAdditiveExpressionPlus } { TJSAdditiveExpressionPlus - e.g. A + B }
TJSAdditiveExpressionPlus = Class(TJSAdditiveExpression) TJSAdditiveExpressionPlus = Class(TJSAdditiveExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSAdditiveExpressionMinus } { TJSAdditiveExpressionMinus - e.g. A - B }
TJSAdditiveExpressionMinus = Class(TJSAdditiveExpression) TJSAdditiveExpressionMinus = Class(TJSAdditiveExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
@ -568,31 +589,31 @@ Type
TJSMultiplicativeExpression = Class(TJSBinaryExpression); TJSMultiplicativeExpression = Class(TJSBinaryExpression);
{ TJSMultiplicativeExpressionMul } { TJSMultiplicativeExpressionMul - e.g. A * B }
TJSMultiplicativeExpressionMul = Class(TJSMultiplicativeExpression) TJSMultiplicativeExpressionMul = Class(TJSMultiplicativeExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSMultiplicativeExpressionDiv } { TJSMultiplicativeExpressionDiv - e.g. A / B }
TJSMultiplicativeExpressionDiv = Class(TJSMultiplicativeExpression) TJSMultiplicativeExpressionDiv = Class(TJSMultiplicativeExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSMultiplicativeExpressionMod } { TJSMultiplicativeExpressionMod - e.g. A % B }
TJSMultiplicativeExpressionMod = Class(TJSMultiplicativeExpression) TJSMultiplicativeExpressionMod = Class(TJSMultiplicativeExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSCommaExpression } { TJSCommaExpression - e.g. A , B }
TJSCommaExpression = Class(TJSBinaryExpression) TJSCommaExpression = Class(TJSBinaryExpression)
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSConditionalExpression } { TJSConditionalExpression - e.g. A ? B :C }
TJSConditionalExpression = Class(TJSElement) TJSConditionalExpression = Class(TJSElement)
private private
@ -606,7 +627,7 @@ Type
Property C : TJSElement Read FC Write FC; Property C : TJSElement Read FC Write FC;
end; end;
{ TJSAssignStatement } { TJSAssignStatement - e.g. LHS operator Expr }
TJSAssignStatement = Class(TJSElement) TJSAssignStatement = Class(TJSElement)
private private
@ -622,79 +643,91 @@ Type
TJSAssignStatementClass = Class of TJSAssignStatement; TJSAssignStatementClass = Class of TJSAssignStatement;
{ TJSSimpleAssignStatement } { TJSSimpleAssignStatement - e.g. LHS=Expr }
TJSSimpleAssignStatement = Class(TJSAssignStatement) TJSSimpleAssignStatement = Class(TJSAssignStatement)
Public
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSMulEqAssignStatement } { TJSMulEqAssignStatement - e.g. LHS*=Expr }
TJSMulEqAssignStatement = Class(TJSAssignStatement) TJSMulEqAssignStatement = Class(TJSAssignStatement)
Public
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSDivEqAssignStatement } { TJSDivEqAssignStatement - e.g. LHS/=Expr }
TJSDivEqAssignStatement = Class(TJSAssignStatement) TJSDivEqAssignStatement = Class(TJSAssignStatement)
Public
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSModEqAssignStatement } { TJSModEqAssignStatement - e.g. LHS%=Expr }
TJSModEqAssignStatement = Class(TJSAssignStatement) TJSModEqAssignStatement = Class(TJSAssignStatement)
Public
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSAddEqAssignStatement } { TJSAddEqAssignStatement - e.g. LHS+=Expr }
TJSAddEqAssignStatement = Class(TJSAssignStatement) TJSAddEqAssignStatement = Class(TJSAssignStatement)
Public
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSSubEqAssignStatement } { TJSSubEqAssignStatement - e.g. LHS-=Expr }
TJSSubEqAssignStatement = Class(TJSAssignStatement) TJSSubEqAssignStatement = Class(TJSAssignStatement)
Public
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSLShiftEqAssignStatement } { TJSLShiftEqAssignStatement - e.g. LHS<<=Expr }
TJSLShiftEqAssignStatement = Class(TJSAssignStatement) TJSLShiftEqAssignStatement = Class(TJSAssignStatement)
Public
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSRShiftEqAssignStatement } { TJSRShiftEqAssignStatement - e.g. LHS>>=Expr keep sign }
TJSRShiftEqAssignStatement = Class(TJSAssignStatement) TJSRShiftEqAssignStatement = Class(TJSAssignStatement)
Public
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSURShiftEqAssignStatement } { TJSURShiftEqAssignStatement - e.g. LHS>>>=Expr unsigned, insert zeroes }
TJSURShiftEqAssignStatement = Class(TJSAssignStatement) TJSURShiftEqAssignStatement = Class(TJSAssignStatement)
Public
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSANDEqAssignStatement } { TJSANDEqAssignStatement - e.g. LHS&=Expr }
TJSANDEqAssignStatement = Class(TJSAssignStatement) TJSANDEqAssignStatement = Class(TJSAssignStatement)
Public
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSOREqAssignStatement } { TJSOREqAssignStatement - e.g. LHS|=Expr }
TJSOREqAssignStatement = Class(TJSAssignStatement) TJSOREqAssignStatement = Class(TJSAssignStatement)
Public
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSXOREqAssignStatement } { TJSXOREqAssignStatement - e.g. LHS^=Expr }
TJSXOREqAssignStatement = Class(TJSAssignStatement) TJSXOREqAssignStatement = Class(TJSAssignStatement)
Public
Class function OperatorToken : tjsToken; override; Class function OperatorToken : tjsToken; override;
end; end;
{ TJSVarDeclaration } { TJSVarDeclaration - e.g. Name=Init }
TJSVarDeclaration = Class(TJSElement) TJSVarDeclaration = Class(TJSElement)
private private
@ -706,7 +739,7 @@ Type
Property Init : TJSElement Read FInit Write FInit; Property Init : TJSElement Read FInit Write FInit;
end; end;
{ TJSIfStatement } { TJSIfStatement - e.g. if (Cond) btrue else bfalse }
TJSIfStatement = Class(TJSElement) TJSIfStatement = Class(TJSElement)
private private
@ -716,13 +749,13 @@ Type
Public Public
Destructor Destroy; override; Destructor Destroy; override;
Property Cond : TJSElement Read FCond Write FCond; Property Cond : TJSElement Read FCond Write FCond;
Property btrue : TJSElement Read FBTrue Write FBTrue; Property BTrue : TJSElement Read FBTrue Write FBTrue;
Property bfalse : TJSElement Read FBFalse Write FBFalse; Property BFalse : TJSElement Read FBFalse Write FBFalse;
end; end;
{ TJSWhileStatement } { TJSTargetStatement
- base class for statements targetable by continue and break
{ TJSTargetStatement } - TargetName can be empty }
TJSTargetStatement = Class(TJSElement) TJSTargetStatement = Class(TJSElement)
private private
@ -733,17 +766,17 @@ Type
Property TargetName : TJSString Read FTargetName Write FTargetName; Property TargetName : TJSString Read FTargetName Write FTargetName;
end; end;
{ TJSBodyStatement } { TJSBodyStatement - base class }
TJSBodyStatement = Class(TJSTargetStatement) TJSBodyStatement = Class(TJSTargetStatement)
private private
FBody: TJSElement; FBody: TJSElement;
Public Public
Destructor Destroy; override; Destructor Destroy; override;
Property body : TJSElement Read FBody Write FBody; Property Body : TJSElement Read FBody Write FBody;
end; end;
{ TJSCondLoopStatement } { TJSCondLoopStatement - base class for do..while and while..do }
TJSCondLoopStatement = Class(TJSBodyStatement) TJSCondLoopStatement = Class(TJSBodyStatement)
private private
@ -753,10 +786,15 @@ Type
Property Cond : TJSElement Read FCond Write FCond; Property Cond : TJSElement Read FCond Write FCond;
end; end;
{ TJSWhileStatement - e.g. 'while(Cond) Body' }
TJSWhileStatement = Class(TJSCondLoopStatement); TJSWhileStatement = Class(TJSCondLoopStatement);
{ TJSDoWhileStatement - e.g. 'do Body while(Cond)' }
TJSDoWhileStatement = Class(TJSWhileStatement); TJSDoWhileStatement = Class(TJSWhileStatement);
{ TJSForStatement } { TJSForStatement - e.g. 'for(Init;Cond;Incr) Body' }
TJSForStatement = Class(TJSCondLoopStatement) TJSForStatement = Class(TJSCondLoopStatement)
private private
@ -768,7 +806,7 @@ Type
Property Init : TJSElement Read FInit Write FInit; Property Init : TJSElement Read FInit Write FInit;
end; end;
{ TJSForInStatement } { TJSForInStatement - e.g. 'for(LHS in List) Body' }
TJSForInStatement = Class(TJSBodyStatement) TJSForInStatement = Class(TJSBodyStatement)
private private
@ -780,11 +818,15 @@ Type
Property List : TJSElement Read FList Write FList; Property List : TJSElement Read FList Write FList;
end; end;
{ TJSContinueStatement - e.g. 'continue'}
TJSContinueStatement = Class(TJSTargetStatement); TJSContinueStatement = Class(TJSTargetStatement);
{ TJSBreakStatement - e.g. 'break' }
TJSBreakStatement = Class(TJSTargetStatement); TJSBreakStatement = Class(TJSTargetStatement);
{ TJSReturn } { TJSReturn - e.g. 'return Expr'}
TJSReturnStatement = Class(TJSElement) TJSReturnStatement = Class(TJSElement)
private private
@ -794,7 +836,7 @@ Type
Property Expr : TJSElement Read FExpr Write FExpr; Property Expr : TJSElement Read FExpr Write FExpr;
end; end;
{ TJSCaseElement } { TJSCaseElement - element of TJSCaseElements, e.g. 'case Expr: Body' }
TJSCaseElement = Class(TCollectionItem) TJSCaseElement = Class(TCollectionItem)
private private
@ -806,7 +848,7 @@ Type
Property Body : TJSElement Read FBody Write FBody; Property Body : TJSElement Read FBody Write FBody;
end; end;
{ TJSCaseElements } { TJSCaseElements - Cases property of TJSSwitch }
TJSCaseElements = Class(TCollection) TJSCaseElements = Class(TCollection)
private private
@ -816,7 +858,7 @@ Type
Property Cases[AIndex : Integer] : TJSCaseElement Read GetC ;default; Property Cases[AIndex : Integer] : TJSCaseElement Read GetC ;default;
end; end;
{ TJSSwitch } { TJSSwitch - e.g. switch(Cond) Cases }
TJSSwitchStatement = Class(TJSTargetStatement) TJSSwitchStatement = Class(TJSTargetStatement)
private private
@ -828,10 +870,10 @@ Type
Destructor Destroy; override; Destructor Destroy; override;
Property Cond : TJSelement Read FCond Write FCond; Property Cond : TJSelement Read FCond Write FCond;
Property Cases : TJSCaseElements Read FCases; Property Cases : TJSCaseElements Read FCases;
Property TheDefault : TJSCaseelement Read FDefault Write FDefault; Property TheDefault : TJSCaseelement Read FDefault Write FDefault; // one of Cases
end; end;
{ TJSLabeledStatement } { TJSLabeledStatement - e.g. 'TheLabel : A' }
TJSLabeledStatement = Class(TJSUnary) TJSLabeledStatement = Class(TJSUnary)
private private
@ -839,11 +881,11 @@ Type
FTarget: Integer; FTarget: Integer;
Public Public
Destructor Destroy; override; Destructor Destroy; override;
Property target: Integer Read FTarget Write FTarget; Property Target: Integer Read FTarget Write FTarget;
Property TheLabel : TJSLabel Read FLabel Write Flabel; Property TheLabel : TJSLabel Read FLabel Write Flabel;
end; end;
{ TJSTryStatement } { TJSTryStatement - e.g. 'try Block catch(Ident) BCatch finally BFinally' }
TJSTryStatement = Class(TJSElement) TJSTryStatement = Class(TJSElement)
private private
@ -864,9 +906,9 @@ Type
TJSTryFinallyStatement = Class(TJSTryStatement); TJSTryFinallyStatement = Class(TJSTryStatement);
{ TJSFunction } { TJSFunctionDeclarationStatement - as TJSFuncDef, except as a statement }
TJSFunctionDeclarationStatement = Class(TJSelement) TJSFunctionDeclarationStatement = Class(TJSElement)
private private
FFuncDef: TJSFuncDef; FFuncDef: TJSFuncDef;
Public Public
@ -874,16 +916,16 @@ Type
Property AFunction : TJSFuncDef Read FFuncDef Write FFuncDef; Property AFunction : TJSFuncDef Read FFuncDef Write FFuncDef;
end; end;
{ TJSFunctionBody } { TJSFunctionBody - the statement block of a function }
TJSFunctionBody = Class(TJSUnary) TJSFunctionBody = Class(TJSUnary)
private private
FisProgram: Boolean; FIsProgram: Boolean;
Public Public
Property isProgram : Boolean Read FisProgram Write FIsProgram; Property isProgram : Boolean Read FIsProgram Write FIsProgram;
end; end;
{ TJSElementNode } { TJSElementNode - element of TJSElementNodes }
TJSElementNode = Class(TCollectionItem) TJSElementNode = Class(TCollectionItem)
private private
@ -893,7 +935,7 @@ Type
Property Node : TJSElement Read FNode Write FNode; Property Node : TJSElement Read FNode Write FNode;
end; end;
{ TJSElementNodes } { TJSElementNodes - }
TJSElementNodes = Class(TCollection) TJSElementNodes = Class(TCollection)
private private
@ -904,6 +946,7 @@ Type
end; end;
{ TJSSourceElements } { TJSSourceElements }
TJSSourceElements = Class(TJSElement) TJSSourceElements = Class(TJSElement)
private private
FFunctions: TJSElementNodes; FFunctions: TJSElementNodes;
@ -913,11 +956,10 @@ Type
Constructor Create(ALine,ARow : Integer; const ASource : String = ''); override; Constructor Create(ALine,ARow : Integer; const ASource : String = ''); override;
Destructor Destroy; override; Destructor Destroy; override;
Property Statements : TJSElementNodes Read FStatements; Property Statements : TJSElementNodes Read FStatements;
Property functions : TJSElementNodes Read FFunctions; Property Functions : TJSElementNodes Read FFunctions;
Property Vars : TJSElementNodes Read FVars; Property Vars : TJSElementNodes Read FVars;
end; end;
implementation implementation
{$IFDEF NOCLASSES} {$IFDEF NOCLASSES}
@ -1444,7 +1486,7 @@ end;
{ TJSElement } { TJSElement }
constructor TJSElement.Create(ALine, ARow: Integer; Const ASource: String = ''); constructor TJSElement.Create(ALine, ARow: Integer; const ASource: String);
begin begin
FLine:=ALine; FLine:=ALine;
FRow:=ARow; FRow:=ARow;
@ -1809,7 +1851,6 @@ begin
Result:=TJSElementNode(Items[Aindex]) Result:=TJSElementNode(Items[Aindex])
end; end;
function TJSElementNodes.AddNode: TJSElementNode; function TJSElementNodes.AddNode: TJSElementNode;
begin begin
Result:=TJSElementNode(Add); Result:=TJSElementNode(Add);

View File

@ -622,13 +622,10 @@ end;
Procedure TJSWriter.WriteMemberExpression(el : TJSMemberExpression); Procedure TJSWriter.WriteMemberExpression(el : TJSMemberExpression);
Var
I : integer;
A : TJSArguments;
begin begin
if el is TJSNewMemberExpression then if el is TJSNewMemberExpression then
Write('new '); Write('new ');
WriteJS(el.mexpr); WriteJS(el.MExpr);
if el is TJSDotMemberExpression then if el is TJSDotMemberExpression then
begin begin
write('.'); write('.');
@ -651,9 +648,6 @@ end;
Procedure TJSWriter.WriteCallExpression(El : TJSCallExpression); Procedure TJSWriter.WriteCallExpression(El : TJSCallExpression);
Var
I : integer;
A : TJSArguments;
begin begin
WriteJS(El.Expr); WriteJS(El.Expr);
if Assigned(El.Args) then if Assigned(El.Args) then
@ -743,21 +737,19 @@ Procedure TJSWriter.WriteBinary(El : TJSBinary);
Var Var
S : AnsiString; S : AnsiString;
B : Boolean; AllowCompact : Boolean;
T : TJSToken;
begin begin
Write('('); Write('(');
WriteJS(EL.A); WriteJS(EL.A);
B:=False; AllowCompact:=False;
if (el is TJSBinaryExpression) then if (el is TJSBinaryExpression) then
begin begin
S:=TJSBinaryExpression(El).OperatorString; S:=TJSBinaryExpression(El).OperatorString;
B:=TJSBinaryExpression(El).AllowCompact; AllowCompact:=TJSBinaryExpression(El).AllowCompact;
end; end;
If Not (B and (woCompact in Options)) then If Not (AllowCompact and (woCompact in Options)) then
S:=' '+S+' '; S:=' '+S+' ';
Write(s); Write(S);
WriteJS(EL.B); WriteJS(EL.B);
Write(')'); Write(')');
end; end;
@ -778,7 +770,6 @@ Procedure TJSWriter.WriteAssignStatement(El : TJSAssignStatement);
Var Var
S : AnsiString; S : AnsiString;
T : TJSToken;
begin begin
WriteJS(EL.LHS); WriteJS(EL.LHS);
S:=El.OperatorString; S:=El.OperatorString;
@ -823,7 +814,7 @@ begin
if Assigned(El.List) then if Assigned(El.List) then
WriteJS(El.List); WriteJS(El.List);
Write(') '); Write(') ');
if Assigned(El.body) then if Assigned(El.Body) then
WriteJS(El.Body); WriteJS(El.Body);
end; end;
@ -840,7 +831,7 @@ begin
if Assigned(El.Incr) then if Assigned(El.Incr) then
WriteJS(El.Incr); WriteJS(El.Incr);
Write(') '); Write(') ');
if Assigned(El.body) then if Assigned(El.Body) then
WriteJS(El.Body); WriteJS(El.Body);
end; end;
@ -851,7 +842,7 @@ begin
if El is TJSDoWhileStatement then if El is TJSDoWhileStatement then
begin begin
Write('do '); Write('do ');
if Assigned(El.body) then if Assigned(El.Body) then
WriteJS(El.Body); WriteJS(El.Body);
Write(' while ('); Write(' while (');
If Assigned(El.Cond) then If Assigned(El.Cond) then
@ -864,7 +855,7 @@ begin
If Assigned(El.Cond) then If Assigned(El.Cond) then
WriteJS(EL.Cond); WriteJS(EL.Cond);
Write(') '); Write(') ');
if Assigned(El.body) then if Assigned(El.Body) then
WriteJS(El.Body); WriteJS(El.Body);
end; end;
end; end;

View File

@ -4,7 +4,7 @@ program testjs;
uses uses
cwstring,Classes, consoletestrunner, tcscanner, jsparser, jsscanner, jstree, jsbase, cwstring,Classes, consoletestrunner, tcscanner, jsparser, jsscanner, jstree, jsbase,
tcparser, jswriter, tctextwriter, tcwriter, jstoken; tcparser, jswriter, tcwriter, jstoken;
var var
Application: TTestRunner; Application: TTestRunner;