* 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,
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}

View File

@ -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,

View File

@ -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);

View File

@ -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;

View File

@ -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;