Skip to content

Commit 6ab1e63

Browse files
committed
Cache the parsing step
1 parent 5f58f08 commit 6ab1e63

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

examples/grammar/grammar.cpp

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,29 @@
11
#include "grammar.h"
2+
#include <unordered_map>
3+
#include <string>
4+
#include <vector>
25

3-
struct llama_grammar * llama_parse_grammar(const char * grammar_str) {
4-
struct llama_grammar * grammar = NULL;
6+
struct llama_grammar * llama_cached_parse_grammar(const char * grammar_str) {
7+
static std::unordered_map<std::string, grammar_parser::parse_state> parsed_grammar_cache;
8+
std::string key = grammar_str;
9+
10+
auto it = parsed_grammar_cache.find(key);
511
grammar_parser::parse_state parsed_grammar;
12+
if (it != parsed_grammar_cache.end()) {
13+
// Use cached parsed grammar
14+
parsed_grammar = it->second;
15+
} else {
16+
// Parse and cache the result
17+
parsed_grammar = grammar_parser::parse(grammar_str);
18+
parsed_grammar_cache[key] = parsed_grammar;
619

7-
parsed_grammar = grammar_parser::parse(grammar_str);
8-
grammar_parser::print_grammar(stderr, parsed_grammar);
20+
// Optionally print the grammar
21+
grammar_parser::print_grammar(stderr, parsed_grammar);
22+
}
923

1024
std::vector<const llama_grammar_element *> grammar_rules(parsed_grammar.c_rules());
25+
26+
struct llama_grammar * grammar = NULL;
1127
grammar = llama_grammar_init(grammar_rules.data(), grammar_rules.size(), parsed_grammar.symbol_ids.at("root"));
1228

1329
return grammar;

examples/grammar/grammar.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
extern "C" {
99
#endif
1010

11-
struct llama_grammar * llama_parse_grammar(const char * grammar_str);
11+
struct llama_grammar * llama_cached_parse_grammar(const char * grammar_str);
1212

1313
#ifdef __cplusplus
1414
}

0 commit comments

Comments
 (0)