Token.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /*
  2. * Copyright (c) 2023, Dan Klishch <danilklishch@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <LibXML/Forward.h>
  8. #include "AST/AST.h"
  9. namespace JSSpecCompiler {
  10. constexpr i32 ambiguous_operator_precedence = -2;
  11. constexpr i32 pre_merged_operator_precedence = 2;
  12. constexpr i32 unary_operator_precedence = 3;
  13. constexpr i32 closing_bracket_precedence = 18;
  14. // NOTE: Operator precedence is generally the same as in
  15. // https://en.cppreference.com/w/cpp/language/operator_precedence (common sense applies).
  16. #define ENUMERATE_TOKENS(F) \
  17. F(Invalid, -1, Invalid, Invalid, Invalid) \
  18. F(SectionNumber, -1, Invalid, Invalid, Invalid) \
  19. F(Identifier, -1, Invalid, Invalid, Invalid) \
  20. F(Number, -1, Invalid, Invalid, Invalid) \
  21. F(String, -1, Invalid, Invalid, Invalid) \
  22. F(Undefined, -1, Invalid, Invalid, Invalid) \
  23. F(Word, -1, Invalid, Invalid, Invalid) \
  24. F(ParenOpen, -1, Invalid, Invalid, ParenClose) \
  25. F(ParenClose, 18, Invalid, Invalid, ParenOpen) \
  26. F(BraceOpen, -1, Invalid, Invalid, BraceClose) \
  27. F(BraceClose, 18, Invalid, Invalid, BraceOpen) \
  28. F(Comma, 17, Invalid, Comma, Invalid) \
  29. F(MemberAccess, 2, Invalid, MemberAccess, Invalid) \
  30. F(Dot, -1, Invalid, Invalid, Invalid) \
  31. F(Colon, -1, Invalid, Invalid, Invalid) \
  32. F(Less, 9, Invalid, CompareLess, Invalid) \
  33. F(Greater, 9, Invalid, CompareGreater, Invalid) \
  34. F(NotEquals, 10, Invalid, CompareNotEqual, Invalid) \
  35. F(Equals, 10, Invalid, CompareEqual, Invalid) \
  36. F(Plus, 6, Invalid, Plus, Invalid) \
  37. F(AmbiguousMinus, -2, Invalid, Invalid, Invalid) \
  38. F(UnaryMinus, 3, Minus, Invalid, Invalid) \
  39. F(BinaryMinus, 6, Invalid, Minus, Invalid) \
  40. F(Multiplication, 5, Invalid, Multiplication, Invalid) \
  41. F(Division, 5, Invalid, Division, Invalid) \
  42. F(FunctionCall, 2, Invalid, FunctionCall, Invalid) \
  43. F(ArraySubscript, 2, Invalid, ArraySubscript, Invalid) \
  44. F(ExclamationMark, 3, AssertCompletion, Invalid, Invalid) \
  45. F(Is, -1, Invalid, Invalid, Invalid)
  46. enum class TokenType {
  47. #define ID(name, precedence, unary_name, binary_name, matching_bracket) name,
  48. ENUMERATE_TOKENS(ID)
  49. #undef ID
  50. };
  51. constexpr struct TokenInfo {
  52. StringView name;
  53. i32 precedence;
  54. UnaryOperator as_unary_operator;
  55. BinaryOperator as_binary_operator;
  56. TokenType matching_bracket;
  57. } token_info[] = {
  58. #define TOKEN_INFO(name, precedence, unary_name, binary_name, matching_bracket) \
  59. { \
  60. #name##sv, \
  61. precedence, \
  62. UnaryOperator::unary_name, \
  63. BinaryOperator::binary_name, \
  64. TokenType::matching_bracket, \
  65. },
  66. ENUMERATE_TOKENS(TOKEN_INFO)
  67. #undef TOKEN_INFO
  68. };
  69. struct Token {
  70. TokenInfo const& info() const { return token_info[to_underlying(type)]; }
  71. StringView name() const { return token_info[to_underlying(type)].name; }
  72. i32 precedence() const { return info().precedence; }
  73. bool is_operator() const { return precedence() > 0 && precedence() < closing_bracket_precedence; }
  74. bool is_ambiguous_operator() const { return precedence() == ambiguous_operator_precedence; }
  75. bool is_pre_merged_binary_operator() const { return precedence() == pre_merged_operator_precedence; }
  76. bool is_unary_operator() const { return precedence() == unary_operator_precedence; }
  77. bool is_binary_operator() const { return is_operator() && !is_unary_operator(); }
  78. bool is_bracket() const { return info().matching_bracket != TokenType::Invalid; }
  79. bool is_opening_bracket() const { return is_bracket() && precedence() == -1; }
  80. bool is_closing_bracket() const { return is_bracket() && precedence() == closing_bracket_precedence; }
  81. UnaryOperator as_unary_operator() const
  82. {
  83. VERIFY(is_unary_operator());
  84. return info().as_unary_operator;
  85. }
  86. BinaryOperator as_binary_operator() const
  87. {
  88. VERIFY(is_binary_operator());
  89. return info().as_binary_operator;
  90. }
  91. bool matches_with(Token const& bracket)
  92. {
  93. VERIFY(is_bracket());
  94. return info().matching_bracket == bracket.type;
  95. }
  96. TokenType type;
  97. StringView data;
  98. XML::Node const* node;
  99. };
  100. }