jstree.pp 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044
  1. { *********************************************************************
  2. This file is part of the Free Component Library (FCL)
  3. Copyright (c) 2016 Michael Van Canneyt.
  4. Javascript syntax tree definitions
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. unit jstree;
  12. {$mode objfpc}{$H+}
  13. { $DEFINE NOCLASSES}
  14. interface
  15. uses
  16. {$IFNDEF NOCLASSES} Classes, {$ENDIF} SysUtils, jsbase, jstoken;
  17. Type
  18. {$IFDEF NOCLASSES}
  19. { TStrings }
  20. {$M+}
  21. TStrings = Class(TObject)
  22. private
  23. FCount: Integer;
  24. FStrings : Array of String;
  25. function GetCount: Integer;
  26. function GetS(AIndex : Integer): String;
  27. procedure SetS(AIndex : Integer; AValue: String);
  28. Public
  29. Function Add(Const S : String) : Integer;
  30. Procedure Assign(Source : TStrings);
  31. Property Strings[AIndex : Integer] : String Read GetS Write SetS; default;
  32. Property Count : Integer Read GetCount;
  33. end;
  34. TStringList = TStrings;
  35. EListError = Class(Exception);
  36. TCollection = Class;
  37. { TCollectionItem }
  38. TCollectionItem = Class
  39. Private
  40. FCollection : TCollection;
  41. Public
  42. Constructor Create(ACollection : TCollection);
  43. Destructor Destroy; override;
  44. end;
  45. TCollectionItemClass = Class of TCollectionItem;
  46. { TCollection }
  47. TCollection = Class
  48. private
  49. FCount: Integer;
  50. FItems : Array of TCollectionItem;
  51. FItemClass : TCollectionItemClass;
  52. function GetCount: Integer;
  53. function GetI(AIndex : Integer): TCollectionItem;
  54. public
  55. Constructor Create(AItemClass : TCollectionItemClass);
  56. Destructor Destroy; override;
  57. Procedure Clear;
  58. Procedure Remove(AItem : TCollectionItem);
  59. Function Add : TCollectionItem;
  60. Property Items[AIndex : Integer] : TCollectionItem Read GetI;default;
  61. Property Count : Integer Read GetCount;
  62. end;
  63. {$M-}
  64. {$ENDIF}
  65. TJSElementFlag = (elIsConst,elIsConstValid);
  66. TJSElementFlags = set of TJSElementFlag;
  67. TJSFunctionBody = Class;
  68. { TJSElement }
  69. TJSObject = Class(TObject);
  70. { TJSLabelSet }
  71. TJSLabelSet = Class(TJSObject)
  72. private
  73. FCont: Boolean;
  74. FNext: TJSLabelSet;
  75. FTarget: Cardinal;
  76. Public
  77. Property Target : Cardinal Read FTarget Write FTarget;
  78. Property Next : TJSLabelSet Read FNext Write FNext; // Linked list
  79. Property Continuable : Boolean Read FCont Write FCont;
  80. end;
  81. { TJSLabel }
  82. TJSLabel = Class(TJSObject)
  83. private
  84. FLabelSet: TJSLabelSet;
  85. FLocationLine: Integer;
  86. FLocationPos: Integer;
  87. FLocationSource: String;
  88. FName: String;
  89. FNext: TJSLabel;
  90. Public
  91. Property Name : String Read FName Write FName;
  92. Property LabelSet : TJSLabelSet Read FLabelSet Write FLabelSet;
  93. Property LocationSource : String Read FLocationSource Write FLocationSource;
  94. Property LocationLine : Integer Read FLocationLine Write FLocationLine;
  95. Property LocationPos : Integer Read FLocationPos Write FLocationPos;
  96. Property Next : TJSLabel Read FNext Write FNext;
  97. end;
  98. TJSString = jsbase.TJSString; // beware of jstoken.tjsString
  99. { TJSFuncDef - part of TJSFunctionDeclarationStatement, e.g. 'function Name(Params)Body' }
  100. TJSFuncDef = Class(TJSObject)
  101. private
  102. FBody: TJSFunctionBody;
  103. FIsAsync: Boolean;
  104. FIsEmpty: Boolean;
  105. FName: TJSString;
  106. FParams: TStrings;
  107. procedure SetParams(const AValue: TStrings);
  108. Public
  109. Constructor Create;
  110. Destructor Destroy; override;
  111. Property Params : TStrings Read FParams Write SetParams;
  112. Property Body : TJSFunctionBody Read FBody Write FBody; // can be nil
  113. Property Name : TJSString Read FName Write FName;
  114. Property IsEmpty : Boolean Read FIsEmpty Write FIsEmpty;
  115. Property IsAsync : Boolean Read FIsAsync Write FIsAsync;
  116. end;
  117. { TJSElement }
  118. TJSElement = Class(TJSObject)
  119. private
  120. FFlags: TJSElementFlags;
  121. FLine: Integer;
  122. FColumn: Integer;
  123. FSource: String;
  124. Public
  125. Constructor Create(ALine,AColumn : Integer; Const ASource : String = ''); virtual;
  126. Procedure AssignPosition(El: TJSElement); virtual;
  127. Property Source : String Read FSource Write FSource;
  128. Property Line : Integer Read FLine Write FLine;
  129. Property Column : Integer Read FColumn Write FColumn;
  130. Property Flags : TJSElementFlags Read FFlags Write FFlags;
  131. end;
  132. TJSElementClass = Class of TJSElement;
  133. TJSElementArray = array of TJSElement;
  134. { TJSEmptyBlockStatement - empty curly brackets }
  135. TJSEmptyBlockStatement = Class(TJSElement);
  136. { TJSEmptyStatement - a dummy placeholder, needs sometimes a single semicolon }
  137. TJSEmptyStatement = Class(TJSElement);
  138. { TJSLiteral }
  139. TJSLiteral = Class(TJSElement)
  140. private
  141. FValue: TJSValue;
  142. Public
  143. Constructor Create(ALine,AColumn : Integer; Const ASource : String = ''); override;
  144. Destructor Destroy; override;
  145. Property Value : TJSValue Read FValue Write FValue;
  146. end;
  147. { TJSRegularExpressionLiteral - /Pattern/PatternFlags }
  148. TJSRegularExpressionLiteral = Class(TJSElement)
  149. private
  150. FPattern: TJSValue;
  151. FPatternFlags: TJSValue;
  152. FArgv : Array[0..1] of TJSValue;
  153. function GetA(AIndex : integer): TJSValue;
  154. procedure SetA(AIndex : integer; const AValue: TJSValue);
  155. Public
  156. Constructor Create(ALine,AColumn : Integer; Const ASource : String = ''); override;
  157. Destructor Destroy; override;
  158. Property Pattern : TJSValue Read FPattern Write FPattern;
  159. Property PatternFlags : TJSValue Read FPatternFlags Write FPatternFlags;
  160. Property Argv[AIndex : integer] : TJSValue Read GetA Write SetA;
  161. end;
  162. TJSPrimaryExpression = Class(TJSElement);
  163. TJSPrimaryExpressionThis = Class(TJSPrimaryExpression); // 'this'
  164. { TJSPrimaryExpressionIdent }
  165. TJSPrimaryExpressionIdent = Class(TJSPrimaryExpression)
  166. private
  167. FName: TJSString;
  168. Public
  169. Property Name : TJSString Read FName Write FName;
  170. end;
  171. { TJSArrayLiteralElement - an item of a TJSArrayLiteralElements }
  172. TJSArrayLiteralElement = Class(TCollectionItem)
  173. private
  174. FExpr: TJSelement;
  175. FElementIndex: Integer;
  176. Public
  177. Destructor Destroy; override;
  178. Property Expr : TJSElement Read FExpr Write FExpr;
  179. Property ElementIndex : Integer Read FElementIndex Write FElementIndex;
  180. end;
  181. { TJSArrayLiteralElements - Elements property of TJSArrayLiteral }
  182. TJSArrayLiteralElements = Class(TCollection)
  183. private
  184. function GetE(AIndex : Integer): TJSArrayLiteralElement;
  185. Public
  186. Function AddElement : TJSArrayLiteralElement;
  187. Property Elements[AIndex : Integer] : TJSArrayLiteralElement Read GetE ; default;
  188. end;
  189. { TJSArrayLiteral - [element1,...] or Args of a function }
  190. TJSArrayLiteral = Class(TJSElement)
  191. private
  192. FElements: TJSArrayLiteralElements;
  193. Public
  194. Constructor Create(ALine,AColumn : Integer; const ASource : String = ''); override;
  195. procedure AddElement(El: TJSElement);
  196. Destructor Destroy; override;
  197. Property Elements : TJSArrayLiteralElements Read FElements;
  198. end;
  199. { TJSObjectLiteralElement - an item of TJSObjectLiteralElements }
  200. TJSObjectLiteralElement = Class(TCollectionItem)
  201. private
  202. FExpr: TJSelement;
  203. FName: TJSString;
  204. Public
  205. Destructor Destroy; override;
  206. Property Expr : TJSElement Read FExpr Write FExpr;
  207. Property Name : TJSString Read FName Write FName;
  208. end;
  209. { TJSObjectLiteralElements - Elements property of TJSObjectLiteral }
  210. TJSObjectLiteralElements = Class(TCollection)
  211. private
  212. function GetE(AIndex : Integer): TJSObjectLiteralElement;
  213. Public
  214. Function AddElement : TJSObjectLiteralElement;
  215. Property Elements[AIndex : Integer] : TJSObjectLiteralElement Read GetE ; default;
  216. end;
  217. { TJSObjectLiteral }
  218. TJSObjectLiteral = Class(TJSElement)
  219. private
  220. FElements: TJSObjectLiteralElements;
  221. Public
  222. Constructor Create(ALine,AColumn : Integer; const ASource : String = ''); override;
  223. Destructor Destroy; override;
  224. Property Elements : TJSObjectLiteralElements Read FElements;
  225. end;
  226. { TJSArguments - (element1,...) }
  227. TJSArguments = Class(TJSArrayLiteral);
  228. { TJSMemberExpression - base class }
  229. TJSMemberExpression = Class(TJSElement)
  230. private
  231. FMexpr: TJSElement;
  232. Public
  233. Destructor Destroy; override;
  234. Property MExpr : TJSElement Read FMexpr Write FMexpr;
  235. end;
  236. { TJSNewMemberExpression - e.g. 'new MExpr(Args)' }
  237. TJSNewMemberExpression = Class(TJSMemberExpression)
  238. private
  239. FArgs: TJSArguments;
  240. Public
  241. Destructor Destroy; override;
  242. procedure AddArg(El: TJSElement);
  243. Property Args : TJSArguments Read FArgs Write FArgs;
  244. end;
  245. { TJSDotMemberExpression - e.g. 'MExpr.Name' }
  246. TJSDotMemberExpression = Class(TJSMemberExpression)
  247. private
  248. FName: TJSString;
  249. Public
  250. Property Name : TJSString Read FName Write FName;
  251. end;
  252. { TJSBracketMemberExpression - e.g. 'MExpr[Name]' }
  253. TJSBracketMemberExpression = Class(TJSMemberExpression)
  254. private
  255. FName: TJSElement;
  256. Public
  257. Destructor Destroy; override;
  258. Property Name : TJSElement Read FName Write FName;
  259. end;
  260. { TJSCallExpression - e.g. 'Expr(Args)'}
  261. TJSCallExpression = Class(TJSElement)
  262. private
  263. FArgs: TJSArguments;
  264. FExpr: TJSElement;
  265. Public
  266. Destructor Destroy; override;
  267. procedure AddArg(El: TJSElement);
  268. procedure InsertArg(Index: integer; El: TJSElement);
  269. Property Expr : TJSElement Read FExpr Write FExpr;
  270. Property Args : TJSArguments Read FArgs Write FArgs;
  271. end;
  272. { TJSUnary - e.g. 'PrefixOperator A PostFixOperator', '--i' }
  273. TJSUnary = Class(TJSElement)
  274. private
  275. FA: TJSElement;
  276. Public
  277. Class function PrefixOperatorToken : tjsToken; virtual;
  278. Class function PostFixOperatorToken : tjsToken; virtual;
  279. Class function PrefixOperator : String;
  280. Class function PostFixOperator : String;
  281. Destructor Destroy; override;
  282. Property A : TJSElement Read FA Write FA;
  283. end;
  284. TJSUnaryClass = class of TJSUnary;
  285. { TJSVariableStatement - e.g. 'var A' }
  286. TJSVariableStatement = Class(TJSUnary);
  287. { TJSExpressionStatement - A; }
  288. TJSExpressionStatement = Class(TJSUnary);
  289. { TJSThrowStatement - e.g. 'throw A' }
  290. TJSThrowStatement = Class(TJSUnary)
  291. Public
  292. Class function PrefixOperatorToken : tjsToken; Override;
  293. end;
  294. TJSUnaryExpression = Class(TJSUnary);
  295. { TJSUnaryDeleteExpression - e.g. 'delete A' }
  296. TJSUnaryDeleteExpression = Class(TJSUnaryExpression)
  297. Public
  298. Class function PrefixOperatorToken : tjsToken; override;
  299. end;
  300. { TJSUnaryVoidExpression - e.g. 'void A' }
  301. TJSUnaryVoidExpression = Class(TJSUnaryExpression)
  302. Public
  303. Class function PrefixOperatorToken : tjsToken; override;
  304. end;
  305. { TJSUnaryTypeOfExpression - e.g. 'typeof A' }
  306. TJSUnaryTypeOfExpression = Class(TJSUnaryExpression)
  307. Public
  308. Class function PrefixOperatorToken : tjsToken; override;
  309. end;
  310. { TJSAwaitExpression - e.g. 'await A' }
  311. TJSAwaitExpression = Class(TJSUnaryExpression)
  312. Public
  313. Class function PrefixOperatorToken : tjsToken; Override;
  314. end;
  315. { TJSUnaryPrePlusPlusExpression - e.g. '++A' }
  316. TJSUnaryPrePlusPlusExpression = Class(TJSUnaryExpression)
  317. Public
  318. Class function PrefixOperatorToken : tjsToken; override;
  319. end;
  320. { TJSUnaryPreMinusMinusExpression - e.g. '--A' }
  321. TJSUnaryPreMinusMinusExpression = Class(TJSUnaryExpression)
  322. Public
  323. Class function PrefixOperatorToken : tjsToken; override;
  324. end;
  325. { TJSUnaryPlusExpression - e.g. '+A' }
  326. TJSUnaryPlusExpression = Class(TJSUnaryExpression)
  327. Public
  328. Class function PrefixOperatorToken : tjsToken; override;
  329. end;
  330. { TJSUnaryMinusExpression - e.g. '-A' }
  331. TJSUnaryMinusExpression = Class(TJSUnaryExpression)
  332. Public
  333. Class function PrefixOperatorToken : tjsToken; override;
  334. end;
  335. { TJSUnaryInvExpression - e.g. '~A' }
  336. TJSUnaryInvExpression = Class(TJSUnaryExpression)
  337. Public
  338. Class function PrefixOperatorToken : tjsToken; override;
  339. end;
  340. { TJSUnaryNotExpression - e.g. '!A' }
  341. TJSUnaryNotExpression = Class(TJSUnaryExpression)
  342. Public
  343. Class function PrefixOperatorToken : tjsToken; override;
  344. end;
  345. { TJSUnaryPostPlusPlusExpression - e.g. 'A++' }
  346. TJSUnaryPostPlusPlusExpression = Class(TJSUnaryExpression)
  347. Public
  348. Class function PostFixOperatorToken : tjsToken; override;
  349. end;
  350. { TJSUnaryPostMinusMinusExpression - e.g. 'A--' }
  351. TJSUnaryPostMinusMinusExpression = Class(TJSUnaryExpression)
  352. Public
  353. Class function PostFixOperatorToken : tjsToken; override;
  354. end;
  355. { TJSUnaryBracketsExpression - e.g. '(A)' }
  356. TJSUnaryBracketsExpression = Class(TJSUnaryExpression)
  357. Public
  358. Class function PrefixOperatorToken : tjsToken; override;
  359. Class function PostFixOperatorToken : tjsToken; override;
  360. end;
  361. { TJSBinary - base class }
  362. TJSBinary = Class(TJSElement)
  363. private
  364. FA: TJSElement;
  365. FB: TJSElement;
  366. Public
  367. Destructor Destroy; override;
  368. Property A : TJSElement Read FA Write FA;
  369. Property B : TJSElement Read FB Write FB;
  370. end;
  371. TJSBinaryClass = Class of TJSBinary;
  372. { TJSStatementList - a list of statements enclosed in curly brackets }
  373. TJSStatementList = Class(TJSBinary); // A->first statement, B->next in list, chained.
  374. { TJSVariableDeclarationList }
  375. TJSVariableDeclarationList = Class(TJSBinary); // A->first variable, B->next in list, chained.
  376. { TJSWithStatement - with(A)do B; }
  377. TJSWithStatement = Class(TJSBinary); // A-> with expression, B->statement(s)
  378. { TJSBinaryExpression - e.g. A operator B }
  379. TJSBinaryExpression = Class(TJSBinary)
  380. Public
  381. Class function OperatorToken : tjsToken; virtual;
  382. Class function OperatorString : string;
  383. Class Function AllowCompact : Boolean; virtual;
  384. end;
  385. { TJSLogicalOrExpression - e.g. A || B }
  386. TJSLogicalOrExpression = Class (TJSBinaryExpression)
  387. Class function OperatorToken : tjsToken; override;
  388. end;
  389. { TJSLogicalAndExpression - e.g. A && B }
  390. TJSLogicalAndExpression = Class (TJSBinaryExpression)
  391. Class function OperatorToken : tjsToken; override;
  392. end;
  393. { TJSBitwiseAndExpression - e.g. A & B }
  394. TJSBitwiseAndExpression = Class (TJSBinaryExpression)
  395. Class function OperatorToken : tjsToken; override;
  396. end;
  397. { TJSBitwiseOrExpression - e.g. A | B }
  398. TJSBitwiseOrExpression = Class (TJSBinaryExpression)
  399. Class function OperatorToken : tjsToken; override;
  400. end;
  401. { TJSBitwiseXOrExpression - e.g. A ^ B }
  402. TJSBitwiseXOrExpression = Class (TJSBinaryExpression)
  403. Class function OperatorToken : tjsToken; override;
  404. end;
  405. TJSEqualityExpression = Class (TJSBinaryExpression);
  406. { TJSEqualityExpressionEQ - e.g. A == B }
  407. TJSEqualityExpressionEQ = Class(TJSEqualityExpression)
  408. Class function OperatorToken : tjsToken; override;
  409. end;
  410. { TJSEqualityExpressionNE - e.g. A != B }
  411. TJSEqualityExpressionNE = Class(TJSEqualityExpression)
  412. Class function OperatorToken : tjsToken; override;
  413. end;
  414. { TJSEqualityExpressionSEQ strict equal - e.g. A === B }
  415. TJSEqualityExpressionSEQ = Class(TJSEqualityExpression)
  416. Class function OperatorToken : tjsToken; override;
  417. end;
  418. { TJSEqualityExpressionSNE not strict equal - e.g. A !== B }
  419. TJSEqualityExpressionSNE = Class(TJSEqualityExpression)
  420. Class function OperatorToken : tjsToken; override;
  421. end;
  422. TJSRelationalExpression = Class(TJSBinaryExpression);
  423. { TJSRelationalExpressionLT lower than - e.g. A < B }
  424. TJSRelationalExpressionLT = Class(TJSRelationalExpression)
  425. Class function OperatorToken : tjsToken; override;
  426. end;
  427. { TJSRelationalExpressionGT greater than - e.g. A > B }
  428. TJSRelationalExpressionGT = Class(TJSRelationalExpression)
  429. Class function OperatorToken : tjsToken; override;
  430. end;
  431. { TJSRelationalExpressionLE lower equal - e.g. A <= B }
  432. TJSRelationalExpressionLE = Class(TJSRelationalExpression)
  433. Class function OperatorToken : tjsToken; override;
  434. end;
  435. { TJSRelationalExpressionGE greater equal - e.g. A >= B }
  436. TJSRelationalExpressionGE = Class(TJSRelationalExpression)
  437. Class function OperatorToken : tjsToken; override;
  438. end;
  439. { TJSRelationalExpressionIn - e.g. A in B }
  440. TJSRelationalExpressionIn = Class(TJSRelationalExpression)
  441. Class function OperatorToken : tjsToken; override;
  442. Class Function AllowCompact : Boolean; override;
  443. end;
  444. { TJSRelationalExpressionInstanceOf - e.g. A instanceof B }
  445. TJSRelationalExpressionInstanceOf = Class(TJSRelationalExpression)
  446. Class function OperatorToken : tjsToken; override;
  447. Class Function AllowCompact : Boolean; override;
  448. end;
  449. TJSShiftExpression = Class(TJSBinaryExpression);
  450. { TJSLShiftExpression - e.g. A << B }
  451. TJSLShiftExpression = Class(TJSShiftExpression)
  452. Class function OperatorToken : tjsToken; override;
  453. end;
  454. { TJSRShiftExpression right shift keep sign - e.g. A >> B }
  455. TJSRShiftExpression = Class(TJSShiftExpression)
  456. Class function OperatorToken : tjsToken; override;
  457. end;
  458. { TJSURShiftExpression right shift unsigned, insert zeroes - e.g. A >>> B }
  459. TJSURShiftExpression = Class(TJSShiftExpression)
  460. Class function OperatorToken : tjsToken; override;
  461. end;
  462. TJSAdditiveExpression = Class(TJSBinaryExpression);
  463. { TJSAdditiveExpressionPlus - e.g. A + B }
  464. TJSAdditiveExpressionPlus = Class(TJSAdditiveExpression)
  465. Class function OperatorToken : tjsToken; override;
  466. end;
  467. { TJSAdditiveExpressionMinus - e.g. A - B }
  468. TJSAdditiveExpressionMinus = Class(TJSAdditiveExpression)
  469. Class function OperatorToken : tjsToken; override;
  470. end;
  471. TJSMultiplicativeExpression = Class(TJSBinaryExpression);
  472. { TJSMultiplicativeExpressionMul - e.g. A * B }
  473. TJSMultiplicativeExpressionMul = Class(TJSMultiplicativeExpression)
  474. Class function OperatorToken : tjsToken; override;
  475. end;
  476. { TJSMultiplicativeExpressionDiv - e.g. A / B }
  477. TJSMultiplicativeExpressionDiv = Class(TJSMultiplicativeExpression)
  478. Class function OperatorToken : tjsToken; override;
  479. end;
  480. { TJSMultiplicativeExpressionMod - e.g. A % B }
  481. TJSMultiplicativeExpressionMod = Class(TJSMultiplicativeExpression)
  482. Class function OperatorToken : tjsToken; override;
  483. end;
  484. { TJSCommaExpression - e.g. A , B }
  485. TJSCommaExpression = Class(TJSBinaryExpression)
  486. Class function OperatorToken : tjsToken; override;
  487. end;
  488. { TJSConditionalExpression - e.g. A ? B :C }
  489. TJSConditionalExpression = Class(TJSElement)
  490. private
  491. FA: TJSElement;
  492. FB: TJSElement;
  493. FC: TJSElement;
  494. Public
  495. Destructor Destroy; override;
  496. Property A : TJSElement Read FA Write FA;
  497. Property B : TJSElement Read FB Write FB;
  498. Property C : TJSElement Read FC Write FC;
  499. end;
  500. { TJSAssignStatement - e.g. LHS operator Expr }
  501. TJSAssignStatement = Class(TJSElement)
  502. private
  503. FExpr: TJSElement;
  504. FLHS: TJSElement;
  505. Public
  506. Destructor Destroy; override;
  507. Class function OperatorToken : tjsToken; virtual;
  508. Class function OperatorString : String;
  509. Property Expr : TJSElement Read FExpr Write FExpr;
  510. Property LHS : TJSElement Read FLHS Write FLHS;
  511. end;
  512. TJSAssignStatementClass = Class of TJSAssignStatement;
  513. { TJSSimpleAssignStatement - e.g. LHS=Expr }
  514. TJSSimpleAssignStatement = Class(TJSAssignStatement)
  515. Public
  516. Class function OperatorToken : tjsToken; override;
  517. end;
  518. { TJSMulEqAssignStatement - e.g. LHS*=Expr }
  519. TJSMulEqAssignStatement = Class(TJSAssignStatement)
  520. Public
  521. Class function OperatorToken : tjsToken; override;
  522. end;
  523. { TJSDivEqAssignStatement - e.g. LHS/=Expr }
  524. TJSDivEqAssignStatement = Class(TJSAssignStatement)
  525. Public
  526. Class function OperatorToken : tjsToken; override;
  527. end;
  528. { TJSModEqAssignStatement - e.g. LHS%=Expr }
  529. TJSModEqAssignStatement = Class(TJSAssignStatement)
  530. Public
  531. Class function OperatorToken : tjsToken; override;
  532. end;
  533. { TJSAddEqAssignStatement - e.g. LHS+=Expr }
  534. TJSAddEqAssignStatement = Class(TJSAssignStatement)
  535. Public
  536. Class function OperatorToken : tjsToken; override;
  537. end;
  538. { TJSSubEqAssignStatement - e.g. LHS-=Expr }
  539. TJSSubEqAssignStatement = Class(TJSAssignStatement)
  540. Public
  541. Class function OperatorToken : tjsToken; override;
  542. end;
  543. { TJSLShiftEqAssignStatement - e.g. LHS<<=Expr }
  544. TJSLShiftEqAssignStatement = Class(TJSAssignStatement)
  545. Public
  546. Class function OperatorToken : tjsToken; override;
  547. end;
  548. { TJSRShiftEqAssignStatement - e.g. LHS>>=Expr keep sign }
  549. TJSRShiftEqAssignStatement = Class(TJSAssignStatement)
  550. Public
  551. Class function OperatorToken : tjsToken; override;
  552. end;
  553. { TJSURShiftEqAssignStatement - e.g. LHS>>>=Expr unsigned, insert zeroes }
  554. TJSURShiftEqAssignStatement = Class(TJSAssignStatement)
  555. Public
  556. Class function OperatorToken : tjsToken; override;
  557. end;
  558. { TJSANDEqAssignStatement - e.g. LHS&=Expr }
  559. TJSANDEqAssignStatement = Class(TJSAssignStatement)
  560. Public
  561. Class function OperatorToken : tjsToken; override;
  562. end;
  563. { TJSOREqAssignStatement - e.g. LHS|=Expr }
  564. TJSOREqAssignStatement = Class(TJSAssignStatement)
  565. Public
  566. Class function OperatorToken : tjsToken; override;
  567. end;
  568. { TJSXOREqAssignStatement - e.g. LHS^=Expr }
  569. TJSXOREqAssignStatement = Class(TJSAssignStatement)
  570. Public
  571. Class function OperatorToken : tjsToken; override;
  572. end;
  573. { TJSVarDeclaration - e.g. Name=Init }
  574. TJSVarDeclaration = Class(TJSElement)
  575. private
  576. FInit: TJSElement;
  577. FName: String;
  578. Public
  579. Destructor Destroy; override;
  580. Property Name : String Read FName Write FName;
  581. Property Init : TJSElement Read FInit Write FInit;
  582. end;
  583. { TJSIfStatement - e.g. if (Cond) btrue else bfalse }
  584. TJSIfStatement = Class(TJSElement)
  585. private
  586. FBFalse: TJSElement;
  587. FBTrue: TJSElement;
  588. FCond: TJSElement;
  589. Public
  590. Destructor Destroy; override;
  591. Property Cond : TJSElement Read FCond Write FCond;
  592. Property BTrue : TJSElement Read FBTrue Write FBTrue;
  593. Property BFalse : TJSElement Read FBFalse Write FBFalse;
  594. end;
  595. { TJSTargetStatement
  596. - base class for statements targetable by continue and break
  597. - TargetName can be empty }
  598. TJSTargetStatement = Class(TJSElement)
  599. private
  600. FTarget: Cardinal;
  601. FTargetName: TJSString;
  602. Public
  603. Property Target : Cardinal Read FTarget Write FTarget;
  604. Property TargetName : TJSString Read FTargetName Write FTargetName;
  605. end;
  606. { TJSBodyStatement - base class }
  607. TJSBodyStatement = Class(TJSTargetStatement)
  608. private
  609. FBody: TJSElement;
  610. Public
  611. Destructor Destroy; override;
  612. Property Body : TJSElement Read FBody Write FBody;
  613. end;
  614. { TJSCondLoopStatement - base class for do..while and while..do }
  615. TJSCondLoopStatement = Class(TJSBodyStatement)
  616. private
  617. FCond: TJSElement;
  618. Public
  619. Destructor Destroy; override;
  620. Property Cond : TJSElement Read FCond Write FCond;
  621. end;
  622. { TJSWhileStatement - e.g. 'while(Cond) Body' }
  623. TJSWhileStatement = Class(TJSCondLoopStatement);
  624. { TJSDoWhileStatement - e.g. 'do Body while(Cond)' }
  625. TJSDoWhileStatement = Class(TJSWhileStatement);
  626. { TJSForStatement - e.g. 'for(Init;Cond;Incr) Body' }
  627. TJSForStatement = Class(TJSCondLoopStatement)
  628. private
  629. FIncr: TJSElement;
  630. FInit: TJSElement;
  631. Public
  632. Destructor Destroy; override;
  633. Property Incr : TJSElement Read FIncr Write FIncr;
  634. Property Init : TJSElement Read FInit Write FInit;
  635. end;
  636. { TJSForInStatement - e.g. 'for(LHS in List) Body' }
  637. TJSForInStatement = Class(TJSBodyStatement)
  638. private
  639. FLhs: TJSElement;
  640. FList: TJSElement;
  641. Public
  642. Destructor Destroy; override;
  643. Property LHS : TJSElement Read FLHS Write FLHS;
  644. Property List : TJSElement Read FList Write FList;
  645. end;
  646. { TJSContinueStatement - e.g. 'continue'}
  647. TJSContinueStatement = Class(TJSTargetStatement);
  648. { TJSBreakStatement - e.g. 'break' }
  649. TJSBreakStatement = Class(TJSTargetStatement);
  650. { TJSReturn - e.g. 'return Expr'}
  651. TJSReturnStatement = Class(TJSElement)
  652. private
  653. FExpr: TJSElement;
  654. Public
  655. Destructor Destroy; override;
  656. Property Expr : TJSElement Read FExpr Write FExpr;
  657. end;
  658. { TJSCaseElement - element of TJSCaseElements, e.g. 'case Expr: Body' }
  659. TJSCaseElement = Class(TCollectionItem)
  660. private
  661. FBody: TJSElement;
  662. FExpr: TJSelement;
  663. Public
  664. Destructor Destroy; override;
  665. Property Expr : TJSelement Read FExpr Write FExpr;
  666. Property Body : TJSElement Read FBody Write FBody;
  667. end;
  668. { TJSCaseElements - Cases property of TJSSwitch }
  669. TJSCaseElements = Class(TCollection)
  670. private
  671. function GetC(AIndex : Integer): TJSCaseElement;
  672. Public
  673. Function AddCase : TJSCaseElement;
  674. Property Cases[AIndex : Integer] : TJSCaseElement Read GetC ;default;
  675. end;
  676. { TJSSwitch - e.g. switch(Cond) Cases }
  677. TJSSwitchStatement = Class(TJSTargetStatement)
  678. private
  679. FCases: TJSCaseElements;
  680. FCond: TJSelement;
  681. FDefault: TJSCaseElement;
  682. Public
  683. Constructor Create(ALine,AColumn : Integer; const ASource : String = ''); override;
  684. Destructor Destroy; override;
  685. Property Cond : TJSElement Read FCond Write FCond;
  686. Property Cases : TJSCaseElements Read FCases;
  687. Property TheDefault : TJSCaseElement Read FDefault Write FDefault; // one of Cases
  688. end;
  689. { TJSLabeledStatement - e.g. 'TheLabel : A' }
  690. TJSLabeledStatement = Class(TJSUnary)
  691. private
  692. FLabel: TJSLabel;
  693. FTarget: Integer;
  694. Public
  695. Destructor Destroy; override;
  696. Property Target: Integer Read FTarget Write FTarget;
  697. Property TheLabel : TJSLabel Read FLabel Write Flabel;
  698. end;
  699. { TJSTryStatement - e.g. 'try Block catch(Ident) BCatch finally BFinally' }
  700. TJSTryStatement = Class(TJSElement)
  701. private
  702. FBCatch: TJSElement;
  703. FBFinally: TJSElement;
  704. FBlock: TJSElement;
  705. FIdent: TJSString;
  706. Public
  707. Destructor Destroy; override;
  708. Property Block : TJSElement Read FBlock Write FBlock;
  709. Property BCatch : TJSElement Read FBCatch Write FBCatch;
  710. Property BFinally : TJSElement Read FBFinally Write FBFinally;
  711. Property Ident : TJSString Read FIdent Write FIDent;
  712. end;
  713. TJSTryCatchFinallyStatement = Class(TJSTryStatement);
  714. TJSTryCatchStatement = Class(TJSTryStatement);
  715. TJSTryFinallyStatement = Class(TJSTryStatement);
  716. { TJSFunctionDeclarationStatement - same as TJSFuncDef, except as a TJSElement }
  717. TJSFunctionDeclarationStatement = Class(TJSElement)
  718. private
  719. FFuncDef: TJSFuncDef;
  720. Public
  721. Destructor Destroy; override;
  722. Property AFunction : TJSFuncDef Read FFuncDef Write FFuncDef;
  723. end;
  724. { TJSFunctionBody - the statement block of a function }
  725. TJSFunctionBody = Class(TJSUnary)
  726. private
  727. FIsProgram: Boolean;
  728. Public
  729. Property isProgram : Boolean Read FIsProgram Write FIsProgram;
  730. end;
  731. { TJSElementNode - element of TJSElementNodes }
  732. TJSElementNode = Class(TCollectionItem)
  733. private
  734. FNode: TJSElement;
  735. Public
  736. Destructor Destroy; override;
  737. Property Node : TJSElement Read FNode Write FNode;
  738. end;
  739. { TJSElementNodes - see TJSSourceElements }
  740. TJSElementNodes = Class(TCollection)
  741. private
  742. function GetN(AIndex : Integer): TJSElementNode;
  743. Public
  744. Function AddNode : TJSElementNode;
  745. Function InsertNode(Index: integer) : TJSElementNode;
  746. Property Nodes[AIndex : Integer] : TJSElementNode Read GetN ; default;
  747. end;
  748. { TJSSourceElements - a list of elements, every element ends in semicolon,
  749. first Vars, then Functions, finally Statements }
  750. TJSSourceElements = Class(TJSElement)
  751. private
  752. FFunctions: TJSElementNodes;
  753. FStatements: TJSElementNodes;
  754. FVars: TJSElementNodes;
  755. Public
  756. Constructor Create(ALine,AColumn : Integer; const ASource : String = ''); override;
  757. Destructor Destroy; override;
  758. Property Vars : TJSElementNodes Read FVars;
  759. Property Functions : TJSElementNodes Read FFunctions;
  760. Property Statements : TJSElementNodes Read FStatements;
  761. end;
  762. implementation
  763. {$IFDEF NOCLASSES}
  764. { TCollectionItem }
  765. Constructor TCollectionItem.Create(ACollection: TCollection);
  766. begin
  767. FCollection:=ACollection;
  768. end;
  769. Destructor TCollectionItem.Destroy;
  770. begin
  771. if Assigned(FCollection) then
  772. FCollection.Remove(Self);
  773. inherited Destroy;
  774. end;
  775. { TCollection }
  776. function TCollection.GetI(AIndex : Integer): TCollectionItem;
  777. begin
  778. if (AIndex>=0) and (AIndex<FCount) then
  779. Result:=FItems[AIndex]
  780. else
  781. Raise EListError.CreateFmt('Collection index (%d) out of bounds.',[AIndex]);
  782. end;
  783. function TCollection.GetCount: Integer;
  784. begin
  785. Result:=FCount;
  786. end;
  787. Procedure TCollection.Remove(AItem: TCollectionItem);
  788. Var
  789. I,J : Integer;
  790. begin
  791. if (AItem=Nil) then exit;
  792. I:=Count-1;
  793. While (I>=0) and (FItems[I]<>AItem) do
  794. Dec(i);
  795. For J:=I to Count-2 do
  796. FItems[I]:=FItems[i+1];
  797. Dec(FCount);
  798. end;
  799. Constructor TCollection.Create(AItemClass: TCollectionItemClass);
  800. begin
  801. FItemClass:=AItemClass;
  802. end;
  803. Destructor TCollection.Destroy;
  804. begin
  805. Clear;
  806. inherited Destroy;
  807. end;
  808. Procedure TCollection.Clear;
  809. Var
  810. I : Integer;
  811. begin
  812. For I:=0 to Count-1 do
  813. begin
  814. FItems[i].FCollection:=Nil;
  815. FItems[i].Destroy;
  816. end;
  817. FCount:=0;
  818. SetLength(Fitems,0);
  819. end;
  820. Function TCollection.Add: TCollectionItem;
  821. Var
  822. NL : Integer;
  823. begin
  824. If FCount=Length(FItems) then
  825. begin
  826. NL:=Length(FItems)*3 div 2;
  827. if NL=0 then NL:=10;
  828. SetLength(FItems,NL);
  829. end;
  830. Result:=FItemClass.Create(Self);
  831. FItems[FCount]:=Result;
  832. Inc(FCount);
  833. end;
  834. { TStrings }
  835. function TStrings.GetCount: Integer;
  836. begin
  837. Result:=FCount;
  838. end;
  839. function TStrings.GetS(AIndex : Integer): String;
  840. begin
  841. if (AIndex>=0) and (AIndex<FCount) then
  842. Result:=FStrings[AIndex]
  843. else
  844. Raise EListError.CreateFmt('List index (%d) out of bounds.',[AIndex]);
  845. end;
  846. procedure TStrings.SetS(AIndex : Integer; AValue: String);
  847. begin
  848. if (AIndex>=0) and (AIndex<=FCount) then
  849. begin
  850. if (AIndex=FCount) then
  851. Add(AValue)
  852. else
  853. FStrings[AIndex]:=AValue;
  854. end
  855. else
  856. Raise EListError.CreateFmt('List index (%d) out of bounds.',[AIndex]);
  857. end;
  858. Function TStrings.Add(Const S: String): Integer;
  859. Var
  860. NL : Integer;
  861. begin
  862. If FCount=Length(FStrings) then
  863. begin
  864. NL:=Length(FStrings)*3 div 2;
  865. if NL=0 then NL:=10;
  866. SetLength(FStrings,NL);
  867. end;
  868. FStrings[FCount]:=S;
  869. Inc(FCount);
  870. end;
  871. Procedure TStrings.Assign(Source: TStrings);
  872. Var
  873. I : Integer;
  874. begin
  875. SetLength(FStrings,Length(Source.FStrings));
  876. FCount:=Source.FCount;
  877. For I:=0 to FCount-1 do
  878. FStrings[i]:=Source.FStrings[i];
  879. end;
  880. {$ENDIF NOCLASSES}
  881. { TJSXOREqAssignStatement }
  882. Class function TJSXOREqAssignStatement.OperatorToken: tjsToken;
  883. begin
  884. Result:=tjsXOREq;
  885. end;
  886. { TJSOREqAssignStatement }
  887. Class function TJSOREqAssignStatement.OperatorToken: tjsToken;
  888. begin
  889. Result:=tjsOREQ;
  890. end;
  891. { TJSANDEqAssignStatement }
  892. Class function TJSANDEqAssignStatement.OperatorToken: tjsToken;
  893. begin
  894. Result:=tjsAndEq;
  895. end;
  896. { TJSURShiftEqAssignStatement }
  897. Class function TJSURShiftEqAssignStatement.OperatorToken: tjsToken;
  898. begin
  899. Result:=tjsURSHIFTEQ;
  900. end;
  901. { TJSRShiftEqAssignStatement }
  902. Class function TJSRShiftEqAssignStatement.OperatorToken: tjsToken;
  903. begin
  904. Result:=tjsRSHIFTEQ;
  905. end;
  906. { TJSLShiftEqAssignStatement }
  907. Class function TJSLShiftEqAssignStatement.OperatorToken: tjsToken;
  908. begin
  909. Result:=tjsLSHIFTEQ;
  910. end;
  911. { TJSSubEqAssignStatement }
  912. Class function TJSSubEqAssignStatement.OperatorToken: tjsToken;
  913. begin
  914. Result:=tjsMINUSEQ;
  915. end;
  916. { TJSAddEqAssignStatement }
  917. Class function TJSAddEqAssignStatement.OperatorToken: tjsToken;
  918. begin
  919. Result:=tjsPLUSEQ;
  920. end;
  921. { TJSModEqAssignStatement }
  922. Class function TJSModEqAssignStatement.OperatorToken: tjsToken;
  923. begin
  924. Result:=tjsMODEQ;
  925. end;
  926. { TJSDivEqAssignStatement }
  927. Class function TJSDivEqAssignStatement.OperatorToken: tjsToken;
  928. begin
  929. Result:=tjsDIVEQ;
  930. end;
  931. { TJSMulEqAssignStatement }
  932. Class function TJSMulEqAssignStatement.OperatorToken: tjsToken;
  933. begin
  934. Result:=tjsMULEQ;
  935. end;
  936. { TJSSimpleAssignStatement }
  937. Class function TJSSimpleAssignStatement.OperatorToken: tjsToken;
  938. begin
  939. Result:=tjsAssign;
  940. end;
  941. { TJSLabeledStatement }
  942. Destructor TJSLabeledStatement.Destroy;
  943. begin
  944. FreeAndNil(Flabel);
  945. inherited Destroy;
  946. end;
  947. { TJSCommaExpression }
  948. Class function TJSCommaExpression.OperatorToken: tjsToken;
  949. begin
  950. Result:=tjsComma;
  951. end;
  952. { TJSMultiplicativeExpressionMod }
  953. Class function TJSMultiplicativeExpressionMod.OperatorToken: tjsToken;
  954. begin
  955. Result:=tjsMod;
  956. end;
  957. { TJSMultiplicativeExpressionDiv }
  958. Class function TJSMultiplicativeExpressionDiv.OperatorToken: tjsToken;
  959. begin
  960. Result:=tjsDiv;
  961. end;
  962. { TJSMultiplicativeExpressionMul }
  963. Class function TJSMultiplicativeExpressionMul.OperatorToken: tjsToken;
  964. begin
  965. Result:=tjsMul;
  966. end;
  967. { TJSAdditiveExpressionMinus }
  968. Class function TJSAdditiveExpressionMinus.OperatorToken: tjsToken;
  969. begin
  970. Result:=tjsMinus;
  971. end;
  972. { TJSAdditiveExpressionPlus }
  973. Class function TJSAdditiveExpressionPlus.OperatorToken: tjsToken;
  974. begin
  975. Result:=tjsPlus;
  976. end;
  977. { TJSURShiftExpression }
  978. Class function TJSURShiftExpression.OperatorToken: tjsToken;
  979. begin
  980. Result:=tjsURshift;
  981. end;
  982. { TJSRShiftExpression }
  983. Class function TJSRShiftExpression.OperatorToken: tjsToken;
  984. begin
  985. Result:=tjsRSHIFT;
  986. end;
  987. { TJSLShiftExpression }
  988. Class function TJSLShiftExpression.OperatorToken: tjsToken;
  989. begin
  990. Result:=tjsLSHIFT;
  991. end;
  992. { TJSRelationalExpressionInstanceOf }
  993. Class function TJSRelationalExpressionInstanceOf.OperatorToken: tjsToken;
  994. begin
  995. Result:=tjsInstanceOf;
  996. end;
  997. Class Function TJSRelationalExpressionInstanceOf.AllowCompact: Boolean;
  998. begin
  999. Result:=False;
  1000. end;
  1001. { TJSRelationalExpressionIn }
  1002. Class function TJSRelationalExpressionIn.OperatorToken: tjsToken;
  1003. begin
  1004. Result:=tjsIn;
  1005. end;
  1006. Class Function TJSRelationalExpressionIn.AllowCompact: Boolean;
  1007. begin
  1008. Result:=False;
  1009. end;
  1010. { TJSRelationalExpressionGE }
  1011. Class function TJSRelationalExpressionGE.OperatorToken: tjsToken;
  1012. begin
  1013. Result:=tjsGE;
  1014. end;
  1015. { TJSRelationalExpressionLE }
  1016. Class function TJSRelationalExpressionLE.OperatorToken: tjsToken;
  1017. begin
  1018. Result:=tjsLE;
  1019. end;
  1020. { TJSRelationalExpressionGT }
  1021. Class function TJSRelationalExpressionGT.OperatorToken: tjsToken;
  1022. begin
  1023. Result:=tjsGT;
  1024. end;
  1025. { TJSRelationalExpressionLT }
  1026. Class function TJSRelationalExpressionLT.OperatorToken: tjsToken;
  1027. begin
  1028. Result:=tjsLT;
  1029. end;
  1030. { TJSEqualityExpressionSNE }
  1031. Class function TJSEqualityExpressionSNE.OperatorToken: tjsToken;
  1032. begin
  1033. Result:=tjsSNE;
  1034. end;
  1035. { TJSEqualityExpressionSEQ }
  1036. Class function TJSEqualityExpressionSEQ.OperatorToken: tjsToken;
  1037. begin
  1038. Result:=tjsSEQ;
  1039. end;
  1040. { TJSEqualityExpressionNE }
  1041. Class function TJSEqualityExpressionNE.OperatorToken: tjsToken;
  1042. begin
  1043. Result:=tjsNE;
  1044. end;
  1045. { TJSEqualityExpressionEQ }
  1046. Class function TJSEqualityExpressionEQ.OperatorToken: tjsToken;
  1047. begin
  1048. Result:=tjsEQ;
  1049. end;
  1050. { TJSBinaryExpression }
  1051. Class function TJSBinaryExpression.OperatorToken: tjsToken;
  1052. begin
  1053. Result:=tjsUnknown
  1054. end;
  1055. Class function TJSBinaryExpression.OperatorString: string;
  1056. Var
  1057. T : TJSToken;
  1058. begin
  1059. T:=OperatorToken;
  1060. if (T<>tjsUnknown) then
  1061. begin
  1062. Result:=TokenInfos[T]
  1063. end
  1064. else
  1065. Result:='';
  1066. end;
  1067. Class Function TJSBinaryExpression.AllowCompact: Boolean;
  1068. begin
  1069. Result:=True
  1070. end;
  1071. { TJSBitwiseXOrExpression }
  1072. Class function TJSBitwiseXOrExpression.OperatorToken : tjsToken;
  1073. begin
  1074. Result:=tjsXor
  1075. end;
  1076. { TJSBitwiseOrExpression }
  1077. Class function TJSBitwiseOrExpression.OperatorToken : tjsToken;
  1078. begin
  1079. Result:=tjsOr
  1080. end;
  1081. { TJSBitwiseAndExpression }
  1082. Class function TJSBitwiseAndExpression.OperatorToken : tjsToken;
  1083. begin
  1084. Result:=tjsAnd
  1085. end;
  1086. { TJSLogicalAndExpression }
  1087. Class function TJSLogicalAndExpression.OperatorToken : tjsToken;
  1088. begin
  1089. Result:=tjsAndAnd
  1090. end;
  1091. { TJSLogicalOrExpression }
  1092. Class function TJSLogicalOrExpression.OperatorToken : tjsToken;
  1093. begin
  1094. Result:=tjsOrOr
  1095. end;
  1096. { TJSUnaryVoidExpression }
  1097. Class function TJSUnaryVoidExpression.PrefixOperatorToken : tjsToken;
  1098. begin
  1099. Result:=tjsvoid;
  1100. end;
  1101. { TJSThrowStatement }
  1102. Class function TJSThrowStatement.PrefixOperatorToken: tjsToken;
  1103. begin
  1104. Result:=tjsThrow;
  1105. end;
  1106. { TJSUnaryBracketsExpression }
  1107. class function TJSUnaryBracketsExpression.PrefixOperatorToken: tjsToken;
  1108. begin
  1109. Result:=tjsBraceOpen;
  1110. end;
  1111. class function TJSUnaryBracketsExpression.PostFixOperatorToken: tjsToken;
  1112. begin
  1113. Result:=tjsBraceClose;
  1114. end;
  1115. { TJSUnaryPostMinusMinusExpression }
  1116. Class function TJSUnaryPostMinusMinusExpression.PostFixOperatorToken : tjsToken;
  1117. begin
  1118. Result:=tjsMinusMinus;
  1119. end;
  1120. { TJSUnaryPostPlusPlusExpression }
  1121. Class function TJSUnaryPostPlusPlusExpression.PostFixOperatorToken : tjsToken;
  1122. begin
  1123. Result:=tjsPlusPlus;
  1124. end;
  1125. { TJSUnaryNotExpression }
  1126. Class function TJSUnaryNotExpression.PrefixOperatorToken : tjsToken;
  1127. begin
  1128. Result:=tjsNot;
  1129. end;
  1130. { TJSUnaryInvExpression }
  1131. Class function TJSUnaryInvExpression.PrefixOperatorToken : tjsToken;
  1132. begin
  1133. Result:=tjsinv;
  1134. end;
  1135. { TJSUnaryMinusExpression }
  1136. Class function TJSUnaryMinusExpression.PrefixOperatorToken : tjsToken;
  1137. begin
  1138. Result:=tjsMinus;
  1139. end;
  1140. { TJSUnaryPlusExpression }
  1141. Class function TJSUnaryPlusExpression.PrefixOperatorToken : tjsToken;
  1142. begin
  1143. Result:=tjsPlus;
  1144. end;
  1145. { TJSUnaryPreMinusMinusExpression }
  1146. Class function TJSUnaryPreMinusMinusExpression.PrefixOperatorToken : tjsToken;
  1147. begin
  1148. Result:=tjsMinusMinus;
  1149. end;
  1150. { TJSUnaryPrePlusPlusExpression }
  1151. Class function TJSUnaryPrePlusPlusExpression.PrefixOperatorToken : tjsToken;
  1152. begin
  1153. Result:=tjsPlusPlus;
  1154. end;
  1155. { TJSUnaryTypeOfExpression }
  1156. Class function TJSUnaryTypeOfExpression.PrefixOperatorToken : tjsToken;
  1157. begin
  1158. Result:=tjsTypeOf;
  1159. end;
  1160. { TJSAwaitExpression }
  1161. class function TJSAwaitExpression.PrefixOperatorToken: tjsToken;
  1162. begin
  1163. Result:=tjsAwait;
  1164. end;
  1165. { TJSUnaryDeleteExpression }
  1166. Class function TJSUnaryDeleteExpression.PrefixOperatorToken : tjsToken;
  1167. begin
  1168. Result:=tjsdelete;
  1169. end;
  1170. { TJSElement }
  1171. constructor TJSElement.Create(ALine, AColumn: Integer; const ASource: String);
  1172. begin
  1173. FLine:=ALine;
  1174. FColumn:=AColumn;
  1175. FSource:=ASource;
  1176. end;
  1177. procedure TJSElement.AssignPosition(El: TJSElement);
  1178. begin
  1179. Source:=El.Source;
  1180. Line:=El.Line;
  1181. Column:=El.Column;
  1182. end;
  1183. { TJSRegularExpressionLiteral }
  1184. function TJSRegularExpressionLiteral.GetA(AIndex : integer): TJSValue;
  1185. begin
  1186. Result:=FArgv[AIndex];
  1187. end;
  1188. procedure TJSRegularExpressionLiteral.SetA(AIndex : integer;
  1189. const AValue: TJSValue);
  1190. begin
  1191. FArgv[AIndex]:=Avalue;
  1192. end;
  1193. constructor TJSRegularExpressionLiteral.Create(ALine, AColumn: Integer;
  1194. const ASource: String);
  1195. begin
  1196. inherited Create(ALine, AColumn, ASource);
  1197. FPattern:=TJSValue.Create;
  1198. FPatternFlags:=TJSValue.Create;
  1199. end;
  1200. destructor TJSRegularExpressionLiteral.Destroy;
  1201. begin
  1202. FreeAndNil(FPattern);
  1203. FreeAndNil(FPatternFlags);
  1204. Inherited Destroy;
  1205. end;
  1206. { TJSArrayLiteralElements }
  1207. function TJSArrayLiteralElements.GetE(AIndex : Integer): TJSArrayLiteralElement;
  1208. begin
  1209. Result:=TJSArrayLiteralElement(Items[AIndex]);
  1210. end;
  1211. function TJSArrayLiteralElements.AddElement: TJSArrayLiteralElement;
  1212. begin
  1213. Result:=TJSArrayLiteralElement(Add);
  1214. end;
  1215. { TJSArrayLiteral }
  1216. constructor TJSArrayLiteral.Create(ALine, AColumn: Integer; const ASource: String);
  1217. begin
  1218. inherited Create(ALine, AColumn, ASource);
  1219. FElements:=TJSArrayLiteralElements.Create(TJSArrayLiteralElement);
  1220. end;
  1221. procedure TJSArrayLiteral.AddElement(El: TJSElement);
  1222. var
  1223. ArrEl: TJSArrayLiteralElement;
  1224. begin
  1225. ArrEl:=Elements.AddElement;
  1226. ArrEl.ElementIndex:=Elements.Count-1;
  1227. ArrEl.Expr:=El;
  1228. end;
  1229. destructor TJSArrayLiteral.Destroy;
  1230. begin
  1231. FreeAndNil(FElements);
  1232. inherited Destroy;
  1233. end;
  1234. { TJSObjectLiteralElements }
  1235. function TJSObjectLiteralElements.GetE(AIndex : Integer
  1236. ): TJSObjectLiteralElement;
  1237. begin
  1238. Result:=TJSObjectLiteralElement(Items[AIndex]);
  1239. end;
  1240. function TJSObjectLiteralElements.AddElement: TJSObjectLiteralElement;
  1241. begin
  1242. Result:=TJSObjectLiteralElement(Add);
  1243. end;
  1244. { TJSObjectLiteral }
  1245. constructor TJSObjectLiteral.Create(ALine, AColumn: Integer; const ASource: String = '');
  1246. begin
  1247. inherited Create(ALine, AColumn, ASource);
  1248. FElements:=TJSObjectLiteralElements.Create(TJSObjectLiteralElement);
  1249. end;
  1250. destructor TJSObjectLiteral.Destroy;
  1251. begin
  1252. FreeAndNil(FElements);
  1253. inherited Destroy;
  1254. end;
  1255. { TJSObjectLiteralElement }
  1256. destructor TJSObjectLiteralElement.Destroy;
  1257. begin
  1258. FreeAndNil(Fexpr);
  1259. inherited Destroy;
  1260. end;
  1261. { TJSArrayLiteralElement }
  1262. destructor TJSArrayLiteralElement.Destroy;
  1263. begin
  1264. FreeAndNil(FExpr);
  1265. inherited Destroy;
  1266. end;
  1267. { TJSNewMemberExpression }
  1268. destructor TJSNewMemberExpression.Destroy;
  1269. begin
  1270. FreeAndNil(FArgs);
  1271. inherited Destroy;
  1272. end;
  1273. procedure TJSNewMemberExpression.AddArg(El: TJSElement);
  1274. begin
  1275. if Args=nil then
  1276. Args:=TJSArguments.Create(Line,Column,Source);
  1277. Args.Elements.AddElement.Expr:=El;
  1278. end;
  1279. { TJSMemberExpression }
  1280. destructor TJSMemberExpression.Destroy;
  1281. begin
  1282. FreeAndNil(FMExpr);
  1283. inherited Destroy;
  1284. end;
  1285. { TJSCallExpression }
  1286. destructor TJSCallExpression.Destroy;
  1287. begin
  1288. FreeAndNil(FExpr);
  1289. FreeAndNil(FArgs);
  1290. inherited Destroy;
  1291. end;
  1292. procedure TJSCallExpression.AddArg(El: TJSElement);
  1293. begin
  1294. Args.Elements.AddElement.Expr:=El;
  1295. end;
  1296. procedure TJSCallExpression.InsertArg(Index: integer; El: TJSElement);
  1297. var
  1298. NewEl: TJSArrayLiteralElement;
  1299. begin
  1300. NewEl:=TJSArrayLiteralElement(Args.Elements.Insert(Index));
  1301. NewEl.Expr:=El;
  1302. end;
  1303. { TJSUnary }
  1304. Class function TJSUnary.PrefixOperatorToken: tjsToken;
  1305. begin
  1306. Result:=tjsUnknown;
  1307. end;
  1308. Class function TJSUnary.PostFixOperatorToken: tjsToken;
  1309. begin
  1310. Result:=tjsUnknown;
  1311. end;
  1312. Class function TJSUnary.PrefixOperator: String;
  1313. Var
  1314. T : TJSToken;
  1315. begin
  1316. T:=PrefixOperatorToken;
  1317. if (T=tjsUnknown) then
  1318. Result:=''
  1319. else
  1320. begin
  1321. Result:=TokenInfos[t];
  1322. if t in [tjsTypeOf,tjsVoid,tjsDelete,tjsThrow,tjsAwait] then
  1323. Result:=Result+' ';
  1324. end;
  1325. end;
  1326. Class function TJSUnary.PostFixOperator: String;
  1327. Var
  1328. T : TJSToken;
  1329. begin
  1330. T:=PostFixOperatorToken;
  1331. if (T=tjsUnknown) then
  1332. Result:=''
  1333. else
  1334. Result:=TokenInfos[t];
  1335. end;
  1336. Destructor TJSUnary.Destroy;
  1337. begin
  1338. FreeAndNil(FA);
  1339. inherited Destroy;
  1340. end;
  1341. { TJSBinary }
  1342. destructor TJSBinary.Destroy;
  1343. var
  1344. El: TJSElement;
  1345. BinCnt: Integer;
  1346. Bins: TJSElementArray;
  1347. SubBin: TJSBinary;
  1348. begin
  1349. if FA is TJSBinary then
  1350. begin
  1351. // free El binary chains without stack
  1352. El:=FA;
  1353. SetLength(Bins{%H-},8);
  1354. BinCnt:=0;
  1355. while El is TJSBinary do
  1356. begin
  1357. SubBin:=TJSBinary(El);
  1358. if BinCnt=length(Bins) then
  1359. SetLength(Bins,BinCnt*2);
  1360. Bins[BinCnt]:=SubBin;
  1361. inc(BinCnt);
  1362. El:=SubBin.FA;
  1363. end;
  1364. while BinCnt>0 do
  1365. begin
  1366. dec(BinCnt);
  1367. SubBin:=TJSBinary(Bins[BinCnt]);
  1368. FreeAndNil(SubBin.FA);
  1369. FreeAndNil(SubBin.FB);
  1370. end;
  1371. end;
  1372. FreeAndNil(FA);
  1373. FreeAndNil(FB);
  1374. inherited Destroy;
  1375. end;
  1376. { TJSConditionalExpression }
  1377. destructor TJSConditionalExpression.Destroy;
  1378. begin
  1379. FreeAndNil(FB);
  1380. FreeAndNil(FA);
  1381. FreeAndNil(FC);
  1382. inherited Destroy;
  1383. end;
  1384. { TJSAssign }
  1385. Destructor TJSAssignStatement.Destroy;
  1386. begin
  1387. FreeAndNil(FLHS);
  1388. FreeAndNil(FExpr);
  1389. inherited Destroy;
  1390. end;
  1391. Class function TJSAssignStatement.OperatorToken: tjsToken;
  1392. begin
  1393. Result:=tjsUNknown;
  1394. end;
  1395. Class function TJSAssignStatement.OperatorString: String;
  1396. Var
  1397. t : TJSToken;
  1398. begin
  1399. T:=OperatorToken;
  1400. if (tjsUNknown<>t) then
  1401. Result:=TokenInfos[t]
  1402. else
  1403. Result:='';
  1404. end;
  1405. { TJSVarDeclaration }
  1406. destructor TJSVarDeclaration.Destroy;
  1407. begin
  1408. FreeAndNil(FInit);
  1409. inherited Destroy;
  1410. end;
  1411. { TJSIfStatement }
  1412. destructor TJSIfStatement.Destroy;
  1413. begin
  1414. FreeAndNil(FCond);
  1415. FreeAndNil(FBTrue);
  1416. FreeAndNil(FBFalse);
  1417. inherited Destroy;
  1418. end;
  1419. { TJSBodyStatement }
  1420. destructor TJSBodyStatement.Destroy;
  1421. begin
  1422. FreeAndNil(FBody);
  1423. inherited Destroy;
  1424. end;
  1425. { TJSCondLoopStatement }
  1426. destructor TJSCondLoopStatement.Destroy;
  1427. begin
  1428. FreeAndNil(FCond);
  1429. inherited Destroy;
  1430. end;
  1431. { TJSForStatement }
  1432. destructor TJSForStatement.Destroy;
  1433. begin
  1434. FreeAndNil(FIncr);
  1435. FreeAndNil(FInit);
  1436. inherited Destroy;
  1437. end;
  1438. { TJSForInStatement }
  1439. destructor TJSForInStatement.Destroy;
  1440. begin
  1441. FreeAndNil(FList);
  1442. FreeAndNil(FLHS);
  1443. inherited Destroy;
  1444. end;
  1445. { TJSReturn }
  1446. destructor TJSReturnStatement.Destroy;
  1447. begin
  1448. FreeAndNil(FExpr);
  1449. inherited Destroy;
  1450. end;
  1451. { TJSCaseElement }
  1452. destructor TJSCaseElement.Destroy;
  1453. begin
  1454. FreeAndNil(FExpr);
  1455. FreeAndNil(FBody);
  1456. inherited Destroy;
  1457. end;
  1458. { TJSSwitch }
  1459. constructor TJSSwitchStatement.Create(ALine, AColumn: Integer; const ASource: String);
  1460. begin
  1461. inherited Create(ALine, AColumn, ASource);
  1462. FCases:=TJSCaseElements.Create(TJSCaseElement);
  1463. end;
  1464. destructor TJSSwitchStatement.Destroy;
  1465. begin
  1466. FreeAndNil(FCases);
  1467. FreeAndNil(FCond);
  1468. inherited Destroy;
  1469. end;
  1470. { TJSCaseElements }
  1471. function TJSCaseElements.GetC(AIndex : Integer): TJSCaseElement;
  1472. begin
  1473. Result:=TJSCaseElement(Items[AIndex]);
  1474. end;
  1475. function TJSCaseElements.AddCase: TJSCaseElement;
  1476. begin
  1477. Result:=TJSCaseElement(Add);
  1478. end;
  1479. { TJSTryStatement }
  1480. destructor TJSTryStatement.Destroy;
  1481. begin
  1482. FreeAndNil(FBlock);
  1483. FreeAndNil(FBCatch);
  1484. FreeAndNil(FBFinally);
  1485. inherited Destroy;
  1486. end;
  1487. { TJSSourceElements }
  1488. constructor TJSSourceElements.Create(ALine, AColumn: Integer; const ASource: String
  1489. );
  1490. begin
  1491. inherited Create(ALine, AColumn, ASource);
  1492. FStatements:=TJSElementNodes.Create(TJSElementNode);
  1493. FFunctions:=TJSElementNodes.Create(TJSElementNode);
  1494. FVars:=TJSElementNodes.Create(TJSElementNode);
  1495. end;
  1496. destructor TJSSourceElements.Destroy;
  1497. Var
  1498. i : integer;
  1499. begin
  1500. FreeAndNil(FStatements);
  1501. FreeAndNil(FFunctions);
  1502. // Vars are owned by their statements, and those have been freed
  1503. For I:=0 to FVars.Count-1 do
  1504. FVars.Nodes[i].Node:=nil;
  1505. FreeAndNil(FVars);
  1506. inherited Destroy;
  1507. end;
  1508. { TJSElementNodes }
  1509. function TJSElementNodes.GetN(AIndex : Integer): TJSElementNode;
  1510. begin
  1511. Result:=TJSElementNode(Items[Aindex])
  1512. end;
  1513. function TJSElementNodes.AddNode: TJSElementNode;
  1514. begin
  1515. Result:=TJSElementNode(Add);
  1516. end;
  1517. function TJSElementNodes.InsertNode(Index: integer): TJSElementNode;
  1518. begin
  1519. Result:=TJSElementNode(Insert(Index));
  1520. end;
  1521. { TJSFunction }
  1522. destructor TJSFunctionDeclarationStatement.Destroy;
  1523. begin
  1524. FreeAndNil(FFuncDef);
  1525. inherited Destroy;
  1526. end;
  1527. { TJSElementNode }
  1528. destructor TJSElementNode.Destroy;
  1529. begin
  1530. FreeAndNil(FNode);
  1531. inherited Destroy;
  1532. end;
  1533. { TJSFuncDef }
  1534. procedure TJSFuncDef.SetParams(const AValue: TStrings);
  1535. begin
  1536. if FParams=AValue then exit;
  1537. FParams.Assign(AValue);
  1538. end;
  1539. constructor TJSFuncDef.Create;
  1540. begin
  1541. FParams:=TStringList.Create;
  1542. end;
  1543. destructor TJSFuncDef.Destroy;
  1544. begin
  1545. FreeAndNil(FBody);
  1546. FreeAndNil(FParams);
  1547. inherited Destroy;
  1548. end;
  1549. { TJSBracketMemberExpression }
  1550. destructor TJSBracketMemberExpression.Destroy;
  1551. begin
  1552. FreeAndNil(FName);
  1553. inherited Destroy;
  1554. end;
  1555. { TJSLiteral }
  1556. constructor TJSLiteral.Create(ALine, AColumn: Integer; const ASource: String);
  1557. begin
  1558. FValue:=TJSValue.Create;
  1559. inherited Create(ALine, AColumn, ASource);
  1560. end;
  1561. destructor TJSLiteral.Destroy;
  1562. begin
  1563. FreeAndNil(FValue);
  1564. Inherited;
  1565. end;
  1566. end.