29void PostfixBuilder::pushToken(
const std::string& token) {
31 tokens.push_back(token);
40 case TokenType::Minus:
46 case TokenType::Slash:
49 case TokenType::Percent:
52 case TokenType::StarStar:
55 case TokenType::LogicalAnd:
58 case TokenType::LogicalOr:
61 case TokenType::BitAnd:
64 case TokenType::BitOr:
67 case TokenType::BitXor:
96 case TokenType::Minus:
102 case TokenType::BitNot:
113 pushToken(func_name);
117 pushToken(num_literal);
121 pushToken(const_name);
125 pushToken(var_name +
"@");
129 pushToken(var_name +
"!");
133 pushToken(
"#" + label_name);
137 pushToken(label_name +
"#");
146 const std::string& prop_name) {
147 pushToken(std::format(
"{}.{}", clip_name, prop_name));
151 const std::string& prop_name) {
152 pushToken(std::format(
"{}.{}?", clip_name, prop_name));
156 const std::string& suffix) {
157 pushToken(std::format(
"{}${}", prop_name, suffix));
161 pushToken(std::format(
"{}$d", prop_name));
165 const std::string& x,
166 const std::string& y,
167 const std::string& suffix) {
168 pushToken(std::format(
"{}[{},{}]{}", clip_name, x, y, suffix));
172 const std::string& suffix) {
173 pushToken(std::format(
"{}[]{}", clip_name, suffix));
177 const std::string& plane) {
178 pushToken(std::format(
"{}^{}[]", clip_name, plane));
184 pushToken(std::format(
"@[]^{}", plane));
188 const std::string& plane) {
189 pushToken(std::format(
"{}^{}", dim, plane));
195 pushToken(std::format(
"drop{}", count));
199 pushToken(std::format(
"dup{}", count));
203 pushToken(std::format(
"swap{}", count));
207 pushToken(std::format(
"sort{}", count));
211 const std::string& size) {
212 pushToken(std::format(
"{}{{}}^{}", array_name, size));
216 pushToken(std::format(
"{}{{}}^", array_name));
220 pushToken(std::format(
"{}{{}}@", array_name));
224 pushToken(std::format(
"{}{{}}!", array_name));
228 std::stringstream ss(raw_string);
230 while (ss >> token) {
236 if (tokens.empty()) {
241 std::accumulate(tokens.begin(), tokens.end(),
size_t{0},
242 [](
size_t sum,
const std::string& token) {
243 return sum + token.length();
245 total_len += tokens.size() - 1;
248 result.reserve(total_len);
250 result.append(tokens[0]);
251 for (
size_t i = 1; i < tokens.size(); ++i) {
252 result.push_back(
' ');
253 result.append(tokens[i]);
264 tokens.insert(tokens.end(), other.tokens.begin(), other.tokens.end());
268 for (
auto& token : tokens) {
273 bool is_label_def = token.front() ==
'#';
274 bool is_jump = token.back() ==
'#';
276 if (is_label_def || is_jump) {
277 std::string label_name = is_label_def
279 : token.substr(0, token.size() - 1);
281 if (label_name.empty()) {
285 if (label_name.starts_with(
"__internal_")) {
289 std::string new_label = prefix + label_name;
291 token =
"#" + new_label;
293 token = new_label +
"#";
void addConstant(const std::string &const_name)
void addStaticPixelAccess(const std::string &clip_name, const std::string &x, const std::string &y, const std::string &suffix)
void addSetProp(const std::string &prop_name, const std::string &suffix)
void addNumber(const std::string &num_literal)
void addLabel(const std::string &label_name)
void addUnconditionalJump(const std::string &label_name)
void addArrayAllocStatic(const std::string &array_name, const std::string &size)
void addPropExist(const std::string &clip_name, const std::string &prop_name)
void addDupN(int count=0)
void addConditionalJump(const std::string &label_name)
void addDeleteProp(const std::string &prop_name)
void prefixLabels(const std::string &prefix)
void addStoreSingle(const std::string &plane)
void addFunctionCall(const std::string &func_name)
void addArrayAllocDynamic(const std::string &array_name)
void addDropN(int count=1)
void addArrayLoad(const std::string &array_name)
void addDynPixelAccessExpr(const std::string &clip_name, const std::string &suffix)
void addUnaryOp(TokenType type)
void addArrayStore(const std::string &array_name)
void addDynPixelAccessSingle(const std::string &clip_name, const std::string &plane)
std::string getExpression() const
void append(const PostfixBuilder &other)
void addFrameDimension(const std::string &dim, const std::string &plane)
void addSwapN(int count=1)
void addVariableStore(const std::string &var_name)
void addRaw(const std::string &raw_string)
void addOp(TokenType type)
void addPropAccess(const std::string &clip_name, const std::string &prop_name)
void addVariableLoad(const std::string &var_name)