/* * Copyright (c) 2023, Dan Klishch * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include "AST/AST.h" #include "CompilationPipeline.h" #include "Forward.h" #include "Parser/ParseError.h" #include "Parser/Token.h" namespace JSSpecCompiler { class SpecificationParsingContext { AK_MAKE_NONCOPYABLE(SpecificationParsingContext); AK_MAKE_NONMOVABLE(SpecificationParsingContext); public: SpecificationParsingContext(TranslationUnitRef translation_unit) : m_translation_unit(translation_unit) { } DiagnosticEngine& diag(); template auto with_new_logical_scope(Func&& func); LogicalLocation& current_logical_scope(); Location file_scope() const; Location location_from_xml_offset(XML::Offset offset) const; private: TranslationUnitRef m_translation_unit; RefPtr m_current_logical_scope; }; class AlgorithmStepList { public: static ParseErrorOr create(XML::Node::Element const& element); Vector m_steps; Tree m_expression = error_tree; }; class AlgorithmStep { public: static ParseErrorOr create(XML::Node const* node); ParseErrorOr parse(); Tree m_expression = error_tree; Vector m_tokens; NullableTree m_substeps; XML::Node const* m_node; }; class Algorithm { public: static ParseErrorOr create(XML::Node const* node); AlgorithmStepList m_steps; Tree m_tree = error_tree; }; class SpecFunction { public: struct Argument { StringView name; }; static ParseErrorOr create(XML::Node const* element); ParseErrorOr parse_definition(XML::Node const* element); StringView m_section_number; StringView m_id; StringView m_name; Vector m_arguments; Algorithm m_algorithm; }; class SpecParsingStep : public CompilationStep { public: SpecParsingStep(); ~SpecParsingStep(); void run(TranslationUnitRef translation_unit) override; private: OwnPtr m_document; ByteBuffer m_input; }; }