grammar : check pattern directly instead of adding a type

This commit is contained in:
Alde Rojas 2025-12-24 02:19:09 -06:00
parent f907124097
commit 3bdcc4f773
2 changed files with 8 additions and 22 deletions

View File

@ -372,14 +372,6 @@ static void print_rule(
//
// Regex utilities
//
static llama_grammar_trigger_pattern llama_grammar_trigger_pattern_compile(const std::string & pattern) {
llama_grammar_trigger_pattern_type type = LLAMA_GRAMMAR_TRIGGER_PATTERN_TYPE_SEARCH;
if (!pattern.empty() && pattern.front() == '^' && pattern.back() == '$') {
// If anchored on both ends, consider it a match
type = LLAMA_GRAMMAR_TRIGGER_PATTERN_TYPE_MATCH;
}
return {type, pattern, std::regex(pattern)};
}
size_t llama_grammar_trigger_pattern::find(const std::string & input) const {
auto find_start_pos = [](const std::smatch & match) {
@ -397,7 +389,7 @@ size_t llama_grammar_trigger_pattern::find(const std::string & input) const {
return start;
};
if (type == LLAMA_GRAMMAR_TRIGGER_PATTERN_TYPE_MATCH) {
if (!pattern.empty() && pattern.front() == '^' && pattern.back() == '$') {
// match against the entire input
std::smatch match;
if (std::regex_match(input, match, regex)) {
@ -405,12 +397,10 @@ size_t llama_grammar_trigger_pattern::find(const std::string & input) const {
}
}
if (type == LLAMA_GRAMMAR_TRIGGER_PATTERN_TYPE_SEARCH) {
// search anywhere
std::smatch match;
if (std::regex_search(input, match, regex)) {
return find_start_pos(match);
}
// search anywhere
std::smatch match;
if (std::regex_search(input, match, regex)) {
return find_start_pos(match);
}
return std::string::npos;
@ -1240,7 +1230,9 @@ struct llama_grammar * llama_grammar_init_impl(
}
for (size_t i = 0; i < num_trigger_patterns; i++) {
GGML_ASSERT(trigger_patterns != nullptr);
vec_trigger_patterns.emplace_back(llama_grammar_trigger_pattern_compile(trigger_patterns[i]));
auto & trigger = vec_trigger_patterns.emplace_back();
trigger.pattern = trigger_patterns[i];
trigger.regex = std::regex(trigger.pattern);
}
// Important: vec_rules has to be moved here, not copied, because stacks contains

View File

@ -116,13 +116,7 @@ struct llama_grammar_parser {
void print(FILE * file);
};
enum llama_grammar_trigger_pattern_type {
LLAMA_GRAMMAR_TRIGGER_PATTERN_TYPE_MATCH = 0,
LLAMA_GRAMMAR_TRIGGER_PATTERN_TYPE_SEARCH = 1,
};
struct llama_grammar_trigger_pattern {
llama_grammar_trigger_pattern_type type;
std::string pattern;
std::regex regex;