#include #include #include #include #include #undef NDEBUG #include #include "jinja/jinja-parser.h" #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 %}{{ '' + role + '\\n' + message['content'] | trim + '\\n' }}{% endfor %}{% if add_generation_prompt %}{{'model\\n'}}{% endif %}"; std::cout << "=== INPUT ===\n" << contents << "\n\n"; jinja::lexer lexer; jinja::preprocess_options options; options.trim_blocks = true; options.lstrip_blocks = false; auto tokens = lexer.tokenize(contents, options); for (const auto & tok : tokens) { std::cout << "token: type=" << static_cast(tok.t) << " text='" << tok.value << "'\n"; } jinja::program ast = jinja::parse_from_tokens(tokens); std::cout << "\n=== AST ===\n"; for (const auto & stmt : ast.body) { std::cout << "stmt type: " << stmt->type() << "\n"; } return 0; }