13class ParameterProgram {
14 friend class ParameterCommands;
17 ParameterProgram(
const std::string &s);
18 ParameterProgram(
const ParameterProgram &other);
19 ParameterProgram &operator=(
const ParameterProgram &other);
20 std::optional<std::string> get_init_error();
21 const std::string &get_code()
const;
22 std::optional<std::string> set_code(
const std::string &s);
24 std::optional<std::string> run(
const ParameterSet &pset = {});
25 using Stack = std::vector<int64_t>;
26 const auto &get_stack()
const
31 bool stack_pop(int64_t &va);
36 enum class Type { INT, CMD, STR,
UUID };
37 Token(Type ty) : type(ty)
47 virtual std::unique_ptr<Token> clone()
const = 0;
50 class TokenInt :
public Token {
52 TokenInt(int64_t v) : Token(Token::Type::INT), value(v)
58 std::unique_ptr<Token> clone()
const override
60 return std::make_unique<TokenInt>(*
this);
64 class TokenCommand :
public Token {
66 TokenCommand(
const std::string &cmd) : Token(Token::Type::CMD), command(cmd)
70 TokenCommand(
const TokenCommand &other) : Token(Token::Type::CMD), command(other.command)
72 std::transform(other.arguments.begin(), other.arguments.end(), std::back_inserter(arguments),
73 [](
auto &x) { return x->clone(); });
76 const std::string command;
77 std::vector<std::unique_ptr<Token>> arguments;
79 std::unique_ptr<Token> clone()
const override
81 return std::make_unique<TokenCommand>(*
this);
85 class TokenString :
public Token {
87 TokenString(
const std::string &str) : Token(Token::Type::STR), string(str)
91 const std::string string;
93 std::unique_ptr<Token> clone()
const override
95 return std::make_unique<TokenString>(*
this);
99 class TokenUUID :
public Token {
101 TokenUUID(
const std::string &str) : Token(Token::Type::UUID), string(str)
105 const std::string string;
107 std::unique_ptr<Token> clone()
const override
109 return std::make_unique<TokenUUID>(*
this);
113 using CommandHandler = std::optional<std::string> (ParameterProgram::*)(
const TokenCommand &cmd);
114 virtual CommandHandler get_command(
const std::string &cmd);
116 std::vector<int64_t> stack;
121 std::optional<std::string> compile();
122 std::optional<std::string> init_error;
123 std::vector<std::unique_ptr<Token>> tokens;
125 std::optional<std::string> cmd_dump(
const TokenCommand &cmd);
126 std::optional<std::string> cmd_math1(
const TokenCommand &cmd);
127 std::optional<std::string> cmd_math2(
const TokenCommand &cmd);
128 std::optional<std::string> cmd_math3(
const TokenCommand &cmd);