
    *i                     f   S r SSKJr  SSKJr  SSKJrJrJrJ	r	J
r
Jr  Sr " S S5      r SrS	rS
rS
rSrSrSr SSKrSSKrSSKJrJ	r	  Sr\R0                  " S5      r\R0                  " S5      rSSSS.rSr SGS jr " S S5      r\" SSS5      r\" S/ 5      \" S\-   / 5      \" S\-   / 5      \" SS S!/5      \" S"S /5      \" S#/ S$Q5      \" S%S&S'/5      \" S(S'/5      \" S)S*R?                  S+ S, 5       5      -   S--   / 5      \" S./ 5      \" S/S0/5      \" S1/ 5      S2.r \" S3/ 5      \" S4/ 5      \" S5S6S7/5      \" S8S6/5      \" S9S7/5      \" S:S;/5      S<.r!S=r"S>r#\$" SS?/\ RK                  5       Q\!RK                  5       Q5      r&\$" S@5      r'\$" SA5      r( " SB SC5      r)SHSD\*SE\	\\*      4SF jjr+g)IzPython implementation of llama grammar parser directly translated from C++ source file in vendor/llama.cpp/common/grammar-parser.cpp.    )Path)groupby)AnySetListOptionalTupleUnionrootc                       \ rS rSrS\4S jr\SS\S\SS 4S jj5       r\SS\	\\
4   S\SS 4S	 jj5       r\SS
\S\SS 4S jj5       rSrg)LlamaGrammar   _grammarc                &    Xl         [        U l        g N)r   LLAMA_GRAMMAR_DEFAULT_ROOT_root)selfr   argskwargss       U/var/www/html/ai-backend/venv/lib/python3.13/site-packages/llama_cpp/llama_grammar.py__init__LlamaGrammar.__init__   s     /
    grammarverbosereturnc                     U " US9$ )N)r    )clsr   r   s      r   from_stringLlamaGrammar.from_string   s    G$$r   filec                 J    [        U5       nUR                  5       nS S S 5        W(       a  U R                  XBS9$ [        U R                  R                   S35      e! , (       d  f       NF= f! [         a)  n[        U R                  R                   SU 35      eS nAff = f)Nz: error reading grammar file: r   z5: error parsing grammar file: params_grammer is empty)openread	Exception	from_file__name__r!   
ValueError)r    r#   r   fr   errs         r   r)   LlamaGrammar.from_file   s    	dq&&(  ??7?<<}}%%&&[\
 	
  	==))**HN 	s3   A/ AA/ 
A,(A/ ,A/ /
B"9$BB"json_schemac                 4    U R                  [        U5      US9$ )Nr%   )r!   json_schema_to_gbnf)r    r/   r   s      r   from_json_schemaLlamaGrammar.from_json_schema-   s    2;?QQr   )r   r   N)T)r*   
__module____qualname____firstlineno__strr   classmethodboolr!   r
   r   r)   r2   __static_attributes__r   r   r   r   r      s    0 0 %# % % % % 
U39- 
 
 
 
  R3 R R R Rr   r   z
root  ::= (expr "=" ws term "\n")+
expr  ::= term ([-+*/] term)*
term  ::= ident | num | "(" ws expr ")" ws
ident ::= [a-z] [a-z0-9_]* ws
num   ::= [0-9]+ ws
ws    ::= [ \t\n]*
ag  
root ::= (declaration)*

declaration ::= dataType identifier "(" parameter? ")" "{" statement* "}"

dataType  ::= "int" ws | "float" ws | "char" ws
identifier ::= [a-zA-Z_] [a-zA-Z_0-9]*

parameter ::= dataType identifier

statement ::=
    ( dataType identifier ws "=" ws expression ";" ) |
    ( identifier ws "=" ws expression ";" ) |
    ( identifier ws "(" argList? ")" ";" ) |
    ( "return" ws expression ";" ) |
    ( "while" "(" condition ")" "{" statement* "}" ) |
    ( "for" "(" forInit ";" ws condition ";" ws forUpdate ")" "{" statement* "}" ) |
    ( "if" "(" condition ")" "{" statement* "}" ("else" "{" statement* "}")? ) |
    ( singleLineComment ) |
    ( multiLineComment )

forInit ::= dataType identifier ws "=" ws expression | identifier ws "=" ws expression
forUpdate ::= identifier ws "=" ws expression

condition ::= expression relationOperator expression
relationOperator ::= ("<=" | "<" | "==" | "!=" | ">=" | ">")

expression ::= term (("+" | "-") term)*
term ::= factor(("*" | "/") factor)*

factor ::= identifier | number | unaryTerm | funcCall | parenExpression
unaryTerm ::= "-" factor
funcCall ::= identifier "(" argList? ")"
parenExpression ::= "(" ws expression ws ")"

argList ::= expression ("," ws expression)*

number ::= [0-9]+

singleLineComment ::= "//" [^\n]* "\n"
multiLineComment ::= "/*" ( [^*] | ("*" [^/]) )* "*/"

ws ::= ([ \t\n]+)
aT  
root   ::= object
value  ::= object | array | string | number | ("true" | "false" | "null") ws

object ::=
  "{" ws (
            string ":" ws value
    ("," ws string ":" ws value)*
  )? "}" ws

array  ::=
  "[" ws (
            value
    ("," ws value)*
  )? "]" ws

string ::=
  "\"" (
    [^"\\] |
    "\\" (["\\/bfnrt] | "u" [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F]) # escapes
  )* "\"" ws

number ::= ("-"? ([0-9] | [1-9] [0-9]*)) ("." [0-9]+)? ([eE] [-+]? [0-9]+)? ws

# Optional space: by convention, applied in this grammar after literal chars when allowed
ws ::= ([ \t\n] ws)?
a$  
# This is the same as json.gbnf but we restrict whitespaces at the end of the root array
# Useful for generating JSON arrays

root   ::= arr
value  ::= object | array | string | number | ("true" | "false" | "null") ws

arr  ::=
  "[\n" ws (
            value
    (",\n" ws value)*
  )? "]"

object ::=
  "{" ws (
            string ":" ws value
    ("," ws string ":" ws value)*
  )? "}" ws

array  ::=
  "[" ws (
            value
    ("," ws value)*
  )? "]" ws

string ::=
  "\"" (
    [^"\\\x7F\x00-\x1F] |
    "\\" (["\\/bfnrt] | "u" [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F]) # escapes
  )* "\"" ws

number ::= ("-"? ([0-9] | [1-9] [0-9]*)) ("." [0-9]+)? ([eE] [-+]? [0-9]+)? ws

# Optional space: by convention, applied in this grammar after literal chars when allowed
ws ::= ([ \t\n] ws)?
aZ  
root   ::= object
value  ::= object | array | string | number | ("true" | "false" | "null") ws

object ::=
  "{" ws (
            string ":" ws value
    ("," ws string ":" ws value)*
  )? "}" ws

array  ::=
  "[" ws (
            value
    ("," ws value)*
  )? "]" ws

string ::=
  "\"" (
    [^"\\\x7F\x00-\x1F] |
    "\\" (["\\bfnrt] | "u" [0-9a-fA-F]{4}) # escapes
  )* "\"" ws

number ::= ("-"? ([0-9] | [1-9] [0-9]{0,15})) ("." [0-9]+)? ([eE] [-+]? [0-9] [1-9]{0,15})? ws

# Optional space: by convention, applied in this grammar after literal chars when allowed
ws ::= | " " | "\n" [ \t]{0,20}
zn
root ::= item+

# Excludes various line break characters
item ::= "- " [^\r\n\x0b\x0c\x85\u2028\u2029]+ "\n"
N)r   r   z" "?z[^a-zA-Z0-9-]+z[\r\n"]z\rz\n\")
"c                   ^ ^^ T(       d  US:X  a  US:X  a  T  S3$ US:X  a  Uc  T  S3$ SnUS:  a;  U(       a  Tc  ST SS U-  -   S-   nO"T(       a  ST S3OSR                  T /U-  5      nSU UU4S	 jjmUS:  a
  X!:w  a  US-  nUb  UT" X!-
  US:  S
9-  nU$ ST(       a  TS-   OS T  S3nUS:X  a  T(       a  ST  SU S3nU$ XV S3-  nU$ )Nr      ?+ r>    c                    > U(       a  T(       a  T ST 3OTnU S:X  a  gU S:X  a  SU S3$ T(       a  U(       d  SU ST" U S-
  SS9 S3$ SU S3U -  R                  5       SU -  -   $ )	z
- n=4, no sep:             '(a (a (a (a)?)?)?)?'
- n=4, sep=',', prefix:    '("," a ("," a ("," a ("," a)?)?)?)?'
- n=4, sep=',', no prefix: '(a ("," a ("," a ("," a)?)?)?)?'
rE   r   rC   r@   ()?Tprefix_with_sep)rstrip)up_to_nrJ   content	item_ruleopt_repetitionsseparator_rules      r   rO   *_build_repetition.<locals>.opt_repetitions  s     > a	{+ 	
 a<\wir?"Owiq1d!S TTVWWyNW,446$.IIr   rI   rG   )z*)?*)F)join)rN   	min_items	max_itemsrP   item_rule_is_literalresultitem_operatorrO   s   `  `   @r   _build_repetitionrZ      s1    >i1n[?"!^	 1[?"F1}N$:IaOi783>F/=.)+3LLi'FJ J* 1}/#/)"7UVWW M NNS0KI;VWX>n1]O37F M q))FMr   c                   *    \ rS rSrSS\S\4S jjrSrg)BuiltinRulei6  NrM   depsc                 0    Xl         U=(       d    / U l        g r   rM   r]   )r   rM   r]   s      r   r   BuiltinRule.__init__7  s    JB	r   r_   r   )r*   r4   r5   r6   r7   listr   r:   r   r   r   r\   r\   6  s     4  r   r\   z[0-9]   z("true" | "false") spacez[0-9] z[0-9] | [1-9] zJ("-"? integral-part) ("." decimal-part)? ([eE] [-+]? integral-part)? spaceintegral-partdecimal-partz("-"? integral-part) spacez1object | array | string | number | boolean | null)objectarraystringnumberbooleannullzS"{" space ( string ":" space value ("," space string ":" space value)* )? "}" spacerg   valuez1"[" space ( value ("," space value)* )? "]" space"\"" z "-" c              #   ,   #    U  H
  nS U-  v   M     g7f)z[0-9a-fA-F]Nr   ).0ns     r   	<genexpr>rp   T  s     C2BQ}q(2Bs   )      rr   rr       "\"" spacezQ[^"\\] | "\\" (["\\/bfnrt] | "u" [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F])z"\"" char* "\"" spacecharz"null" space)ri   rd   rc   rh   integerrk   re   rf   uuidru   rg   rj   za[0-9] [0-9] [0-9] [0-9] "-" ( "0" [1-9] | "1" [0-2] ) "-" ( "0" [1-9] | [1-2] [0-9] | "3" [0-1] )z([01] [0-9] | "2" [0-3]) ":" [0-5] [0-9] ":" [0-5] [0-9] ( "." [0-9] [0-9] [0-9] )? ( "Z" | ( "+" | "-" ) ( [01] [0-9] | "2" [0-3] ) ":" [0-5] [0-9] )zdate "T" timedatetimez"\"" date "\"" spacez"\"" time "\"" spacez"\"" date-time "\"" space	date-time)rx   ry   rz   zdate-stringztime-stringzdate-time-stringz[\U00000000-\U0010FFFF]z[^\x0A\x0D]dotz|.()[]{}*+?z
[]()|{}*+?c            
           \ rS rSrS rS r SS\S\S\4S jjrS r	S	\
S
\4S jrS rS rS rS rS rS\S\4S jrS\\\\4      S\\   S\S\\\4   4S jrS rSrg)SchemaConverteri|  c                z    Xl         X l        X0l        X@l        S[        0U l        0 U l        [        5       U l        g )Nspace)	_prop_order_allow_fetch_dotall_raw_pattern
SPACE_RULE_rules_refsset_refs_being_resolved)r   
prop_orderallow_fetchdotallraw_patterns        r   r   SchemaConverter.__init__}  s:    %''Z
 
$'E!r   c                 <    [         R                  S U5      nSU S3$ )Nc                 J    [         R                  U R                  S5      5      $ Nr   )GRAMMAR_LITERAL_ESCAPESgetgroup)ms    r   <lambda>1SchemaConverter._format_literal.<locals>.<lambda>  s    -11!''!*=r   r>   )GRAMMAR_LITERAL_ESCAPE_REsub)r   literalescapeds      r   _format_literalSchemaConverter._format_literal  s'    +//=w
 7)1~r   r   r   r   c                    ^ ^^^ [        T5      S:  d   S5       eS[        4UUUU 4S jjmSR                  S/T" S5      QSP75      $ )zX
not_literal('a') -> '[^a]'
not_literal('abc') -> '([^a] | "a" ([^b] | "b" ([^c])?)?)?'
r   zEmpty literal not supportedic              3      >#    TU    nT(       a  US:X  a  SU S3v   Sv   SU S3v   OSU S3v   U [        T5      S-
  :  a3  Sv   TR                  U5      v   S	v   T" U S-   5       S h  vN   S
v   g g  N
7f)N_z[^z\\] | z"\\"? "r>   ]r@    (rH   )lenr   )r   cr   maybe_escaped_underscoresrecurser   s     r   r   ,SchemaConverter.not_literal.<locals>.recurse  s     
A(Q#X1#Um#!!A&&1#Qi3w<!##**1--
"1q5>))
 $ *s   A+A;.A9/A;rC   rG   rR   )r   intrT   )r   r   r   r   r   s   `` `@r   not_literalSchemaConverter.not_literal  sP     7|a>!>>	s 	 	 ww.gaj.#.//r   c                 b   [         R                  SU5      nX0R                  ;  d  U R                  U   U:X  a  UnOeSnU U 3U R                  ;   aI  U R                  U U 3   U:w  a2  US-  nU U 3U R                  ;   a  U R                  U U 3   U:w  a  M2  U U 3nX R                  U'   U$ )N-r   r@   )INVALID_RULE_CHARS_REr   r   )r   nameruleesc_namekeyr   s         r   	_add_ruleSchemaConverter._add_rule  s    (,,S$7;;&$++h*?4*GCA*QC DKK/KK8*QC 01T9Q *QC DKK/KK8*QC 01T9 Jqc"CC
r   schemaurlc                 <   ^ ^^^ S[         4UU UU4S jjmT" T5      $ )z
Resolves all $ref fields in the given schema, fetching any remote schemas,
replacing $ref with absolute reference URL and populating self._refs with the
respective referenced (sub)schema dictionaries.
ro   c                   > [        U [        5      (       a  U  Vs/ s H  nT" U5      PM     sn$ [        U [        5      (       Ga  U R                  S5      nUGb[  UT
R                  ;  GaJ  UR                  S5      (       a  T
R                  (       d   S5       eSS KnUR                  S5      nUS   nT
R                  R                  U5      nUc>  T
R                  UR                  U5      R                  5       U5      nUT
R                  U'   [        U5      S:X  d	  US   S:X  a  U$ O1UR                  S	5      (       a  T	nT U 3nX S'   O[        S
U 35      eUR                  S5      S   R                  S5      SS   H  nUb  Xv;   d   SU SU SU 35       eXg   nM!     UT
R                  U'   U $ U R                  5        H  nT" U5        M     U $ s  snf )N$refzhttps://zDFetching remote schemas is not allowed (use --allow-fetch for force)r   #r@   rD   rC   z#/zUnsupported ref /zError resolving ref z: z not in )
isinstancera   dictr   r   
startswithr   requestssplitresolve_refsjsonr   r+   values)ro   xrefr   
frag_splitbase_urltargetselvr   r   r   visits            r   r   +SchemaConverter.resolve_refs.<locals>.visit  s   !T""*+,!Qa!,,At$$eeFm?s$**'<~~j11 --bab-'%(YYs^
#-a=!%!9!>%)%6%6 (S 1 6 6 8(&F 4:DJJx0z?a/:b>R3G#)M 4H--!'!$cUm$'&	(+;C5)ABB"yy~b177<QR@".3=O1#bXfXNO@!'	  A '-DJJsO
 H XXZa ( HQ -s   G)r   )r   r   r   r   s   ```@r   r   SchemaConverter.resolve_refs  s!    *	T *	 *	X V}r   c                 P   ^ ^ SR                  UU 4S j[        U5       5       5      $ )Nr   c              3   j   >#    U  H(  u  pTR                  UT T(       a  S OS U 35      v   M*     g7f)r   zalternative-Nr   )rn   r   
alt_schemar   r   s      r   rp   7SchemaConverter._generate_union_rule.<locals>.<genexpr>  s<      %;MA 

:$t/PQRPS'TUU%;s   03)rT   	enumerate)r   r   alt_schemass   `` r   _generate_union_rule$SchemaConverter._generate_union_rule  s&    zz%.{%;
 	
r   c           	        ^ ^^^^^^^ TR                  S5      (       a  TR                  S5      (       d   S5       eTSS m0 mSm[        T5      mS[        [        [
        4   S[        4S	 jmS[        [        [
        4   4UUUUU UUU4S
 jjmT R                  TT R                  (       a  T" T" 5       5      5      $ ST" T" 5       5      -   S-   5      $ )a  
Transforms a regular expression pattern into a GBNF rule.

Input: https://json-schema.org/understanding-json-schema/reference/regular_expressions
Output: https://github.com/ggerganov/llama.cpp/blob/master/grammars/README.md

Unsupported features: negative/positive lookaheads, greedy/non-greedy modifiers.

Mostly a 1:1 translation, except for {x} / {x,} / {x,y} quantifiers for which
we define sub-rules to keep the output lean.
^$z,Pattern must start with "^" and end with "$"r@   rD   r   sr   c                 ,    U u  pU(       a  SU-   S-   $ U$ )Nr>   r   )r   txt
is_literals      r   to_rule/SchemaConverter._visit_pattern.<locals>.to_rule
  s     !S&039s?9c9r   c                    >^ Tn / mU4S jnUU4S jnTT:  Ga  TT   nUS:X  a  TR                  U" 5       S45        TS-  mGOUS:X  aL  TS-  mTT:  a  TT   S:w  d   STT    S	T S
T S35       eTR                  ST" T" 5       5       S3S45        GO;US:X  a.  TS-  mU S:  a  TU S-
     S:X  d   SU  ST ST 35       eU" 5       $ US:X  a  UnTS-  mTT:  aA  TT   S:w  a8  TT   S:X  a  UTTTS-    -  nTS-  mOUTT   -  nTS-  mTT:  a  TT   S:w  a  M8  TT:  d   SU  ST ST 35       eUS-  nTS-  mTR                  US45        GO~US:X  a  TR                  S5        TS-  mGO`US;   a  T" TS   5      U-   S4TS'   TS-  mGO@US:X  Ga[  UnTS-  mTT:  a'  TT   S:w  a  UTT   -  nTS-  mTT:  a  TT   S:w  a  M  TT:  d   SU  ST ST 35       eUS-  nTS-  mUSS R                  S5       Vs/ s H  ofR                  5       PM     nnSnSn	 [        U5      S:X  a  [	        US   5      nUn	OF[        U5      S:X  d   eUS   (       a  [	        US   5      OSnUS   (       a  [	        US   5      OSn	 TS   u  pU(       d>  TR                  U
5      nUc(  TR                  T S![        T5      S-    3U
5      nUTU
'   Un
[        U(       a  S"U
 S"3OU
UU	US#9S4TS'   OS$nTT:  a  TT   S:X  a?  TTS-
  :  a6  TTS-      nU[        ;   a  TS-  mUTT   -  nTS-  mO}UTTTS-    -  nTS-  mOlTT   S":X  a  TR                  (       d  US%-  nTS-  mOGTT   [        ;  a9  TTS-
  :X  d"  US$:X  d  TTS-      S:X  d  TTS-      [        ;  a  UTT   -  nTS-  mOOTT:  a  M  U(       a  TR                  US&45        TT:  a  GM  U" 5       $ s  snf ! [
         a    [        SU S T S35      ef = f)'zh
Parse a unit at index i (advancing it), and return its string representation + whether it's a literal.
c                  d   > TR                   (       a  [        n O[        n TR                  SU 5      $ )Nr{   )r   DOTALLDOTr   )r   r   s    r   get_dotBSchemaConverter._visit_pattern.<locals>.transform.<locals>.get_dot  s'    <<!D D~~d33r   c                    > / n [        TS 5       HH  u  pU(       a+  U R                  SR                  S U 5       5      S45        M7  U R                  U5        MJ     [	        U 5      S:X  a  U S   $ SR                  U4S jT 5       5      S	4$ )
Nc                     U S   $ )Nr@   r   )r   s    r   r   USchemaConverter._visit_pattern.<locals>.transform.<locals>.join_seq.<locals>.<lambda>(  s    AaDr   rC   c              3   *   #    U  H	  oS    v   M     g7f)r   Nr   )rn   r   s     r   rp   VSchemaConverter._visit_pattern.<locals>.transform.<locals>.join_seq.<locals>.<genexpr>*  s     +<!QaD!s   Tr@   r   rE   c              3   4   >#    U  H  nT" U5      v   M     g 7fr   r   )rn   r   r   s     r   rp   r   /  s      9SSs   F)r   appendrT   extendr   )retr   gseqr   s      r   join_seqCSchemaConverter._visit_pattern.<locals>.transform.<locals>.join_seq%  sz    %,S.%AMJ!

BGG+<!+<$<d#CD

1	 &B
 s8q=q6M 9S 995AAr   .Fr@   rG   rA   zUnsupported pattern syntax "z" at index z of /r   rR   r   z Unbalanced parentheses; start = z, i = z, pattern = [r   \   z$Unbalanced square brackets; start = |)r   F)rS   rB   rA   rD   {}z#Unbalanced curly brackets; start = ,NzInvalid quantifier z in /r   r>   )rW   rC   r;   T)r   r   stripr   r   r+   r   r   rZ   &ESCAPED_IN_REGEXPS_BUT_NOT_IN_LITERALSr   NON_LITERAL_SET)startr   r   r   square_bracketscurly_bracketsr   nums	min_times	max_timesr   sub_is_literalidr   nextr   r   lengthr   patternr   sub_rule_idsr   	transforms                  @r   r
  1SchemaConverter._visit_pattern.<locals>.transform  sM    E
 +-C4
B f*AJ8JJ	512FA#XFA6z#AJ#-d9'!*[QRPSSXY`Xaabcd-JJ!GIK$8#9 ;UCD#XFA	geai&8C&?`9%qcV]U^_`?#:%#X&'OFAf*s):"1:-+wq1q5/AAOFA+wqz9OFA f*s): F
d=eWF1#\ZaYbcd"#s*OFAJJ78#XJJ|,FA/)&s2w/!3U;CGFA#X%&NFAf*s):&'!*4Q f*s): F
c<UG6!LY`Xabc""c)NFA/=a/C/I/I#/NO/N!GGI/NDO !I $It9>(+DGI(1I#&t9>1>8<QDGQI8<QDGTI -0G)S))--c2:!%4&#l:Ka:O9P0QSV!WB02L-  **8auAJc%%1?	 CG !Gf*"1:-!fqj.#*1q5>D#'MM !Q '71: 5 !Q '71q1u+= = !Q$QZ3.t7H7H#u,GFA$QZ>!O&"}&q1u~4&q1u~_D#wqz1GFA!- f*. 

GT?3_ f*b :} P & (1.1AwiqQ s   O"#O' AO' 'Prl   rt   )r   endswithr   r	   r7   r9   r   r   )r   r  r   r   r  r	  r   r
  s   ```@@@@@r   _visit_patternSchemaConverter._visit_pattern  s     !!#&&7+;+;,
 ,
 	:9	: 
 !B-W	:uS$Y' 	:C 	:T	5d+ T	 T	l ~~ $$ 	$
 	

 	 44~E
 	
r   c                    UR                  S5      S   nX R                  ;  ae  XR                  ;  aV  U R                  R                  U5        U R                  U   nU R                  X25      nU R                  R                  U5        U$ )Nr   rD   )r   r   r   addr   r   remove)r   r   ref_nameresolveds       r   _resolve_refSchemaConverter._resolve_ref  sq    99S>"%;;&36O6O+O%%))#.zz#Hzz(5H%%,,S1r   c                 L    U R                  [        R                  " U5      5      $ r   )r   r   dumps)r   rk   s     r   _generate_constant_rule'SchemaConverter._generate_constant_rule  s    ##DJJu$566r   c                 	  ^ ^^^ UR                  S5      nUR                  S5      nT[        ;   a  TS-   O
T=(       d    SnUR                  S5      =nb!  T R                  UT R                  U5      5      $ SU;   d  SU;   a=  T R                  UT R	                  TUR                  S5      =(       d    US   5      5      $ [        U[        5      (       a5  T R                  UT R	                  TU Vs/ s H  nSU0PM	     sn5      5      $ SU;   a$  T R                  UT R                  US   5      5      $ S	U;   a/  S
R                  U 4S jUS	    5       5      nT R                  XX5      $ US;   a  SU;   d  SU;   a  US   SLaw  [        UR                  S/ 5      5      m[        UR                  S0 5      R                  5       5      mT R                  UT R                  TTTUR                  S5      5      5      $ US;   al  SU;   af  [        5       m/ mTn	UUU 4S jn
US    H%  nSU;   a  US    H
  nU
" USS9  M     M  U
" USS9  M'     T R                  UT R                  TTU	/ S95      $ US;   a  SU;   d  SU;   a  UR                  S5      =(       d    US   n[        U[        5      (       a;  T R                  USSR                  UU 4S j[        U5       5       5      -   S-   5      $ T R                  UT T(       a  SOS S35      nUR                  SS 5      nUR                  S!5      nT R                  US[        XUS"S#9-   S-   5      $ US$;   a  S%U;   a  T R                  US%   U5      $ US$;   aF  [         R"                  " S&U=(       d    S5      (       a!  T R%                  US:X  a  SOU[&        S'   5      $ US$;   a;  U S(3[(        ;   a.  U S(3nT R                  UT R%                  U[(        U   5      5      $ US):X  ak  S*U;   d  S+U;   a_  T R%                  S,[&        S,   5      nUR                  S*S 5      nUR                  S+5      nT R                  US-[        UUU5      -   S.-   5      $ US/:X  d  [+        U5      S :X  a)  T R                  UT R%                  S/[&        S/   5      5      $ U[&        ;   d
   S0U 35       eT R%                  US:X  a  SOU[&        U   5      $ s  snf )1Ntypeformatr   r   r   oneOfanyOfconstenumr   c              3   F   >#    U  H  nTR                  U5      v   M     g 7fr   )r  )rn   r   r   s     r   rp   (SchemaConverter.visit.<locals>.<genexpr>  s     W1t;;A>>s   !)Nre   
propertiesadditionalPropertiesTrequiredallOfc                    > U R                  S5      =nb  TR                  U   n SU ;   aI  U S   R                  5        H1  u  p4TR                  X445        U(       d  M   TR	                  U5        M3     g g )Nr   r#  )r   r   itemsr   r  )comp_schemais_requiredr   	prop_nameprop_schemar#  r%  r   s        r   add_component,SchemaConverter.visit.<locals>.add_component  so    &??622C?"&**S/K;.2=l2K2Q2Q2S.	"))9*BC&;$LL3 3T /r   F)r*  )additional_properties)Nrf   r(  prefixItemsz
"[" space  "," space c              3   l   >#    U  H)  u  pTR                  UT T(       a  S OS SU 35      v   M+     g7f)r   rC   ztuple-Nr   )rn   r   itemr   r   s      r   rp   r"    s<      )'7GA 

4D6#21FfQC)PQQ'7s   14z
 "]" spacerC   r3  minItemsr   maxItemsz	"," space)rP   )Nrg   r  z^uuid[1-5]?$rw   z-stringrg   	minLength	maxLengthru   rl   rt   re   zUnrecognized schema: )r   RESERVED_NAMESr   r  r   r   ra   r  rT   r   r(  _build_object_ruler   r   rZ   r  rematch_add_primitivePRIMITIVE_RULESSTRING_FORMAT_RULESr   )r   r   r   schema_typeschema_format	rule_namer   tr   hybrid_namer-  ttr(  item_rule_namerU   rV   	prim_name	char_rulemin_lenmax_lenr#  r%  s   ` `                 @@r   r   SchemaConverter.visit  s>   jj(

8,"&."8D3Jdnf	::f%%C2>>)T->->s-CDD'V"3>>))$

70C0VvgW 
 T**>>))$k0Rk&!k0RS 
 >>477wH  v::WvWXD>>)22,,F"&&012$> 6::j"56Hfjjr:@@BCJ>>''$

;Q0R  ,,F1BuHJK4 G_a<j%be< ) "!6 % >>''+R (   O+v&!8JJw'@6-+@E%&&~~ #(( )'0'7) 
 ##  "&EdV4CR;PPT3U!V"JJz15	"JJz2	~~ '&9[ #	#  ,,f1D&&vi'8)DD,,]0b2
 2
 &&#v-='  ++ /)-@@(/1I>>##I/B9/MN 
 H$6![F%:++FOF4KLIjja0Gjj-G>>#Iw@A !  X%3v;!+;>>4..x9RS 
 /1S5J6(3SS1&&#v-;,  1Ss   0S r   r   c                 ,   U R                  XR                  5      nUR                   Hh  n[        R	                  U5      =(       d    [
        R	                  U5      nU(       d   SU S35       eX@R                  ;  d  MW  U R                  XE5        Mj     U$ )NzRule z
 not known)r   rM   r]   r=  r   r>  r   r<  )r   r   r   ro   depdep_rules         r   r<  SchemaConverter._add_primitiveN  sx    NN4.99C&**3/O3F3J3J33OH4uSE448++%##C2	 
 r   r#  r%  r/  c           	      .  ^ ^^^^^ T R                   m[        [        U5      U4S jS9 VVs/ s H
  u  pVUS   PM     nnn0 mU Hs  u  pT R                  U	T T(       a  SOS U 35      n
T R	                  T T(       a  SOS U S3T R                  [        R                  " U5      5       SU
 35      TU'   Mu     U Vs/ s H  oU;   d  M
  UPM     nnU Vs/ s H  oU;  d  M
  UPM     snmUS:X  d  [        U[        5      (       as  T T(       a  SOS S	3nT R                  US:X  a  0 OUU S
35      nT R	                  U S3T R                  S[        S   5      SU 3-   5      TS'   TR                  S5        SnUSR                  U4S jU 5       5      -  nT(       a\  US-  nU(       a  US-  nUUUU 4S jmUSR                  UU4S j[        [        T5      5       5       5      -  nU(       a  US-  nUS-  nUS-  nU$ s  snnf s  snf s  snf )Nc                 P   > TR                  U S   S   [        T5      5      U S   4$ )Nr@   r   )r   r   )ikvr   s    r   r   4SchemaConverter._build_object_rule.<locals>.<lambda>e  s&    Aq	3z?!KSQRV Tr   r   r   r   rC   z-kvz space ":" space T
additionalz-valuerg   z ":" space rS   z
"{" space r1  c              3   .   >#    U  H
  nTU   v   M     g 7fr   r   )rn   kprop_kv_rule_namess     r   rp   5SchemaConverter._build_object_rule.<locals>.<genexpr>  s     "Q.Q#5a#8.s   r   z "," space ( c           
        > U tp#TU   nUS:X  a*  T	R                  T T(       a  SOS S3U S3U-   S-   5      nOU(       a  SU S3nOUn[        U5      S	:  a-  US
T	R                  T T(       a  SOS U S3T" USS95      -   -  nU$ )NrS   r   rC   zadditional-kvsz ( "," space z )*z( "," space  )?r   rE   z-restTfirst_is_optional)r   r   )
ksr\  rV  restkv_rule_nameresget_recursive_refsr   rW  r   s
         r   ra  >SchemaConverter._build_object_rule.<locals>.get_recursive_refs  s    
1!48..&" 5^D'.6EMC '(c:C&Ct9q=3&" 5aS>*44H"  C 
r   r   c              3   8   >#    U  H  nT" TUS  SS9v   M     g 7f)NFr[  r   )rn   r   ra  optional_propss     r   rp   rX    s&      3A #>!"#5O3s   z )rZ  z
 "}" space)r   sortedr   r   r   r   r   r  r   r   r<  r=  r   rT   ranger   )r   r#  r%  r   r/  r   kvsorted_propsr+  r,  prop_rule_namerV  required_propssub_name
value_ruler   ra  rd  rW  r   s   `  `            @@@@r   r9  "SchemaConverter._build_object_ruleX  sU    %%
  *%T
 qE 	 
  &0"I!ZZvTcr%:9+FN -1NN&"-i[<((I)>?@@QR`Qab-y)	 '1 &2C\(]!\C%1G\h5F!\G D(J7Ld,S,St4J?H+t39N*F#J '+nn*C ##Hoh.GH
|,-'s#
 !!#&"""Q."QQQDLD' & EJJ s>23  D EMDM
" DGs   H 	HH	H&Hc                 t    SR                  S [        U R                  R                  5       S S9 5       5      $ )Nr=   c              3   4   #    U  H  u  pU S U 3v   M     g7f)z ::= Nr   )rn   r   r   s      r   rp   1SchemaConverter.format_grammar.<locals>.<genexpr>  s$      
O
 fE$ Os   c                     U S   $ r   r   )rg  s    r   r   0SchemaConverter.format_grammar.<locals>.<lambda>  s    Ar   rS  )rT   re  r   r(  )r   s    r   format_grammarSchemaConverter.format_grammar  s5    yy 
$T[[%6%6%8>NO
 
 	
r   )r   r   r   r   r   r   r   N)TF)r*   r4   r5   r6   r   r   r7   r9   r   r   r   r   r   r  r  r  r   r\   r<  r   r	   r   r   r
   r9  rs  r:   r   r   r   r}   r}   |  s    	* LQ00$(0	0434 3c 3j
w
r7Sj3 k OsCx)O c(O 	O
  %T3Y/Ob
r   r}   r   r   c                    U=(       d    / n[         R                  " U 5      n [        U5       VVs0 s H  u  p#X2_M	     nnn[        USSSS9nUR	                  U S5      n UR                  U S5        UR                  5       $ s  snnf )NF)r   r   r   r   stdinrC   )r   loadsr   r}   r   r   rs  )r   r   idxr   	converters        r   r1   r1     s    !rJZZF-6z-BC-B	$)-BJC5EI ##FG4FOOFB##%% Ds   B)NFr   ),__doc__pathlibr   	itertoolsr   typingr   r   r   r   r	   r
   r   r   ARITHMETIC_GBNFC_GBNF
CHESS_GBNFJAPANESE_GBNFJSON_ARR_GBNF	JSON_GBNF	LIST_GBNFr   r:  r   compiler   r   r   rZ   r\   _up_to_15_digitsrT   r=  r>  r   r   r   keysr8  r   r   r}   r7   r1   r   r   r   <module>r     s   L    $ R R> :+
Z
88#L	8	 j  	 ! 
 

#45 JJz2 !&e%@  
 PU5p  %Wa4  5r:+; ;R@ !14D!DbIT	.) 7/9JK;B ]	7 ;gY 
,,C2BC
C	D
	 		 \
 2VH=+? H k
  	a
 _vv.>?7&B7&B#$AK=Q  
%UI_))+I.A.F.F.HI
 m$),\): &q
 q
h	& 	&$s)1D 	&r   