std::vector<const llama_grammar_element *> grammar_rules(result->parsed_grammar.c_rules());
- result->grammar = llama_grammar_init(
+ struct llama_grammar * grammar = llama_grammar_init(
grammar_rules.data(),
grammar_rules.size(), result->parsed_grammar.symbol_ids.at("root"));
+ if (grammar == nullptr) {
+ throw std::runtime_error("Failed to initialize llama_grammar");
+ }
+ result->grammar = grammar;
}
result->prev.resize(params.n_prev);
if (!ctx->parsed_grammar.rules.empty()) {
std::vector<const llama_grammar_element *> grammar_rules(ctx->parsed_grammar.c_rules());
- ctx->grammar = llama_grammar_init(
+ struct llama_grammar * grammar = llama_grammar_init(
grammar_rules.data(),
grammar_rules.size(), ctx->parsed_grammar.symbol_ids.at("root"));
+ if (grammar == nullptr) {
+ throw std::runtime_error("Failed to initialize llama_grammar");
+ }
+ ctx->grammar = grammar;
}
std::fill(ctx->prev.begin(), ctx->prev.end(), 0);
auto grammar = llama_grammar_init(
grammar_rules.data(),
grammar_rules.size(), parsed_grammar.symbol_ids.at("root"));
-
+ if (grammar == nullptr) {
+ throw std::runtime_error("Failed to initialize llama_grammar");
+ }
// Read the input file
std::string input_str;
{
continue;
}
if (llama_grammar_detect_left_recursion(vec_rules, i, &rules_visited, &rules_in_progress, &rules_may_be_empty)) {
- throw std::runtime_error(format("unsupported grammar, left recursion detected for nonterminal at index %zu", i));
+ LLAMA_LOG_ERROR("unsupported grammar, left recursion detected for nonterminal at index %zu", i);
+ return nullptr;
}
}
// Grammar
//
+ /// Initialize a llama_grammar.
+ ///
+ /// @param rules The rule elements of the grammar to initialize.
+ /// @param n_rules The number of rules.
+ /// @param start_rule_index The index of the root rule (the starting point of the grammar).
+ /// @return The initialized llama_grammar or nullptr if initialization failed.
LLAMA_API struct llama_grammar * llama_grammar_init(
const llama_grammar_element ** rules,
size_t n_rules,
static bool test_build_grammar_fails(const std::string & grammar_str) {
fprintf(stderr, "⚫ Testing failure for grammar: %s\n", grammar_str.c_str());
bool grammar_fails = false;
- try {
- build_grammar(grammar_str);
+ llama_grammar * grammar = build_grammar(grammar_str);
+ if (grammar != nullptr) {
fprintf(stderr, " ❌ Expected build failure, but succeeded\n");
- } catch (const std::exception & err) {
+ } else {
grammar_fails = true;
fprintf(stdout, " ✅︎\n");
}
std::vector<const llama_grammar_element *> grammar_rules(parsed_grammar.c_rules());
grammar = llama_grammar_init(
grammar_rules.data(), grammar_rules.size(), parsed_grammar.symbol_ids.at("root"));
+ if (grammar == nullptr)
+ {
+ throw std::runtime_error("Failed to initialize llama_grammar");
+ }
std::vector<std::vector<llama_grammar_element>> expected_stacks = {
{