SpecParser.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /*
  2. * Copyright (c) 2023, Dan Klishch <danilklishch@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/OwnPtr.h>
  8. #include "AST/AST.h"
  9. #include "CompilationPipeline.h"
  10. #include "Forward.h"
  11. #include "Parser/ParseError.h"
  12. #include "Parser/TextParser.h"
  13. #include "Parser/Token.h"
  14. namespace JSSpecCompiler {
  15. class SpecificationParsingContext {
  16. AK_MAKE_NONCOPYABLE(SpecificationParsingContext);
  17. AK_MAKE_NONMOVABLE(SpecificationParsingContext);
  18. public:
  19. SpecificationParsingContext(TranslationUnitRef translation_unit)
  20. : m_translation_unit(translation_unit)
  21. {
  22. }
  23. DiagnosticEngine& diag();
  24. template<typename Func>
  25. auto with_new_logical_scope(Func&& func);
  26. LogicalLocation& current_logical_scope();
  27. Location file_scope() const;
  28. Location location_from_xml_offset(XML::Offset offset) const;
  29. private:
  30. TranslationUnitRef m_translation_unit;
  31. RefPtr<LogicalLocation> m_current_logical_scope;
  32. };
  33. class AlgorithmStepList {
  34. public:
  35. static ParseErrorOr<AlgorithmStepList> create(XML::Node::Element const& element);
  36. Vector<AlgorithmStep> m_steps;
  37. Tree m_expression = error_tree;
  38. };
  39. class AlgorithmStep {
  40. public:
  41. static ParseErrorOr<AlgorithmStep> create(XML::Node const* node);
  42. ParseErrorOr<Tree> parse();
  43. Tree m_expression = error_tree;
  44. Vector<Token> m_tokens;
  45. NullableTree m_substeps;
  46. XML::Node const* m_node;
  47. };
  48. class Algorithm {
  49. public:
  50. static ParseErrorOr<Algorithm> create(XML::Node const* node);
  51. AlgorithmStepList m_steps;
  52. Tree m_tree = error_tree;
  53. };
  54. class SpecificationClause {
  55. AK_MAKE_DEFAULT_MOVABLE(SpecificationClause);
  56. public:
  57. static NonnullOwnPtr<SpecificationClause> create(SpecificationParsingContext& ctx, XML::Node const* element);
  58. virtual ~SpecificationClause() = default;
  59. void collect_into(TranslationUnitRef translation_unit);
  60. protected:
  61. virtual bool post_initialize(SpecificationParsingContext& /*ctx*/, XML::Node const* /*element*/) { return true; }
  62. virtual void do_collect(TranslationUnitRef /*translation_unit*/) { }
  63. ClauseHeader m_header;
  64. private:
  65. SpecificationClause() = default;
  66. ParseErrorOr<void> parse_header(XML::Node const* element);
  67. void parse(SpecificationParsingContext& ctx, XML::Node const* element);
  68. Vector<NonnullOwnPtr<SpecificationClause>> m_subclauses;
  69. };
  70. class SpecFunction : public SpecificationClause {
  71. public:
  72. SpecFunction(SpecificationClause&& clause)
  73. : SpecificationClause(move(clause))
  74. {
  75. }
  76. protected:
  77. bool post_initialize(SpecificationParsingContext& ctx, XML::Node const* element) override;
  78. void do_collect(TranslationUnitRef translation_unit) override;
  79. private:
  80. ParseErrorOr<void> do_post_initialize(SpecificationParsingContext& ctx, XML::Node const* element);
  81. StringView m_section_number;
  82. StringView m_id;
  83. StringView m_name;
  84. Vector<FunctionArgument> m_arguments;
  85. Algorithm m_algorithm;
  86. };
  87. class Specification {
  88. public:
  89. static Specification create(SpecificationParsingContext& ctx, XML::Node const* element);
  90. void collect_into(TranslationUnitRef translation_unit);
  91. private:
  92. void parse(SpecificationParsingContext& ctx, XML::Node const* element);
  93. Vector<NonnullOwnPtr<SpecificationClause>> m_clauses;
  94. };
  95. class SpecParsingStep : public CompilationStep {
  96. public:
  97. SpecParsingStep();
  98. ~SpecParsingStep();
  99. void run(TranslationUnitRef translation_unit) override;
  100. private:
  101. OwnPtr<XML::Document> m_document;
  102. ByteBuffer m_input;
  103. };
  104. }