/* * Copyright (c) 2023, Dan Klishch * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include "AST/AST.h" #include "Function.h" #include "Parser/Token.h" namespace JSSpecCompiler { struct ClauseHeader { struct AbstractOperation { StringView name; Vector arguments; }; struct Accessor { Vector qualified_name; }; struct Method { Vector qualified_name; Vector arguments; }; StringView section_number; Variant header; }; struct TextParseError { }; struct FailedTextParseDiagnostic { Location location; String message; }; template using TextParseErrorOr = ErrorOr; class TextParser { public: enum class ClauseHasAoidAttribute { No, Yes, }; TextParser(SpecificationParsingContext& ctx, Vector const& tokens, XML::Node const* node) : m_ctx(ctx) , m_tokens(tokens) , m_node(node) { } TextParseErrorOr parse_clause_header(ClauseHasAoidAttribute clause_has_aoid_attribute); TextParseErrorOr parse_step_without_substeps(); TextParseErrorOr parse_step_with_substeps(Tree substeps); FailedTextParseDiagnostic get_diagnostic() const; private: struct IfConditionParseResult { bool is_if_branch; NullableTree condition; }; struct CustomMessage { StringView message; }; void save_error(Variant&& expected); void retreat(); [[nodiscard]] auto rollback_point(); Optional peek_token(); Optional consume_token(); TextParseErrorOr consume_token_with_one_of_types(std::initializer_list types); TextParseErrorOr consume_token_with_type(TokenType type); TextParseErrorOr consume_token(TokenType type, StringView data); TextParseErrorOr consume_word(StringView word); TextParseErrorOr consume_words(std::initializer_list words); bool is_eof() const; TextParseErrorOr expect_eof(); TextParseErrorOr parse_record_direct_list_initialization(); TextParseErrorOr> parse_function_arguments(); TextParseErrorOr parse_list_initialization(); TextParseErrorOr parse_the_this_value(); TextParseErrorOr parse_value(); TextParseErrorOr parse_expression(); TextParseErrorOr parse_condition(); TextParseErrorOr parse_return_statement(); TextParseErrorOr parse_assert(); TextParseErrorOr parse_assignment(); TextParseErrorOr parse_perform(); TextParseErrorOr parse_simple_step_or_inline_if_branch(); TextParseErrorOr parse_if_beginning(); TextParseErrorOr parse_inline_if_else(); TextParseErrorOr parse_if(Tree then_branch); TextParseErrorOr parse_else(Tree else_branch); TextParseErrorOr> parse_qualified_name(); TextParseErrorOr> parse_function_arguments_in_declaration(); TextParseErrorOr parse_abstract_operation_declaration(); TextParseErrorOr parse_method_declaration(); TextParseErrorOr parse_accessor_declaration(); SpecificationParsingContext& m_ctx; Vector const& m_tokens; size_t m_next_token_index = 0; XML::Node const* m_node; size_t m_max_parsed_tokens = 0; Vector, 8> m_suitable_continuations; }; }