You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
2.4 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. #pragma once
  2. #include <charconv>
  3. #include <concepts>
  4. #include <functional>
  5. #include <memory>
  6. #include <optional>
  7. #include <set>
  8. #include <sstream>
  9. #include <stack>
  10. #include <string>
  11. #include <utility>
  12. #include <variant>
  13. #include <vector>
  14. #include "molasses/lexer.h"
  15. #include "parser_types.h"
  16. enum class architecture_t {
  17. x86_64_linux,
  18. x86_linux
  19. };
  20. #if defined(__x86_64__) && __linux__
  21. constexpr architecture_t architecture = architecture_t::x86_64_linux;
  22. constexpr size_t architecture_ptr_size = 8;
  23. #elif defined(__i386) || defined(__i386__) || defined(i386) && __linux__
  24. constexpr architecture_t architecture = architecture_t::x86_linux;
  25. constexpr size_t architecture_ptr_size = 4;
  26. #endif
  27. namespace molasses {
  28. std::vector<std::string> operator>>(std::vector<std::string> current_stack, const operation& next_op);
  29. std::optional<int32_t> try_parse_int32(const std::string& str);
  30. std::optional<int64_t> try_parse_int64(const std::string& str);
  31. struct parser_context {
  32. std::vector<std::shared_ptr<type>> types;
  33. std::vector<std::shared_ptr<operation>> operations;
  34. std::vector<std::shared_ptr<procedure_operation>> procedures;
  35. [[nodiscard]] std::shared_ptr<type> lookup_type(const std::string&) const;
  36. [[nodiscard]] std::shared_ptr<operation> lookup_operation(const std::string&) const;
  37. };
  38. struct generate_context {
  39. lexed_output lexer;
  40. parser_context parser;
  41. std::vector<std::shared_ptr<procedure_operation>> procedures;
  42. };
  43. using success_t = bool;
  44. std::tuple<interpreter_stack, generate_context, std::optional<std::shared_ptr<std::runtime_error>>> interpret(interpreter_stack, generate_context, std::string );
  45. std::optional<int32_t> try_parse_int32(const std::string& str);
  46. generate_context parse(parser_context, const lexed_output&);
  47. std::vector<std::string> generate(const generate_context&);
  48. parser_context register_integers(parser_context);
  49. template<architecture_t Arch = architecture>
  50. parser_context register_i32_operations(parser_context);
  51. bool type_check(
  52. const parser_context& parser_state,
  53. const lexed_output& lexer_state,
  54. const std::vector<symbol>& consumed_stream,
  55. std::vector<std::string> execution_input,
  56. const std::vector<std::string>& execution_output,
  57. const std::vector<std::pair<size_t, size_t>>& sub_bodies
  58. );
  59. }