Token.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*
  2. * Copyright (c) 2023, Sam Atkins <atkinssj@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/StringView.h>
  8. #include <AK/Vector.h>
  9. #include <LibCMake/Position.h>
  10. namespace CMake {
  11. struct VariableReference {
  12. StringView value;
  13. Position start;
  14. Position end;
  15. };
  16. enum class ControlKeywordType {
  17. If,
  18. ElseIf,
  19. Else,
  20. EndIf,
  21. ForEach,
  22. EndForEach,
  23. While,
  24. EndWhile,
  25. Break,
  26. Continue,
  27. Return,
  28. Macro,
  29. EndMacro,
  30. Function,
  31. EndFunction,
  32. Block,
  33. EndBlock,
  34. };
  35. struct Token {
  36. enum class Type {
  37. BracketComment,
  38. LineComment,
  39. Identifier,
  40. ControlKeyword,
  41. OpenParen,
  42. CloseParen,
  43. BracketArgument,
  44. QuotedArgument,
  45. UnquotedArgument,
  46. Garbage,
  47. // These are elements inside argument tokens
  48. VariableReference,
  49. };
  50. Type type;
  51. StringView value;
  52. Position start;
  53. Position end;
  54. // Type-specific
  55. Optional<ControlKeywordType> control_keyword {};
  56. Vector<VariableReference> variable_references {};
  57. };
  58. static constexpr StringView to_string(Token::Type type)
  59. {
  60. switch (type) {
  61. case Token::Type::BracketComment:
  62. return "BracketComment"sv;
  63. case Token::Type::LineComment:
  64. return "LineComment"sv;
  65. case Token::Type::Identifier:
  66. return "Identifier"sv;
  67. case Token::Type::ControlKeyword:
  68. return "ControlKeyword"sv;
  69. case Token::Type::OpenParen:
  70. return "OpenParen"sv;
  71. case Token::Type::CloseParen:
  72. return "CloseParen"sv;
  73. case Token::Type::BracketArgument:
  74. return "BracketArgument"sv;
  75. case Token::Type::QuotedArgument:
  76. return "QuotedArgument"sv;
  77. case Token::Type::UnquotedArgument:
  78. return "UnquotedArgument"sv;
  79. case Token::Type::Garbage:
  80. return "Garbage"sv;
  81. case Token::Type::VariableReference:
  82. return "VariableReference"sv;
  83. }
  84. VERIFY_NOT_REACHED();
  85. }
  86. Optional<ControlKeywordType> control_keyword_from_string(StringView value);
  87. }