25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
3.0 KiB

  1. unit uengShaderFileHelper;
  2. {$mode objfpc}{$H+}
  3. {$I uengShaderFile.inc}
  4. interface
  5. uses
  6. uengShaderPart, uengShaderFileParser;
  7. function IsValidIdentifier(const aIdent: String): Boolean;
  8. function CheckEndToken(const aArgs: TengParseArgs; const aShaderPart: TengShaderPart): String;
  9. function ExtractSearchResult(const aSender: TengShaderPart; const aIdent: String; const aList: TengShaderPartList; aLine: Integer = -1; aCol: Integer = -1; aFilename: String = ''): TengShaderPart;
  10. implementation
  11. uses
  12. sysutils,
  13. uengShaderFileConstants, uengShaderFileTypes;
  14. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  15. function IsValidIdentifier(const aIdent: String): Boolean;
  16. var
  17. i, len: Integer;
  18. begin
  19. len := Length(aIdent);
  20. result := false;
  21. for i := 1 to len do
  22. if not (aIdent[i] in VALID_IDENT_CHARS) then
  23. exit;
  24. result := true;
  25. end;
  26. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  27. function CheckEndToken(const aArgs: TengParseArgs; const aShaderPart: TengShaderPart): String;
  28. var
  29. oldLine, oldCol: Integer;
  30. param: TengTokenParameterList;
  31. begin
  32. param := TengTokenParameterList.Create('');
  33. try
  34. oldLine := aArgs.Line;
  35. oldCol := aArgs.Col;
  36. if not aArgs.ExtractToken(aShaderPart, param) then
  37. EengUnexpectedToken.Create(TOKEN_NONE, TOKEN_END, oldLine, oldCol, aShaderPart.Filename, aShaderPart);
  38. if (param[0].Name <> TOKEN_END) then
  39. EengUnexpectedToken.Create(param[0].Name, TOKEN_END, oldLine, oldCol, aShaderPart.Filename, aShaderPart);
  40. if (param.Count <> 1) then
  41. EengInvalidParamterCount.Create(TOKEN_END, 1, oldLine, oldCol, aShaderPart.Filename, aShaderPart);
  42. result := '';
  43. finally
  44. FreeAndNil(param);
  45. end;
  46. end;
  47. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  48. function ExtractSearchResult(const aSender: TengShaderPart; const aIdent: String; const aList: TengShaderPartList;
  49. aLine: Integer; aCol: Integer; aFilename: String): TengShaderPart;
  50. var
  51. s: String;
  52. i: Integer;
  53. begin
  54. result := nil;
  55. if (aList.Count <= 0) then
  56. exit;
  57. if Assigned(aSender) then begin
  58. if (aLine < 0) then
  59. aLine := aSender.Line;
  60. if (aCol < 0) then
  61. aCol := aSender.Col;
  62. if (aFilename = '') then
  63. aFilename := aSender.Filename;
  64. end;
  65. result := aList[0];
  66. if (aList.Count > 1) and Assigned(aSender) then begin
  67. s := Format('use of duplicate identifier: %s (%s %d:%d)', [aIdent, aList[0].Filename, aList[0].Line + 1, aList[0].Col]) + sLineBreak +
  68. 'previously declared here:' + sLineBreak;
  69. i := 1;
  70. while (i < aList.Count) do begin
  71. s := s + Format(' %s %d:%d', [aList[i].Filename, aList[i].Line + 1, aList[i].Col]) + sLineBreak;
  72. inc(i);
  73. end;
  74. aSender.LogMsg(llWarning, s);
  75. end;
  76. end;
  77. end.