Parser.h 5.1 KB

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