token_kind.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. #include "toolchain/lexer/token_kind.h"
  5. #include "common/check.h"
  6. #include "llvm/ADT/StringRef.h"
  7. namespace Carbon {
  8. auto TokenKind::Name() const -> llvm::StringRef {
  9. static constexpr llvm::StringLiteral Names[] = {
  10. #define CARBON_TOKEN(TokenName) #TokenName,
  11. #include "toolchain/lexer/token_registry.def"
  12. };
  13. return Names[static_cast<int>(kind_value_)];
  14. }
  15. auto TokenKind::IsSymbol() const -> bool {
  16. static constexpr bool Table[] = {
  17. #define CARBON_TOKEN(TokenName) false,
  18. #define CARBON_SYMBOL_TOKEN(TokenName, Spelling) true,
  19. #include "toolchain/lexer/token_registry.def"
  20. };
  21. return Table[static_cast<int>(kind_value_)];
  22. }
  23. auto TokenKind::IsGroupingSymbol() const -> bool {
  24. static constexpr bool Table[] = {
  25. #define CARBON_TOKEN(TokenName) false,
  26. #define CARBON_OPENING_GROUP_SYMBOL_TOKEN(TokenName, Spelling, ClosingName) \
  27. true,
  28. #define CARBON_CLOSING_GROUP_SYMBOL_TOKEN(TokenName, Spelling, OpeningName) \
  29. true,
  30. #include "toolchain/lexer/token_registry.def"
  31. };
  32. return Table[static_cast<int>(kind_value_)];
  33. }
  34. auto TokenKind::IsOpeningSymbol() const -> bool {
  35. static constexpr bool Table[] = {
  36. #define CARBON_TOKEN(TokenName) false,
  37. #define CARBON_OPENING_GROUP_SYMBOL_TOKEN(TokenName, Spelling, ClosingName) \
  38. true,
  39. #include "toolchain/lexer/token_registry.def"
  40. };
  41. return Table[static_cast<int>(kind_value_)];
  42. }
  43. auto TokenKind::GetClosingSymbol() const -> TokenKind {
  44. static constexpr TokenKind Table[] = {
  45. #define CARBON_TOKEN(TokenName) Error(),
  46. #define CARBON_OPENING_GROUP_SYMBOL_TOKEN(TokenName, Spelling, ClosingName) \
  47. ClosingName(),
  48. #include "toolchain/lexer/token_registry.def"
  49. };
  50. auto result = Table[static_cast<int>(kind_value_)];
  51. CHECK(result != Error()) << "Only opening symbols are valid!";
  52. return result;
  53. }
  54. auto TokenKind::IsClosingSymbol() const -> bool {
  55. static constexpr bool Table[] = {
  56. #define CARBON_TOKEN(TokenName) false,
  57. #define CARBON_CLOSING_GROUP_SYMBOL_TOKEN(TokenName, Spelling, OpeningName) \
  58. true,
  59. #include "toolchain/lexer/token_registry.def"
  60. };
  61. return Table[static_cast<int>(kind_value_)];
  62. }
  63. auto TokenKind::GetOpeningSymbol() const -> TokenKind {
  64. static constexpr TokenKind Table[] = {
  65. #define CARBON_TOKEN(TokenName) Error(),
  66. #define CARBON_CLOSING_GROUP_SYMBOL_TOKEN(TokenName, Spelling, OpeningName) \
  67. OpeningName(),
  68. #include "toolchain/lexer/token_registry.def"
  69. };
  70. auto result = Table[static_cast<int>(kind_value_)];
  71. CHECK(result != Error()) << "Only closing symbols are valid!";
  72. return result;
  73. }
  74. auto TokenKind::IsKeyword() const -> bool {
  75. static constexpr bool Table[] = {
  76. #define CARBON_TOKEN(TokenName) false,
  77. #define CARBON_KEYWORD_TOKEN(TokenName, Spelling) true,
  78. #include "toolchain/lexer/token_registry.def"
  79. };
  80. return Table[static_cast<int>(kind_value_)];
  81. }
  82. auto TokenKind::IsSizedTypeLiteral() const -> bool {
  83. return *this == TokenKind::IntegerTypeLiteral() ||
  84. *this == TokenKind::UnsignedIntegerTypeLiteral() ||
  85. *this == TokenKind::FloatingPointTypeLiteral();
  86. }
  87. auto TokenKind::GetFixedSpelling() const -> llvm::StringRef {
  88. static constexpr llvm::StringLiteral Table[] = {
  89. #define CARBON_TOKEN(TokenName) "",
  90. #define CARBON_SYMBOL_TOKEN(TokenName, Spelling) Spelling,
  91. #define CARBON_KEYWORD_TOKEN(TokenName, Spelling) Spelling,
  92. #include "toolchain/lexer/token_registry.def"
  93. };
  94. return Table[static_cast<int>(kind_value_)];
  95. }
  96. } // namespace Carbon