/* * Copyright (c) 2021, Tim Flynn * Copyright (c) 2021, Mahmoud Mandour * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include namespace SQL::AST { namespace Limits { // https://www.sqlite.org/limits.html constexpr size_t maximum_expression_tree_depth = 1000; constexpr size_t maximum_subquery_depth = 100; constexpr size_t maximum_bound_parameters = 1000; } class Parser { struct Error { DeprecatedString message; SourcePosition position; DeprecatedString to_deprecated_string() const { return DeprecatedString::formatted("{} (line: {}, column: {})", message, position.line, position.column); } }; public: explicit Parser(Lexer lexer); NonnullRefPtr next_statement(); bool has_errors() const { return m_parser_state.m_errors.size(); } Vector const& errors() const { return m_parser_state.m_errors; } protected: NonnullRefPtr parse_expression(); // Protected for unit testing. private: struct ParserState { explicit ParserState(Lexer); Lexer m_lexer; Token m_token; Vector m_errors; size_t m_current_expression_depth { 0 }; size_t m_current_subquery_depth { 0 }; size_t m_bound_parameters { 0 }; }; NonnullRefPtr parse_statement(); NonnullRefPtr parse_statement_with_expression_list(RefPtr); NonnullRefPtr parse_create_schema_statement(); NonnullRefPtr parse_create_table_statement(); NonnullRefPtr parse_alter_table_statement(); NonnullRefPtr parse_drop_table_statement(); NonnullRefPtr parse_describe_table_statement(); NonnullRefPtr parse_insert_statement(RefPtr); NonnullRefPtr parse_update_statement(RefPtr); NonnullRefPtr parse_delete_statement(RefPtr); NonnullRefPtr