AlgorithmStep.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /*
  2. * Copyright (c) 2023-2024, Dan Klishch <danilklishch@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "Parser/Lexer.h"
  7. #include "Parser/SpecificationParsing.h"
  8. namespace JSSpecCompiler {
  9. Optional<AlgorithmStep> AlgorithmStep::create(SpecificationParsingContext& ctx, XML::Node const* element)
  10. {
  11. VERIFY(element->as_element().name == tag_li);
  12. auto [maybe_tokens, substeps] = tokenize_step(ctx, element);
  13. AlgorithmStep result(ctx);
  14. result.m_node = element;
  15. if (substeps) {
  16. // FIXME: Remove this once macOS Lagom CI updates to Clang >= 16.
  17. auto substeps_copy = substeps;
  18. auto step_list = ctx.with_new_step_list_nesting_level([&] {
  19. return AlgorithmStepList::create(ctx, substeps_copy);
  20. });
  21. result.m_substeps = step_list.has_value() ? step_list->tree() : error_tree;
  22. }
  23. if (!maybe_tokens.has_value())
  24. return {};
  25. result.m_tokens = maybe_tokens.release_value();
  26. if (!result.parse())
  27. return {};
  28. return result;
  29. }
  30. bool AlgorithmStep::parse()
  31. {
  32. TextParser parser(m_ctx, m_tokens, m_node);
  33. TextParseErrorOr<NullableTree> parse_result = TextParseError {};
  34. if (m_substeps)
  35. parse_result = parser.parse_step_with_substeps(RefPtr(m_substeps).release_nonnull());
  36. else
  37. parse_result = parser.parse_step_without_substeps();
  38. if (parse_result.is_error()) {
  39. auto [location, message] = parser.get_diagnostic();
  40. m_ctx.diag().error(location, "{}", message);
  41. return false;
  42. } else {
  43. m_expression = parse_result.release_value();
  44. return true;
  45. }
  46. }
  47. }