Parser.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. /*
  2. * Copyright (c) 2021, Tim Flynn <trflynn89@pm.me>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/String.h>
  8. #include <AK/StringView.h>
  9. #include <LibSQL/AST.h>
  10. #include <LibSQL/Lexer.h>
  11. #include <LibSQL/Token.h>
  12. namespace SQL {
  13. namespace Limits {
  14. // https://www.sqlite.org/limits.html
  15. constexpr size_t maximum_expression_tree_depth = 1000;
  16. }
  17. class Parser {
  18. struct Position {
  19. size_t line { 0 };
  20. size_t column { 0 };
  21. };
  22. struct Error {
  23. String message;
  24. Position position;
  25. String to_string() const
  26. {
  27. return String::formatted("{} (line: {}, column: {})", message, position.line, position.column);
  28. }
  29. };
  30. public:
  31. explicit Parser(Lexer lexer);
  32. NonnullRefPtr<Statement> next_statement();
  33. bool has_errors() const { return m_parser_state.m_errors.size(); }
  34. const Vector<Error>& errors() const { return m_parser_state.m_errors; }
  35. protected:
  36. NonnullRefPtr<Expression> parse_expression(); // Protected for unit testing.
  37. private:
  38. struct ParserState {
  39. explicit ParserState(Lexer);
  40. Lexer m_lexer;
  41. Token m_token;
  42. Vector<Error> m_errors;
  43. size_t m_current_expression_depth { 0 };
  44. };
  45. NonnullRefPtr<Statement> parse_statement();
  46. NonnullRefPtr<Statement> parse_statement_with_expression_list(RefPtr<CommonTableExpressionList>);
  47. NonnullRefPtr<CreateTable> parse_create_table_statement();
  48. NonnullRefPtr<AlterTable> parse_alter_table_statement();
  49. NonnullRefPtr<DropTable> parse_drop_table_statement();
  50. NonnullRefPtr<Insert> parse_insert_statement(RefPtr<CommonTableExpressionList>);
  51. NonnullRefPtr<Update> parse_update_statement(RefPtr<CommonTableExpressionList>);
  52. NonnullRefPtr<Delete> parse_delete_statement(RefPtr<CommonTableExpressionList>);
  53. NonnullRefPtr<Select> parse_select_statement(RefPtr<CommonTableExpressionList>);
  54. RefPtr<CommonTableExpressionList> parse_common_table_expression_list();
  55. NonnullRefPtr<Expression> parse_primary_expression();
  56. NonnullRefPtr<Expression> parse_secondary_expression(NonnullRefPtr<Expression> primary);
  57. bool match_secondary_expression() const;
  58. Optional<NonnullRefPtr<Expression>> parse_literal_value_expression();
  59. Optional<NonnullRefPtr<Expression>> parse_column_name_expression(String with_parsed_identifier = {}, bool with_parsed_period = false);
  60. Optional<NonnullRefPtr<Expression>> parse_unary_operator_expression();
  61. Optional<NonnullRefPtr<Expression>> parse_binary_operator_expression(NonnullRefPtr<Expression> lhs);
  62. Optional<NonnullRefPtr<Expression>> parse_chained_expression();
  63. Optional<NonnullRefPtr<Expression>> parse_cast_expression();
  64. Optional<NonnullRefPtr<Expression>> parse_case_expression();
  65. Optional<NonnullRefPtr<Expression>> parse_exists_expression(bool invert_expression, TokenType opening_token = TokenType::Exists);
  66. Optional<NonnullRefPtr<Expression>> parse_collate_expression(NonnullRefPtr<Expression> expression);
  67. Optional<NonnullRefPtr<Expression>> parse_is_expression(NonnullRefPtr<Expression> expression);
  68. Optional<NonnullRefPtr<Expression>> parse_match_expression(NonnullRefPtr<Expression> lhs, bool invert_expression);
  69. Optional<NonnullRefPtr<Expression>> parse_null_expression(NonnullRefPtr<Expression> expression, bool invert_expression);
  70. Optional<NonnullRefPtr<Expression>> parse_between_expression(NonnullRefPtr<Expression> expression, bool invert_expression);
  71. Optional<NonnullRefPtr<Expression>> parse_in_expression(NonnullRefPtr<Expression> expression, bool invert_expression);
  72. NonnullRefPtr<ColumnDefinition> parse_column_definition();
  73. NonnullRefPtr<TypeName> parse_type_name();
  74. NonnullRefPtr<SignedNumber> parse_signed_number();
  75. NonnullRefPtr<CommonTableExpression> parse_common_table_expression();
  76. NonnullRefPtr<QualifiedTableName> parse_qualified_table_name();
  77. NonnullRefPtr<ReturningClause> parse_returning_clause();
  78. NonnullRefPtr<ResultColumn> parse_result_column();
  79. NonnullRefPtr<TableOrSubquery> parse_table_or_subquery();
  80. NonnullRefPtr<OrderingTerm> parse_ordering_term();
  81. void parse_schema_and_table_name(String& schema_name, String& table_name);
  82. ConflictResolution parse_conflict_resolution();
  83. template<typename ParseCallback>
  84. void parse_comma_separated_list(bool surrounded_by_parentheses, ParseCallback&& parse_callback)
  85. {
  86. if (surrounded_by_parentheses)
  87. consume(TokenType::ParenOpen);
  88. while (!has_errors() && !match(TokenType::Eof)) {
  89. parse_callback();
  90. if (!match(TokenType::Comma))
  91. break;
  92. consume(TokenType::Comma);
  93. };
  94. if (surrounded_by_parentheses)
  95. consume(TokenType::ParenClose);
  96. }
  97. Token consume();
  98. Token consume(TokenType type);
  99. bool consume_if(TokenType type);
  100. bool match(TokenType type) const;
  101. void expected(StringView what);
  102. void syntax_error(String message);
  103. Position position() const;
  104. ParserState m_parser_state;
  105. };
  106. }