2024-01-24 03:46:26 +01:00
|
|
|
#pragma once
|
2024-01-28 21:38:40 +01:00
|
|
|
#include "Utility.hpp"
|
2024-01-24 03:46:26 +01:00
|
|
|
#include <map>
|
2024-01-28 21:38:40 +01:00
|
|
|
#include <optional>
|
|
|
|
#include <regex>
|
2024-01-24 03:46:26 +01:00
|
|
|
#include <string>
|
2024-01-28 21:38:40 +01:00
|
|
|
#include <unordered_map>
|
2024-01-24 03:46:26 +01:00
|
|
|
#include <vector>
|
|
|
|
|
2024-01-28 21:38:40 +01:00
|
|
|
const int MAX_ITER = 256;
|
|
|
|
|
|
|
|
struct LoopInfo
|
|
|
|
{
|
|
|
|
int idx;
|
|
|
|
int iter;
|
|
|
|
};
|
|
|
|
|
2024-01-24 03:46:26 +01:00
|
|
|
typedef unsigned int uint;
|
2024-01-28 21:38:40 +01:00
|
|
|
typedef std::unordered_map<std::string, LoopInfo> lp_track;
|
|
|
|
typedef std::unordered_map<std::string, int> locals;
|
2024-01-24 03:46:26 +01:00
|
|
|
typedef std::map<int, std::vector<std::string>> varmap;
|
|
|
|
|
|
|
|
struct FunctionInfo
|
|
|
|
{
|
2024-01-28 21:38:40 +01:00
|
|
|
std::smatch match;
|
|
|
|
|
2024-01-24 03:46:26 +01:00
|
|
|
uint addr = 0;
|
|
|
|
std::string nm = "";
|
|
|
|
std::string usg = "";
|
|
|
|
varmap in{};
|
|
|
|
int in_cnt = 0;
|
|
|
|
varmap out{};
|
|
|
|
int out_cnt = 0;
|
|
|
|
std::vector<std::string> prs_msg;
|
|
|
|
bool prs_vld = false;
|
2024-01-28 21:38:40 +01:00
|
|
|
|
2024-01-24 03:46:26 +01:00
|
|
|
void chk_vld();
|
2024-01-28 21:38:40 +01:00
|
|
|
void cln_varmap(bool prc_in);
|
|
|
|
bool nil_in_varmap(bool prc_in) const;
|
|
|
|
bool prc_varmap_rgx(bool prc_in, const std::string& ln_in, std::regex& rgx, locals& lcls);
|
2024-01-24 03:46:26 +01:00
|
|
|
std::string str() const;
|
2024-01-28 21:38:40 +01:00
|
|
|
std::string str_varmap(bool prc_in) const;
|
|
|
|
|
|
|
|
FunctionInfo();
|
|
|
|
FunctionInfo(std::vector<std::string> src);
|
2024-01-24 03:46:26 +01:00
|
|
|
};
|
2024-01-28 21:38:40 +01:00
|
|
|
|
|
|
|
std::optional<int> eval(std::string& infix, locals& lcls);
|