RegexLexer.h 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /*
  2. * Copyright (c) 2020, Emanuel Sprung <emanuel.sprung@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Forward.h>
  8. #include <AK/GenericLexer.h>
  9. #include <AK/StringView.h>
  10. namespace regex {
  11. #define ENUMERATE_REGEX_TOKENS \
  12. __ENUMERATE_REGEX_TOKEN(Eof) \
  13. __ENUMERATE_REGEX_TOKEN(Char) \
  14. __ENUMERATE_REGEX_TOKEN(Circumflex) \
  15. __ENUMERATE_REGEX_TOKEN(Period) \
  16. __ENUMERATE_REGEX_TOKEN(LeftParen) \
  17. __ENUMERATE_REGEX_TOKEN(RightParen) \
  18. __ENUMERATE_REGEX_TOKEN(LeftCurly) \
  19. __ENUMERATE_REGEX_TOKEN(RightCurly) \
  20. __ENUMERATE_REGEX_TOKEN(LeftBracket) \
  21. __ENUMERATE_REGEX_TOKEN(RightBracket) \
  22. __ENUMERATE_REGEX_TOKEN(Asterisk) \
  23. __ENUMERATE_REGEX_TOKEN(EscapeSequence) \
  24. __ENUMERATE_REGEX_TOKEN(Dollar) \
  25. __ENUMERATE_REGEX_TOKEN(Pipe) \
  26. __ENUMERATE_REGEX_TOKEN(Plus) \
  27. __ENUMERATE_REGEX_TOKEN(Comma) \
  28. __ENUMERATE_REGEX_TOKEN(Slash) \
  29. __ENUMERATE_REGEX_TOKEN(EqualSign) \
  30. __ENUMERATE_REGEX_TOKEN(HyphenMinus) \
  31. __ENUMERATE_REGEX_TOKEN(Colon) \
  32. __ENUMERATE_REGEX_TOKEN(Questionmark)
  33. enum class TokenType {
  34. #define __ENUMERATE_REGEX_TOKEN(x) x,
  35. ENUMERATE_REGEX_TOKENS
  36. #undef __ENUMERATE_REGEX_TOKEN
  37. };
  38. class Token {
  39. public:
  40. Token() = default;
  41. Token(TokenType const type, size_t const start_position, StringView const value)
  42. : m_type(type)
  43. , m_position(start_position)
  44. , m_value(value)
  45. {
  46. }
  47. TokenType type() const { return m_type; }
  48. StringView value() const { return m_value; }
  49. size_t position() const { return m_position; }
  50. char const* name() const;
  51. static char const* name(TokenType);
  52. private:
  53. TokenType m_type { TokenType::Eof };
  54. size_t m_position { 0 };
  55. StringView m_value {};
  56. };
  57. class Lexer : public GenericLexer {
  58. public:
  59. Lexer();
  60. explicit Lexer(StringView source);
  61. Token next();
  62. void reset();
  63. void back(size_t offset);
  64. char consume();
  65. void set_source(StringView const source) { m_input = source; }
  66. auto const& source() const { return m_input; }
  67. private:
  68. size_t m_previous_position { 0 };
  69. Token m_current_token { TokenType::Eof, 0, {} };
  70. };
  71. }
  72. using regex::Lexer;