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.

127 lines
4.7 KiB

  1. #pragma once
  2. #include "lexer.h"
  3. #include <functional>
  4. #include <memory>
  5. #include <stack>
  6. #include <string>
  7. #include <variant>
  8. #include <vector>
  9. namespace molasses {
  10. struct type {
  11. [[nodiscard]] virtual std::string name() const = 0;
  12. [[nodiscard]] virtual size_t byte_size() const = 0;
  13. };
  14. inline auto operator<=>(const type& lhs, const type& rhs) {
  15. return lhs.name() <=> rhs.name();
  16. }
  17. struct primitive_type : public type {
  18. std::string _name;
  19. size_t _byte_size;
  20. primitive_type(std::string name, size_t byte_size)
  21. : _name(std::forward<std::string>(name))
  22. , _byte_size(byte_size)
  23. {}
  24. [[nodiscard]] std::string name() const final {
  25. return _name;
  26. }
  27. [[nodiscard]] size_t byte_size() const final {
  28. return _byte_size;
  29. };
  30. };
  31. struct parser_context;
  32. struct ptr_type{
  33. void* ptr;
  34. std::shared_ptr<type> pointed;
  35. };
  36. using stack_element = std::variant<int32_t, int64_t, ptr_type>;
  37. using interpreter_stack = std::stack<stack_element>;
  38. struct generate_context;
  39. struct operation {
  40. [[nodiscard]] virtual std::string name() const = 0;
  41. [[nodiscard]] virtual std::vector<std::string> argument_types() const = 0;
  42. [[nodiscard]] virtual std::vector<std::string> return_types() const = 0;
  43. [[nodiscard]] virtual std::vector<std::string> generate(const parser_context&, const lexed_output& lexer_data) const = 0;
  44. [[nodiscard]] virtual std::vector<std::string> emit(const parser_context&) const = 0;
  45. virtual void execute(const generate_context&, interpreter_stack&) const = 0;
  46. };
  47. struct primitive_operation : public operation {
  48. std::string _name;
  49. std::vector<std::string> _args;
  50. std::vector<std::string> _rets;
  51. std::vector<std::string> _instructions;
  52. std::function<void(const generate_context&, interpreter_stack&)> _executable;
  53. primitive_operation(std::string name, std::vector<std::string> args, std::vector<std::string> rets, std::vector<std::string> body, std::function<void(const generate_context&,interpreter_stack&)> executable)
  54. : _name(std::forward<std::string>(name))
  55. , _args(std::forward<std::vector<std::string>>(args))
  56. , _rets(std::forward<std::vector<std::string>>(rets))
  57. , _instructions(std::forward<std::vector<std::string>>(body))
  58. , _executable(std::move(executable))
  59. {}
  60. [[nodiscard]] std::string name() const final {
  61. return _name;
  62. }
  63. [[nodiscard]] std::vector<std::string> argument_types() const final {
  64. return _args;
  65. }
  66. [[nodiscard]] std::vector<std::string> return_types() const final {
  67. return _rets;
  68. }
  69. [[nodiscard]] std::vector<std::string> generate(const parser_context&, const lexed_output& lexer_data) const final {
  70. return {};
  71. }
  72. [[nodiscard]] std::vector<std::string> emit(const parser_context&) const final {
  73. return _instructions;
  74. }
  75. void execute(const generate_context& ctx, interpreter_stack& stack) const override {
  76. _executable(ctx, stack);
  77. };
  78. };
  79. struct procedure_operation : public operation {
  80. std::string _name;
  81. std::vector<std::string> _args;
  82. std::vector<std::string> _rets;
  83. std::vector<symbol> _body;
  84. std::vector<std::pair<size_t, size_t>> _simple_sub_bodies;
  85. procedure_operation(std::string name, std::vector<std::string> args, std::vector<std::string> rets, std::vector<symbol> body, std::vector<std::pair<size_t, size_t>> sub_bodies)
  86. : _name(std::forward<std::string>(name))
  87. , _args(std::forward<std::vector<std::string>>(args))
  88. , _rets(std::forward<std::vector<std::string>>(rets))
  89. , _body(std::forward<std::vector<symbol>>(body))
  90. , _simple_sub_bodies(std::forward<std::vector<std::pair<size_t, size_t>>>(sub_bodies))
  91. {}
  92. [[nodiscard]] std::string name() const final {
  93. return _name;
  94. }
  95. [[nodiscard]] std::vector<std::string> argument_types() const final {
  96. return _args;
  97. }
  98. [[nodiscard]] std::vector<std::string> return_types() const final {
  99. return _rets;
  100. }
  101. [[nodiscard]] std::vector<std::string> generate(const parser_context&, const lexed_output& lexer_data) const final;
  102. [[nodiscard]] std::vector<std::string> emit(const parser_context&) const final;
  103. void execute(const generate_context&, interpreter_stack&) const final;
  104. };
  105. inline auto operator<=>(const operation& lhs, const operation& rhs) {
  106. return lhs.name() <=> rhs.name();
  107. }
  108. }