char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
acecd5603
char/aliceai-t5-moe
1#pragma once 2 3#include "json-schema.h" 4#include "json.h" 5 6#include <memory> 7#include <set> 8#include <unordered_map> 9#include <string> 10#include <string_view> 11#include <functional> 12#include <vector> 13#include <variant> 14 15struct common_grammar_builder ; 16 17class common_peg_parser_builder ; 18 19using common_peg_parser_id = size_t ; 20constexprcommon_peg_parser_id COMMON_PEG_INVALID_PARSER_ID = static_cast < common_peg_parser_id > (-1 ); 21 22using common_peg_ast_id = size_t ; 23constexprcommon_peg_ast_id COMMON_PEG_INVALID_AST_ID = static_cast < common_peg_ast_id > (-1 ); 24 25// Lightweight wrapper around common_peg_parser_id for convenience 26class common_peg_parser { 27common_peg_parser_id id_ ; 28common_peg_parser_builder & builder_ ; 29 30public : 31common_peg_parser (const common_peg_parser & other ) :id_ (other .id_ ),builder_ (other .builder_ ) {} 32common_peg_parser (common_peg_parser_id id ,common_peg_parser_builder & builder ) :id_ (id ),builder_ (builder ) {} 33 34common_peg_parser & operator = (const common_peg_parser & other ); 35common_peg_parser & operator += (const common_peg_parser & other ); 36common_peg_parser & operator |=(const common_peg_parser & other ); 37 38operator common_peg_parser_id ()const {return id_ ; } 39common_peg_parser_id id ()const {return id_ ; } 40 41common_peg_parser_builder & builder ()const {return builder_ ; } 42 43// Creates a sequence 44common_peg_parser operator + (const common_peg_parser & other )const ; 45 46// Creates a sequence separated by spaces. 47common_peg_parser operator <<(const common_peg_parser & other )const ; 48 49// Creates a choice 50common_peg_parser operator |(const common_peg_parser & other )const ; 51 52common_peg_parser operator + (const char * str )const ; 53common_peg_parser operator + (const std ::string & str )const ; 54common_peg_parser operator <<(const char * str )const ; 55common_peg_parser operator <<(const std ::string & str )const ; 56common_peg_parser operator |(const char * str )const ; 57common_peg_parser operator |(const std ::string & str )const ; 58}; 59 60common_peg_parser operator + (const char * str ,const common_peg_parser & p ); 61common_peg_parser operator + (const std ::string & str ,const common_peg_parser & p ); 62common_peg_parser operator <<(const char * str ,const common_peg_parser & p ); 63common_peg_parser operator <<(const std ::string & str ,const common_peg_parser & p ); 64common_peg_parser operator |(const char * str ,const common_peg_parser & p ); 65common_peg_parser operator |(const std ::string & str ,const common_peg_parser & p ); 66 67enum common_peg_parse_result_type { 68COMMON_PEG_PARSE_RESULT_FAIL = 0 , 69COMMON_PEG_PARSE_RESULT_SUCCESS = 1 , 70COMMON_PEG_PARSE_RESULT_NEED_MORE_INPUT = 2 , 71}; 72 73const char * common_peg_parse_result_type_name (common_peg_parse_result_type type ); 74 75struct common_peg_ast_node { 76common_peg_ast_id id ; 77std ::string rule ; 78std ::string tag ; 79size_t start ; 80size_t end ; 81std ::string_view text ; 82std ::vector < common_peg_ast_id > children ; 83 84bool is_partial = false; 85}; 86 87struct common_peg_parse_result ; 88 89using common_peg_ast_visitor = std ::function < void (const common_peg_ast_node & node )> ; 90 91class common_peg_ast_arena { 92std ::vector < common_peg_ast_node > nodes_ ; 93public : 94common_peg_ast_id add_node ( 95const std ::string & rule , 96const std ::string & tag , 97size_t start , 98size_t end , 99std ::string_view text , 100std ::vector < common_peg_ast_id > children , 101bool is_partial = false 102 ) { 103common_peg_ast_id id = nodes_ .size (); 104nodes_ .push_back ({id ,rule ,tag ,start ,end ,text ,std ::move (children ),is_partial }); 105return id ; 106 } 107 108const common_peg_ast_node & get (common_peg_ast_id id )const {return nodes_ .at (id ); } 109 110common_peg_ast_id find_by_tag (const common_peg_ast_node & parent ,const std ::string & tag ,int max_depth = 3 )const ; 111common_peg_ast_id find_by_rule (const common_peg_ast_node & parent ,const std ::string & tag ,int max_depth = 3 )const ; 112 113size_t size ()const {return nodes_ .size (); } 114 115void clear () {nodes_ .clear (); } 116 117void visit (common_peg_ast_id id ,const common_peg_ast_visitor & visitor )const ; 118void visit (const common_peg_parse_result & result ,const common_peg_ast_visitor & visitor )const ; 119 120std ::string dump (); 121}; 122 123struct common_peg_parse_result { 124common_peg_parse_result_type type = COMMON_PEG_PARSE_RESULT_FAIL ; 125size_t start = 0 ; 126size_t end = 0 ; 127 128std ::vector < common_peg_ast_id > nodes ; 129 130common_peg_parse_result ()= default ; 131 132common_peg_parse_result (common_peg_parse_result_type type ,size_t start ) 133 :type (type ),start (start ),end (start ) {} 134 135common_peg_parse_result (common_peg_parse_result_type type ,size_t start ,size_t end ) 136 :type (type ),start (start ),end (end ) {} 137 138common_peg_parse_result (common_peg_parse_result_type type ,size_t start ,size_t end ,std ::vector < common_peg_ast_id > nodes ) 139 :type (type ),start (start ),end (end ),nodes (std ::move (nodes )) {} 140 141bool fail ()const {return type == COMMON_PEG_PARSE_RESULT_FAIL ; } 142bool need_more_input ()const {return type == COMMON_PEG_PARSE_RESULT_NEED_MORE_INPUT ; } 143bool success ()const {return type == COMMON_PEG_PARSE_RESULT_SUCCESS ; } 144}; 145 146enum common_peg_parse_flags { 147COMMON_PEG_PARSE_FLAG_NONE = 0 , 148COMMON_PEG_PARSE_FLAG_LENIENT = 1 <<0 , 149COMMON_PEG_PARSE_FLAG_DEBUG = 1 <<1 , 150}; 151 152inline common_peg_parse_flags operator |(common_peg_parse_flags a ,common_peg_parse_flags b ) { 153return static_cast < common_peg_parse_flags > (int (a ) |int (b )); 154} 155 156inline common_peg_parse_flags & operator |=(common_peg_parse_flags & a ,common_peg_parse_flags b ) { 157return a = a |b ; 158} 159 160inline common_peg_parse_flags operator & (common_peg_parse_flags a ,common_peg_parse_flags b ) { 161return static_cast < common_peg_parse_flags > (int (a )& int (b )); 162} 163 164inline common_peg_parse_flags operator ~(common_peg_parse_flags a ) { 165return static_cast < common_peg_parse_flags > (~int (a )); 166} 167 168struct common_peg_parse_context { 169std ::string input ; 170common_peg_parse_flags flags ; 171common_peg_ast_arena ast ; 172 173int parse_depth ; 174 175common_peg_parse_context (common_peg_parse_flags flags = COMMON_PEG_PARSE_FLAG_NONE ) 176 :flags (flags ),parse_depth (0 ) {} 177 178common_peg_parse_context (const std ::string & input ,common_peg_parse_flags flags = COMMON_PEG_PARSE_FLAG_NONE ) 179 :input (input ),flags (flags ),parse_depth (0 ) {} 180 181bool is_lenient ()const {return flags & COMMON_PEG_PARSE_FLAG_LENIENT ; } 182bool is_debug ()const {return flags & COMMON_PEG_PARSE_FLAG_DEBUG ; } 183}; 184 185class common_peg_arena ; 186 187// Parser variants 188struct common_peg_epsilon_parser {}; 189 190struct common_peg_start_parser {}; 191 192struct common_peg_end_parser {}; 193 194struct common_peg_literal_parser { 195std :: string literal ; 196}; 197 198struct common_peg_sequence_parser { 199std :: vector < common_peg_parser_id > children ; 200}; 201 202struct common_peg_choice_parser { 203std :: vector < common_peg_parser_id > children ; 204}; 205 206struct common_peg_repetition_parser { 207common_peg_parser_id child ; 208int min_count ; 209int max_count ; // -1 for unbounded 210}; 211 212struct common_peg_and_parser { 213common_peg_parser_id child ; 214}; 215 216struct common_peg_not_parser { 217common_peg_parser_id child ; 218}; 219 220struct common_peg_any_parser {}; 221 222struct common_peg_space_parser {}; 223 224struct common_peg_chars_parser { 225struct char_range { 226uint32_t start ; 227uint32_t end ; 228bool contains ( uint32_t codepoint) const { return codepoint >= start && codepoint <= end; } 229}; 230 231std :: string pattern ; 232std :: vector < char_range > ranges ; 233bool negated ; 234int min_count ; 235int max_count ; // -1 for unbounded 236}; 237 238struct common_peg_string_parser { 239char delimiter ; 240}; 241 242struct common_peg_until_parser { 243std :: vector < std ::string > delimiters; 244}; 245 246struct common_peg_schema_parser { 247common_peg_parser_id child ; 248std :: string name ; 249common_chat_schema_document_ptr doc ; // owns node 250const common_chat_schema * node = nullptr; 251 252// Indicates if the GBNF should accept a raw string that matches the schema. 253bool raw ; 254}; 255 256struct common_peg_rule_parser { 257std :: string name ; 258common_peg_parser_id child ; 259bool trigger ; 260}; 261 262struct common_peg_ref_parser { 263std :: string name ; 264}; 265 266struct common_peg_atomic_parser { 267common_peg_parser_id child ; 268}; 269 270struct common_peg_tag_parser { 271common_peg_parser_id child ; 272std :: string tag ; 273}; 274 275struct common_peg_gbnf_parser { 276common_peg_parser_id child ; 277std :: string grammar ; 278}; 279 280struct common_peg_ac_parser { 281common_peg_parser_id child ; 282std :: vector < std ::string > delimiters; 283}; 284 285// Variant holding all parser types 286using common_peg_parser_variant = std::variant < 287common_peg_epsilon_parser, 288common_peg_start_parser, 289common_peg_end_parser, 290common_peg_literal_parser, 291common_peg_sequence_parser, 292common_peg_choice_parser, 293common_peg_repetition_parser, 294common_peg_and_parser, 295common_peg_not_parser, 296common_peg_any_parser, 297common_peg_space_parser, 298common_peg_chars_parser, 299common_peg_string_parser, 300common_peg_until_parser, 301common_peg_schema_parser, 302common_peg_rule_parser, 303common_peg_ref_parser, 304common_peg_atomic_parser, 305common_peg_tag_parser, 306common_peg_gbnf_parser, 307common_peg_ac_parser 308> ; 309 310class common_peg_arena { 311std ::vector < common_peg_parser_variant > parsers_; 312std ::unordered_map < std::string, common_peg_parser_id > rules_; 313common_peg_parser_id root_ = COMMON_PEG_INVALID_PARSER_ID ; 314 315public : 316const common_peg_parser_variant & get ( common_peg_parser_id id) const { return parsers_. at ( id ); } 317common_peg_parser_variant & get (common_peg_parser_id id) { return parsers_. at (id); } 318 319size_t size () const { return parsers_. size (); } 320bool empty () const { return parsers_. empty (); } 321 322common_peg_parser_id get_rule ( const std ::string & name) const; 323bool has_rule ( const std ::string & name) const { return rules_. find (name) != rules_. end (); } 324 325common_peg_parser_id root () const { return root_; } 326void set_root ( common_peg_parser_id id) { root_ = id; } 327 328common_peg_parse_result parse ( common_peg_parse_context & ctx, size_t start = 0 ) const ; 329common_peg_parse_result parse ( common_peg_parser_id id, common_peg_parse_context & ctx, size_t start) const; 330 331void resolve_refs (); 332 333void build_grammar ( const common_grammar_builder & builder, bool lazy = false) const ; 334 335std :: string dump ( common_peg_parser_id id) const; 336 337common_json to_json () const ; 338static common_peg_arena from_json ( const common_json & j); 339 340std ::string save () const; 341void load ( const std ::string & data); 342 343friend class common_peg_parser_builder; 344 345private : 346std::string dump_impl ( common_peg_parser_id id, std ::set < common_peg_parser_id > & visited) const; 347 348common_peg_parser_id add_parser ( common_peg_parser_variant parser); 349void add_rule ( const std ::string & name, common_peg_parser_id id); 350 351common_peg_parser_id resolve_ref ( common_peg_parser_id id); 352}; 353 354class common_peg_parser_builder { 355common_peg_arena arena_; 356 357common_peg_parser wrap ( common_peg_parser_id id) { return common_peg_parser (id, * this); } 358common_peg_parser add ( const common_peg_parser_variant & p) { return wrap (arena_. add_parser (p)); } 359 360public : 361common_peg_parser_builder (); 362 363// Match nothing, always succeed. 364// S -> ε 365common_peg_parser eps () { return add (common_peg_epsilon_parser{}); } 366 367// Matches the start of the input. 368// S -> ^ 369common_peg_parser start () { return add (common_peg_start_parser{}); } 370 371// Matches the end of the input. 372// S -> $ 373common_peg_parser end () { return add (common_peg_end_parser{}); } 374 375// Matches an exact literal string. 376// S -> "hello" 377common_peg_parser literal ( const std ::string & literal) { return add (common_peg_literal_parser{literal}); } 378 379// Matches a sequence of parsers in order, all must succeed. 380// S -> A B C 381common_peg_parser sequence () { return add (common_peg_sequence_parser{}); } 382common_peg_parser sequence ( const std ::vector < common_peg_parser_id > & parsers); 383common_peg_parser sequence ( const std ::vector < common_peg_parser > & parsers); 384common_peg_parser sequence ( std ::initializer_list < common_peg_parser > parsers); 385 386// Matches the first parser that succeeds from a list of alternatives. 387// S -> A | B | C 388common_peg_parser choice () { return add (common_peg_choice_parser{}); } 389common_peg_parser choice ( const std ::vector < common_peg_parser_id > & parsers); 390common_peg_parser choice ( const std ::vector < common_peg_parser > & parsers); 391common_peg_parser choice ( std ::initializer_list < common_peg_parser > parsers); 392 393// Matches one or more repetitions of a parser. 394// S -> A+ 395common_peg_parser one_or_more ( const common_peg_parser & p) { return repeat (p, 1 , -1 ); } 396 397// Matches zero or more repetitions of a parser, always succeeds. 398// S -> A* 399common_peg_parser zero_or_more ( const common_peg_parser & p) { return repeat (p, 0 , -1 ); } 400 401// Matches zero or one occurrence of a parser, always succeeds. 402// S -> A? 403common_peg_parser optional ( const common_peg_parser & p) { return repeat (p, 0 , 1 ); } 404 405// Positive lookahead: succeeds if child parser succeeds, consumes no input. 406// S -> &A 407common_peg_parser peek ( const common_peg_parser & p) { return add (common_peg_and_parser{p}); } 408 409// Negative lookahead: succeeds if child parser fails, consumes no input. 410// S -> !A 411common_peg_parser negate ( const common_peg_parser & p) { return add (common_peg_not_parser{p}); } 412 413// Matches any single character. 414// S -> . 415common_peg_parser any () { return add (common_peg_any_parser{}); } 416 417// Matches between min and max repetitions of characters from a character class. 418// S -> [a-z]{m,n} 419// 420// Use -1 for max to represent unbounded repetition (equivalent to {m,}) 421common_peg_parser chars ( const std ::string & classes, int min = 1 , int max = -1 ); 422 423// Creates a lightweight reference to a named rule (resolved during build()). 424// Use this for forward references in recursive grammars. 425// expr_ref -> expr 426common_peg_parser ref ( const std ::string & name) { return add (common_peg_ref_parser{name}); } 427 428// Matches zero or more whitespace characters (space, tab, newline). 429// S -> [ \t\n]* 430common_peg_parser space () { return add (common_peg_space_parser{}); } 431 432// Matches all characters until a delimiter is found (delimiter not consumed). 433// S -> (!delim .)* 434common_peg_parser until ( const std ::string & delimiter) { return add (common_peg_until_parser{{delimiter}}); } 435 436// Matches all characters until one of the delimiters in the list is found (delimiter not consumed). 437// S -> (!delim .)* 438common_peg_parser until_one_of ( const std ::vector < std::string > & delimiters) { return add (common_peg_until_parser{delimiters}); } 439 440// Matches everything 441// S -> .* 442common_peg_parser rest () { return until_one_of ({}); } 443 444// Matches between min and max repetitions of a parser (inclusive). 445// S -> A{m,n} 446// Use -1 for max to represent unbounded repetition (equivalent to {m,}) 447common_peg_parser repeat ( const common_peg_parser & p, int min, int max) { return add (common_peg_repetition_parser{p, min,max}); } 448 449// Matches exactly n repetitions of a parser. 450// S -> A{n} 451common_peg_parser repeat ( const common_peg_parser & p, int n) { return repeat (p, n, n); } 452 453// Matches a double-quoted string: '"' content '"' space 454common_peg_parser double_quoted_string (); 455 456// Matches a single-quoted string: "'" content "'" space 457common_peg_parser single_quoted_string (); 458 459// Matches a string that accepts both double-quoted and single-quoted styles. 460common_peg_parser quoted_string (); 461 462// Matches string content without the surrounding delimiter. 463common_peg_parser string_content ( char delimiter); 464 465// Creates a complete JSON parser supporting objects, arrays, strings, numbers, booleans, and null. 466// value -> object | array | string | number | true | false | null 467common_peg_parser json (); 468common_peg_parser json_object (); 469common_peg_parser json_string (); 470common_peg_parser json_array (); 471common_peg_parser json_number (); 472common_peg_parser json_bool (); 473common_peg_parser json_null (); 474 475// Matches a JSON object member with a key and associated parser as the 476// value. 477common_peg_parser json_member ( const std ::string & key, const common_peg_parser & p); 478 479// Creates a complete Python format parser supporting dicts, arrays, strings, numbers, booleans, and None. 480// Differs from JSON: uses True/False/None, accepts both single and double-quoted strings. 481// value -> dict | array | string | number | True | False | None 482common_peg_parser python_value (); 483common_peg_parser python_dict (); 484common_peg_parser python_string (); 485common_peg_parser python_array (); 486common_peg_parser python_number (); 487common_peg_parser python_bool (); 488common_peg_parser python_null (); 489 490// A marker, i.e. text delimited by a pair of <> or [] 491common_peg_parser marker (); 492 493// Wraps a parser with the schema its GBNF is generated from, a node of the document that owns it 494common_peg_parser schema ( const common_peg_parser & p, const std ::string & name, common_chat_schema_document_ptr doc, const common_chat_schema & node, bool raw = false); 495 496// Parses the JSON schema into a document of its own 497common_peg_parser schema ( const common_peg_parser & p, const std ::string & name, const common_json & schema, bool raw = false); 498 499// Creates a named rule, stores it in the grammar, and returns a ref. 500// If trigger=true, marks this rule as an entry point for lazy grammar generation. 501// auto json = p.rule("json", json_obj | json_arr | ...) 502common_peg_parser rule ( const std ::string & name, const common_peg_parser & p, bool trigger = false); 503 504// Creates a named rule using a builder function, and returns a ref. 505// If trigger=true, marks this rule as an entry point for lazy grammar generation. 506// auto json = p.rule("json", [&]() { return json_object() | json_array() | ... }) 507common_peg_parser rule ( const std ::string & name, const std ::function < common_peg_parser () > & builder, bool trigger = false); 508 509// Creates a trigger rule. When generating a lazy grammar from the parser, 510// only trigger rules and descendents are emitted. 511common_peg_parser trigger_rule ( const std ::string & name, const common_peg_parser & p) { return rule (name, p, true); } 512common_peg_parser trigger_rule ( const std ::string & name, const std ::function < common_peg_parser () > & builder) { return rule (name, builder, true); } 513 514// Creates an atomic parser. Atomic parsers do not create an AST node if 515// the child results in a partial parse, i.e. NEEDS_MORE_INPUT. This is 516// intended for situations where partial output is undesirable. 517common_peg_parser atomic ( const common_peg_parser & p) { return add (common_peg_atomic_parser{p}); } 518 519// Tags create nodes in the generated AST for semantic purposes. 520// Unlike rules, you can tag multiple nodes with the same tag. 521common_peg_parser tag ( const std ::string & tag, const common_peg_parser & p) { return add (common_peg_tag_parser{p. id (), tag}); } 522 523// Wraps a child parser but emits a custom GBNF grammar string instead of 524// the child's grammar. Parsing delegates entirely to the child. 525common_peg_parser gbnf ( const common_peg_parser & p, const std ::string & grammar) { return add (common_peg_gbnf_parser{p, grammar}); } 526 527// Wraps a child parser but emits a GBNF grammar built from the Aho-Corasick 528// automaton of `delimiters`, matching everything up to and including the 529// first delimiter. Parsing delegates entirely to the child, which is 530// responsible for consuming the delimiter (e.g. until(D) + literal(D)). 531common_peg_parser ac ( const common_peg_parser & p, const std ::vector < std::string > & delimiters); 532common_peg_parser ac ( const common_peg_parser & p, const std ::string & delimiter) { return ac (p, std::vector < std::string > {delimiter}); } 533 534void set_root ( const common_peg_parser & p); 535 536common_peg_arena build (); 537}; 538 539// Helper function for building parsers 540common_peg_arena build_peg_parser ( const std ::function < common_peg_parser ( common_peg_parser_builder & builder) > & fn );