25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 

62 satır
1.9 KiB

#pragma once
#include <charconv>
#include <concepts>
#include <functional>
#include <memory>
#include <optional>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <variant>
#include <vector>
#include "molasses/lexer.h"
#include "parser_types.h"
enum class architecture_t {
x86_64_linux,
x86_linux
};
#if defined(__x86_64__) && __linux__
constexpr architecture_t architecture = architecture_t::x86_64_linux;
constexpr size_t architecture_ptr_size = 8;
#elif defined(__i386) || defined(__i386__) || defined(i386) && __linux__
constexpr architecture_t architecture = architecture_t::x86_linux;
constexpr size_t architecture_ptr_size = 4;
#endif
namespace molasses {
std::vector<std::string> operator>>(std::vector<std::string> current_stack, const operation& next_op);
struct parser_context {
std::vector<std::shared_ptr<type>> types;
std::vector<std::shared_ptr<operation>> operations;
std::vector<std::shared_ptr<procedure_operation>> procedures;
[[nodiscard]] std::shared_ptr<type> lookup_type(const std::string&) const;
[[nodiscard]] std::shared_ptr<operation> lookup_operation(const std::string&) const;
};
struct generate_context {
lexed_output lexer;
parser_context parser;
std::vector<std::shared_ptr<procedure_operation>> procedures;
};
std::optional<int32_t> try_parse_int32(const std::string& str);
generate_context parse(parser_context, const lexed_output&);
std::vector<std::string> generate(const generate_context&);
parser_context register_integers(parser_context);
template<architecture_t Arch = architecture>
parser_context register_i32_operations(parser_context);
bool type_check(const parser_context&, const lexed_output&, const std::vector<symbol>&, std::vector<std::string> execution_input, const std::vector<std::string>& execution_output);
}