You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

556 regels
26 KiB

  1. unit uengShaderFileTypes;
  2. {$mode objfpc}{$H+}
  3. {$I uengShaderFile.inc}
  4. interface
  5. uses
  6. Classes, SysUtils
  7. {$IFDEF USE_BITSPACE_UTILS}
  8. , uutlSerialization, uutlCommon, uutlGenerics
  9. {$ENDIF}
  10. ;
  11. type
  12. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  13. {$IFDEF USE_BITSPACE_UTILS}
  14. IengShaderFileWriter = uutlSerialization.IutlFileWriter;
  15. IengShaderFileReader = uutlSerialization.IutlFileReader;
  16. TengShaderFileReader = uutlSerialization.TutlSimpleFileReader;
  17. TengShaderFileWriter = uutlSerialization.TutlSimpleFileWriter;
  18. TIntfObjNoRefCount = uutlCommon.TutlInterfaceNoRefCount;
  19. {$ENDIF}
  20. TengShaderPartLogLevel = (
  21. llDebug,
  22. llInfo,
  23. llWarning,
  24. llError,
  25. llThrow
  26. );
  27. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  28. TengShaderCode = class(TStringList)
  29. end;
  30. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  31. TengMetaType = (
  32. metaUnknown,
  33. metaNormal,
  34. metaVersion,
  35. metaExtension,
  36. metaLayout);
  37. TengMetaData = class(TObject)
  38. private
  39. fMetaType: TengMetaType;
  40. fName: String;
  41. fValues: TStringList;
  42. function GetCount: Integer;
  43. function GetValues: TStrings;
  44. public
  45. property MetaType: TengMetaType read fMetaType;
  46. property Name: String read fName;
  47. property Count: Integer read GetCount;
  48. property Values: TStrings read GetValues;
  49. procedure Assign(const aValues: TengMetaData);
  50. constructor Create(const aName: String; const aType: TengMetaType);
  51. destructor Destroy; override;
  52. end;
  53. TengMetaDataList = specialize TutlSimpleList<TengMetaData>;
  54. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  55. //Exceptions////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  56. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  57. EengShaderPart = class(Exception)
  58. protected
  59. function GenerateMessage: String; virtual;
  60. public
  61. Sender: TObject;
  62. Line: Integer;
  63. Col: Integer;
  64. Filename: String;
  65. procedure PrintTrace(const aLines: TStrings);
  66. function PrintTrace: String;
  67. constructor Create(const aSender: TObject); overload;
  68. constructor Create(const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  69. constructor Create(const aMsg: String; const aSender: TObject); overload;
  70. constructor Create(const aMsg: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  71. end;
  72. EengShaderPartInternal = class(EengShaderPart);
  73. EengExpression = class(EengShaderPart);
  74. EengExpressionInternal = class(EengExpression)
  75. ErrorCode: Integer;
  76. constructor Create(const aErrorCode: Integer; const aSender: TObject);
  77. end;
  78. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  79. EengInvalidToken = class(EengShaderPartInternal)
  80. protected
  81. function GenerateMessage: String; override;
  82. public
  83. SenderClassName: String;
  84. Token: String;
  85. constructor Create(const aSenderClassName: String; const aToken: String; const aSender: TObject); overload;
  86. constructor Create(const aSenderClassName: String; const aToken: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  87. end;
  88. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  89. EengUnexpectedToken = class(EengShaderPart)
  90. protected
  91. function GenerateMessage: String; override;
  92. public
  93. Token: String;
  94. Expected: String;
  95. constructor Create(const aToken, aExpected: String; const aSender: TObject); overload;
  96. constructor Create(const aToken, aExpected: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  97. end;
  98. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  99. EengInvalidParamter = class(EengShaderPart)
  100. protected
  101. function GenerateMessage: String; override;
  102. public
  103. Param: String;
  104. Expected: String;
  105. constructor Create(const aParam, aExpected: String; const aSender: TObject); overload;
  106. constructor Create(const aParam, aExpected: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  107. end;
  108. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  109. EengInvalidParamterCount = class(EengShaderPart)
  110. protected
  111. function GenerateMessage: String; override;
  112. public
  113. Token: String;
  114. ExpectedMin: Integer;
  115. ExpectedMax: Integer;
  116. constructor Create(const aToken: String; const aExpected: Integer; const aSender: TObject); overload;
  117. constructor Create(const aToken: String; const aExpectedMin, aExpectedMax: Integer; const aSender: TObject); overload;
  118. constructor Create(const aToken: String; const aExpected, aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  119. constructor Create(const aToken: String; const aExpectedMin, aExpectedMax, aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  120. end;
  121. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  122. EengInvalidIdentifier = class(EengShaderPart)
  123. protected
  124. function GenerateMessage: String; override;
  125. public
  126. Identifier: String;
  127. constructor Create(const aIdentifier: String; const aSender: TObject); overload;
  128. constructor Create(const aIdentifier: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  129. end;
  130. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  131. EengOutOfRange = class(EengShaderPartInternal)
  132. protected
  133. function GenerateMessage: String; override;
  134. public
  135. Min: Integer;
  136. Max: Integer;
  137. Index: Integer;
  138. constructor Create(const aMin, aMax, aIndex: Integer; const aSender: TObject); overload;
  139. constructor Create(const aMin, aMax, aIndex, aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  140. end;
  141. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  142. EengDuplicateIdentifier = class(EengShaderPart)
  143. protected
  144. function GenerateMessage: String; override;
  145. public
  146. Name: String;
  147. New: TObject;
  148. Old: TObject;
  149. constructor Create(const aName: String; const aNew, aOld, aSender: TObject); overload;
  150. constructor Create(const aName: String; const aNew, aOld: TObject; aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  151. end;
  152. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  153. EengUnknownIdentifier = class(EengShaderPart)
  154. protected
  155. function GenerateMessage: String; override;
  156. public
  157. Name: String;
  158. constructor Create(const aName: String; const aSender: TObject); overload;
  159. constructor Create(const aName: String; aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  160. end;
  161. implementation
  162. uses
  163. uengShaderPart;
  164. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  165. //TengMetaData//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  166. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  167. function TengMetaData.GetCount: Integer;
  168. begin
  169. result := fValues.Count;
  170. end;
  171. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  172. function TengMetaData.GetValues: TStrings;
  173. begin
  174. result := fValues;
  175. end;
  176. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  177. procedure TengMetaData.Assign(const aValues: TengMetaData);
  178. begin
  179. fName := aValues.Name;
  180. fMetaType := aValues.MetaType;
  181. fValues.Clear;
  182. fValues.AddStrings(aValues.Values);
  183. end;
  184. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  185. constructor TengMetaData.Create(const aName: String; const aType: TengMetaType);
  186. begin
  187. inherited Create;
  188. fName := aName;
  189. fMetaType := aType;
  190. fValues := TStringList.Create;
  191. end;
  192. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  193. destructor TengMetaData.Destroy;
  194. begin
  195. FreeAndNil(fValues);
  196. inherited Destroy;
  197. end;
  198. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  199. //EengExpressionInternal////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  200. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  201. constructor EengExpressionInternal.Create(const aErrorCode: Integer; const aSender: TObject);
  202. begin
  203. ErrorCode := aErrorCode;
  204. inherited Create('internal error: ' + IntToStr(ErrorCode), aSender);
  205. end;
  206. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  207. //EengShaderPart////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  208. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  209. function EengShaderPart.GenerateMessage: String;
  210. begin
  211. result := ''; // DUMMY
  212. end;
  213. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  214. procedure EengShaderPart.PrintTrace(const aLines: TStrings);
  215. function GetName(const aPart: TengShaderPart): String;
  216. begin
  217. result := aPart.GetTokenName;
  218. if (result = '')
  219. then result := aPart.ClassName
  220. else result := result + ' (' + aPart.ClassName + ')';
  221. end;
  222. begin
  223. if not Assigned(Sender) or not
  224. (Sender is TengShaderPart) then
  225. exit;
  226. aLines.Add(Message);
  227. (Sender as TengShaderPart).PrintTrace(' ', aLines);
  228. end;
  229. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  230. function EengShaderPart.PrintTrace: String;
  231. var
  232. sl: TStringList;
  233. begin
  234. sl := TStringList.Create;
  235. try
  236. PrintTrace(sl);
  237. result := sl.Text;
  238. finally
  239. FreeAndNil(sl);
  240. end;
  241. end;
  242. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  243. constructor EengShaderPart.Create(const aSender: TObject);
  244. begin
  245. Create(GenerateMessage, aSender);
  246. end;
  247. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  248. constructor EengShaderPart.Create(const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  249. begin
  250. Create(GenerateMessage, aLine, aCol, aFilename, aSender);
  251. end;
  252. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  253. constructor EengShaderPart.Create(const aMsg: String; const aSender: TObject);
  254. begin
  255. Sender := nil;
  256. if Assigned(aSender)
  257. then Create(
  258. aMsg,
  259. (aSender as TengShaderPart).Line,
  260. (aSender as TengShaderPart).Col,
  261. (aSender as TengShaderPart).Filename,
  262. aSender)
  263. else inherited Create(Format('%s: %s', [
  264. ClassName,
  265. aMsg]));
  266. end;
  267. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  268. constructor EengShaderPart.Create(const aMsg: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  269. begin
  270. Sender := aSender;
  271. Line := aLine;
  272. Col := aCol;
  273. Filename := aFilename;
  274. inherited Create(Format('%s (%s %d:%d): %s',[
  275. ClassName,
  276. ExtractFileName(Filename),
  277. Line+1,
  278. Col,
  279. aMsg]))
  280. end;
  281. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  282. //EengInvalidToken//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  283. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  284. function EengInvalidToken.GenerateMessage: String;
  285. begin
  286. result := 'invalid token: ' + SenderClassName + ' <> '+ Token;
  287. end;
  288. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  289. constructor EengInvalidToken.Create(const aSenderClassName: String; const aToken: String; const aSender: TObject);
  290. begin
  291. SenderClassName := aSenderClassName;
  292. Token := aToken;
  293. inherited Create(aSender);
  294. end;
  295. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  296. constructor EengInvalidToken.Create(const aSenderClassName: String; const aToken: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  297. begin
  298. SenderClassName := aSenderClassName;
  299. Token := aToken;
  300. inherited Create(aLine, aCol, aFilename, aSender);
  301. end;
  302. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  303. //EengUnexpectedToken///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  304. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  305. function EengUnexpectedToken.GenerateMessage: String;
  306. begin
  307. result := 'unexpected token: ' + Token;
  308. if (Expected <> '') then
  309. result := result + '(expected ' + Expected + ')';
  310. end;
  311. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  312. constructor EengUnexpectedToken.Create(const aToken, aExpected: String; const aSender: TObject);
  313. begin
  314. Token := aToken;
  315. Expected := aExpected;
  316. inherited Create(aSender);
  317. end;
  318. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  319. constructor EengUnexpectedToken.Create(const aToken, aExpected: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  320. begin
  321. Token := aToken;
  322. Expected := aExpected;
  323. inherited Create(aLine, aCol, aFilename, aSender);
  324. end;
  325. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  326. //EengInvalidParamter///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  327. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  328. function EengInvalidParamter.GenerateMessage: String;
  329. begin
  330. result := 'invalid parameter: ' + Param;
  331. if (Expected <> '') then
  332. result := result + '(expected ' + Expected + ')';
  333. end;
  334. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  335. constructor EengInvalidParamter.Create(const aParam, aExpected: String; const aSender: TObject);
  336. begin
  337. Param := aParam;
  338. Expected := aExpected;
  339. inherited Create(aSender);
  340. end;
  341. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  342. constructor EengInvalidParamter.Create(const aParam, aExpected: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  343. begin
  344. Param := aParam;
  345. Expected := aExpected;
  346. inherited Create(aLine, aCol, aFilename, aSender);
  347. end;
  348. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  349. //EengInvalidParamterCount//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  350. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  351. function EengInvalidParamterCount.GenerateMessage: String;
  352. begin
  353. result := 'invalid parameter count in ' + Token + '(expected ';
  354. if (ExpectedMin = ExpectedMax) then
  355. result := result + IntToStr(ExpectedMin)
  356. else if (ExpectedMax < 0) then
  357. result := result + ' at least ' + IntToStr(ExpectedMin)
  358. else
  359. result := IntToStr(ExpectedMin) + ' to ' + IntToStr(ExpectedMax);
  360. result := result + 'parameter)';
  361. end;
  362. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  363. constructor EengInvalidParamterCount.Create(const aToken: String; const aExpected: Integer; const aSender: TObject);
  364. begin
  365. Token := aToken;
  366. ExpectedMin := aExpected;
  367. ExpectedMax := aExpected;
  368. inherited Create(aSender);
  369. end;
  370. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  371. constructor EengInvalidParamterCount.Create(const aToken: String; const aExpectedMin, aExpectedMax: Integer; const aSender: TObject);
  372. begin
  373. Token := aToken;
  374. ExpectedMin := aExpectedMin;
  375. ExpectedMax := aExpectedMax;
  376. inherited Create(aSender);
  377. end;
  378. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  379. constructor EengInvalidParamterCount.Create(const aToken: String; const aExpected, aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  380. begin
  381. Token := aToken;
  382. ExpectedMin := aExpected;
  383. ExpectedMax := aExpected;
  384. inherited Create(aLine, aCol, aFilename, aSender);
  385. end;
  386. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  387. constructor EengInvalidParamterCount.Create(const aToken: String; const aExpectedMin, aExpectedMax, aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  388. begin
  389. Token := aToken;
  390. ExpectedMin := aExpectedMin;
  391. ExpectedMax := aExpectedMax;
  392. inherited Create(aLine, aCol, aFilename, aSender);
  393. end;
  394. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  395. //EengInvalidIdentifier/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  396. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  397. function EengInvalidIdentifier.GenerateMessage: String;
  398. begin
  399. result := 'invalid identifier: ' + Identifier;
  400. end;
  401. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  402. constructor EengInvalidIdentifier.Create(const aIdentifier: String; const aSender: TObject);
  403. begin
  404. Identifier := aIdentifier;
  405. inherited Create(aSender);
  406. end;
  407. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  408. constructor EengInvalidIdentifier.Create(const aIdentifier: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  409. begin
  410. Identifier := aIdentifier;
  411. inherited Create(aLine, aCol, aFilename, aSender);
  412. end;
  413. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  414. //EengOutOfRange////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  415. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  416. function EengOutOfRange.GenerateMessage: String;
  417. begin
  418. result := format('index (%d) out of range (%d:%d)', [Index, Min, Max])
  419. end;
  420. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  421. constructor EengOutOfRange.Create(const aMin, aMax, aIndex: Integer; const aSender: TObject);
  422. begin
  423. Min := aMin;
  424. Max := aMax;
  425. Index := aIndex;
  426. inherited Create(aSender);
  427. end;
  428. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  429. constructor EengOutOfRange.Create(const aMin, aMax, aIndex, aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  430. begin
  431. Min := aMin;
  432. Max := aMax;
  433. Index := aIndex;
  434. inherited Create(aLine, aCol, aFilename, aSender);
  435. end;
  436. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  437. //EengDuplicateIdentifier///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  438. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  439. function EengDuplicateIdentifier.GenerateMessage: String;
  440. begin
  441. result := 'duplicate identifier: ' + Name;
  442. if (New is TengShaderPart) then
  443. result := result + Format('(%s %d:%d)', [
  444. (New as TengShaderPart).Filename,
  445. (New as TengShaderPart).Line,
  446. (New as TengShaderPart).Col]);
  447. if (Old is TengShaderPart) then
  448. result := result + Format('(previously declared here %s %d:%d)', [
  449. (Old as TengShaderPart).Filename,
  450. (Old as TengShaderPart).Line,
  451. (Old as TengShaderPart).Col]);
  452. end;
  453. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  454. constructor EengDuplicateIdentifier.Create(const aName: String; const aNew, aOld, aSender: TObject);
  455. begin
  456. Name := aName;
  457. New := aNew;
  458. Old := aOld;
  459. inherited Create(aSender);
  460. end;
  461. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  462. constructor EengDuplicateIdentifier.Create(const aName: String; const aNew, aOld: TObject; aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  463. begin
  464. Name := aName;
  465. New := aNew;
  466. Old := aOld;
  467. inherited Create(aLine, aCol, aFilename, aSender);
  468. end;
  469. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  470. //EengUnknownIdentifier/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  471. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  472. function EengUnknownIdentifier.GenerateMessage: String;
  473. begin
  474. result := 'unknown identifier: ' + Name;
  475. end;
  476. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  477. constructor EengUnknownIdentifier.Create(const aName: String; const aSender: TObject);
  478. begin
  479. Name := aName;
  480. inherited Create(aSender);
  481. end;
  482. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  483. constructor EengUnknownIdentifier.Create(const aName: String; aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  484. begin
  485. Name := aName;
  486. inherited Create(aLine, aCol, aFilename, aSender);
  487. end;
  488. end.