選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

134 行
5.6 KiB

  1. unit uengShaderPartKeyValuePair;
  2. {$mode objfpc}{$H+}
  3. {$I uengShaderFile.inc}
  4. interface
  5. uses
  6. Classes, SysUtils, variants,
  7. uengShaderPart, uengShaderFileParser
  8. {$IFDEF USE_BITSPACE_UTILS}
  9. , uutlGenerics
  10. {$ENDIF}
  11. ;
  12. type
  13. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  14. TengShaderPartKeyValuePair = class(TengShaderPart)
  15. { Code Loading & Storage }
  16. private
  17. fName: String;
  18. fValue: Variant;
  19. fValueName: String;
  20. protected
  21. function GetText: String; override;
  22. function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
  23. { General }
  24. public
  25. property Name: String read fName;
  26. property Value: Variant read fValue;
  27. property ValueName: String read fValueName;
  28. end;
  29. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  30. TengShaderPartProperty = class(TengShaderPartKeyValuePair)
  31. { Class Methods }
  32. public
  33. class function GetTokenName: String; override;
  34. class procedure Validate(const aArgs: TengParseArgs; const aParent: TengShaderPart); override;
  35. end;
  36. TengShaderPartPropertyMap = specialize TutlMap<string, TengShaderPartProperty>;
  37. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  38. TengShaderPartDefine = class(TengShaderPartKeyValuePair)
  39. { Class Methods }
  40. public
  41. class function GetTokenName: String; override;
  42. end;
  43. implementation
  44. uses
  45. uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper, uengShaderPartIf;
  46. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  47. //TengShaderPartKeyValuePair////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  48. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  49. function TengShaderPartKeyValuePair.GetText: String;
  50. begin
  51. result := TOKEN_CHAR_BEGIN + GetTokenName + ' ' + fName;
  52. if (fValueName <> '') then
  53. result := result + ' ' + fValueName
  54. else if (fValue <> Unassigned) then
  55. result := result + TOKEN_CHAR_QUOTE + String(fValue) + TOKEN_CHAR_QUOTE;
  56. result := result + TOKEN_CHAR_END;
  57. end;
  58. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  59. function TengShaderPartKeyValuePair.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  60. begin
  61. if (aParams[0].Name <> GetTokenName) then with aParams[0] do
  62. raise EengInvalidToken.Create(ClassName, GetTokenName, Line, Col, Filename, self);
  63. if (aParams.Count < 2) or (aParams.Count > 3) then
  64. raise EengInvalidParamterCount.Create(GetTokenName, 2, 3, self);
  65. result := '';
  66. fName := aParams[1].Name;
  67. if not IsValidIdentifier(fName) then with aParams[1] do
  68. raise EengInvalidIdentifier.Create(fName, Line, Col, Filename, self);
  69. if (aParams.Count >= 3) then
  70. if aParams[2].Quoted then begin
  71. fValue := aParams[2].Name;
  72. fValueName := '';
  73. end else begin
  74. // TODO resolve name and set value
  75. fValue := Unassigned;
  76. fValueName := aParams[2].Name;
  77. end
  78. else begin
  79. fValue := Unassigned;
  80. fValueName := '';
  81. end;
  82. end;
  83. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  84. //TengShaderPartProperty////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  85. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  86. class function TengShaderPartProperty.GetTokenName: String;
  87. begin
  88. result := TOKEN_PROPERTY;
  89. end;
  90. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  91. class procedure TengShaderPartProperty.Validate(const aArgs: TengParseArgs; const aParent: TengShaderPart);
  92. procedure RaiseEx(const aToken: String);
  93. begin
  94. with aArgs do
  95. raise EengShaderPart.Create('token ' + GetTokenName + ' is not allowed in ' + aToken, Line, Col, Filename, aParent);
  96. end;
  97. begin
  98. inherited Validate(aArgs, aParent);
  99. if aParent.HasParent(TengShaderPartElIf, true) then
  100. RaiseEx(TengShaderPartElIf.GetTokenName);
  101. if aParent.HasParent(TengShaderPartElse, true) then
  102. RaiseEx(TengShaderPartElse.GetTokenName);
  103. if aParent.HasParent(TengShaderPartIf, true) then
  104. RaiseEx(TengShaderPartIf.GetTokenName);
  105. end;
  106. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  107. //TengShaderPartDefine//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  108. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  109. class function TengShaderPartDefine.GetTokenName: String;
  110. begin
  111. result := TOKEN_DEFINE;
  112. end;
  113. end.