This commit is contained in:
Xuan Son Nguyen 2025-12-27 22:25:19 +01:00
parent 7ed11f78f9
commit da7bbe5813
3 changed files with 40 additions and 9 deletions

View File

@ -203,4 +203,24 @@ value filter_expression::execute(context & ctx) {
}
}
value if_statement::execute(context & ctx) {
throw std::runtime_error("if_statement::execute not implemented");
}
value for_statement::execute(context & ctx) {
throw std::runtime_error("for_statement::execute not implemented");
}
value break_statement::execute(context & ctx) {
throw std::runtime_error("break_statement::execute not implemented");
}
value continue_statement::execute(context & ctx) {
throw std::runtime_error("continue_statement::execute not implemented");
}
value set_statement::execute(context & ctx) {
throw std::runtime_error("set_statement::execute not implemented");
}
} // namespace jinja

View File

@ -13,8 +13,17 @@
namespace jinja {
struct context {
std::ostringstream out;
std::map<std::string, value> var;
context() = default;
~context() = default;
context(const context & parent) {
// inherit variables (for example, when entering a new scope)
for (const auto & pair : parent.var) {
var[pair.first] = pair.second->clone();
}
}
};
/**
@ -59,7 +68,9 @@ struct program : public statement {
explicit program(statements && body) : body(std::move(body)) {}
std::string type() const override { return "Program"; }
value execute(context & ctx) override {}
value execute(context & ctx) override {
throw std::runtime_error("Cannot execute program directly, use jinja::vm instead");
}
};
struct if_statement : public statement {
@ -73,7 +84,7 @@ struct if_statement : public statement {
}
std::string type() const override { return "If"; }
value execute(context & ctx) override {}
value execute(context & ctx) override;
};
struct identifier;
@ -97,17 +108,17 @@ struct for_statement : public statement {
}
std::string type() const override { return "For"; }
value execute(context & ctx) override {}
value execute(context & ctx) override;
};
struct break_statement : public statement {
std::string type() const override { return "Break"; }
value execute(context & ctx) override {}
value execute(context & ctx) override;
};
struct continue_statement : public statement {
std::string type() const override { return "Continue"; }
value execute(context & ctx) override {}
value execute(context & ctx) override;
};
struct set_statement : public statement {
@ -122,7 +133,7 @@ struct set_statement : public statement {
}
std::string type() const override { return "Set"; }
value execute(context & ctx) override {}
value execute(context & ctx) override;
};
struct macro_statement : public statement {

View File

@ -11,9 +11,9 @@
#include "jinja/jinja-lexer.h"
int main(void) {
//std::string contents = "{% if messages[0]['role'] == 'system' %}{{ raise_exception('System role not supported') }}{% endif %}{% for message in messages %}{% if (message['role'] == 'user') != (loop.index0 % 2 == 0) %}{{ raise_exception('Conversation roles must alternate user/assistant/user/assistant/...') }}{% endif %}{% if (message['role'] == 'assistant') %}{% set role = 'model' %}{% else %}{% set role = message['role'] %}{% endif %}{{ '<start_of_turn>' + role + '\\n' + message['content'] | trim + '<end_of_turn>\\n' }}{% endfor %}{% if add_generation_prompt %}{{'<start_of_turn>model\\n'}}{% endif %}";
std::string contents = "{% if messages[0]['role'] == 'system' %}{{ raise_exception('System role not supported') }}{% endif %}{% for message in messages %}{% if (message['role'] == 'user') != (loop.index0 % 2 == 0) %}{{ raise_exception('Conversation roles must alternate user/assistant/user/assistant/...') }}{% endif %}{% if (message['role'] == 'assistant') %}{% set role = 'model' %}{% else %}{% set role = message['role'] %}{% endif %}{{ '<start_of_turn>' + role + '\\n' + message['content'] | trim + '<end_of_turn>\\n' }}{% endfor %}{% if add_generation_prompt %}{{'<start_of_turn>model\\n'}}{% endif %}";
std::string contents = "{{ ('hi' + 'fi') | upper }}";
//std::string contents = "{{ ('hi' + 'fi') | upper }}";
std::cout << "=== INPUT ===\n" << contents << "\n\n";