
     sg                     `   d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
mZ dZ G d d      Z	 dZd	Zd
Zd
ZdZdZdZ	 ddlZddlZddlmZm	Z	 dZ ej0                  d      Z ej0                  d      ZddddZdZ	 dGdZ G d d      Z eddd      Z edg        edez   g        edez   g        edd d!g       ed"d g       ed#g d$       ed%d&d'g       ed(d'g       ed)d*j?                  d+ d,D              z   d-z   g        ed.g        ed/d0g       ed1g       d2Z  ed3g        ed4g        ed5d6d7g       ed8d6g       ed9d7g       ed:d;g      d<Z!d=Z"d>Z# e$dd?ge jK                         e!jK                               Z& e$d@      Z' e$dA      Z( G dB dC      Z)dHdDe*dEe	ee*      fdFZ+y)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                       e Zd ZdefdZeddededd fd       Zeddeee	f   dedd fd       Z
edd	ededd fd
       Zy)LlamaGrammar_grammarc                (    || _         t        | _        y N)r   LLAMA_GRAMMAR_DEFAULT_ROOT_root)selfr   argskwargss       J/var/www/html/venv/lib/python3.12/site-packages/llama_cpp/llama_grammar.py__init__zLlamaGrammar.__init__   s     /
    grammarverbosereturnc                      | |      S )N)r    )clsr   r   s      r   from_stringzLlamaGrammar.from_string   s    G$$r   filec                 <   	 t        |      5 }|j                         }d d d        r| j                  ||      S t        | j                  j                   d      # 1 sw Y   @xY w# t        $ r)}t        | j                  j                   d|       d }~ww xY w)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&   zLlamaGrammar.from_file   s    	d #q&&(# ??7G?<<}}%%&&[\
 	
# # 	==))**HN 	s-   A) AA) A&"A) )	B2$BBjson_schemac                 :    | j                  t        |      |      S )Nr"   )r   json_schema_to_gbnf)r   r+   r   s      r   from_json_schemazLlamaGrammar.from_json_schema-   s    2;?QQr   N)T)r'   
__module____qualname__strr   classmethodboolr   r
   r   r&   r.   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                 b    s|dk(  r
|dk(  r  dS |dk(  r|  dS d}|dkD  r0|rd dd |z  z   dz   }nrd dndj                   g|z        }d fd		|dkD  r
||k7  r|dz  }|| ||z
  |dkD  
      z  }|S drdz   nd   d}|dk(  rrd  d| d}|S || dz  }|S )Nr      ?+ r7    c                     |r	r d n}| dk(  ry| dk(  rd| dS r|sd| d | dz
  d       dS d| d| z  j                         d| z  z   S )	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)?)?)?)?'
        r>   r   r<   r9   ()?Tprefix_with_sep)rstrip)up_to_nrC   content	item_ruleopt_repetitionsseparator_rules      r   rH   z*_build_repetition.<locals>.opt_repetitions  s     > a	{+ 	
 a<\wir?"Owiq1d!S TTVWWyNW,446$.IIr   rB   r@   )z*)?*)F)join)rG   	min_items	max_itemsrI   item_rule_is_literalresultitem_operatorrH   s   `  `   @r   _build_repetitionrR      s1    >i1n[?"!^	 1[?"F1}N$:IaOi783>F/=.)+3LLi'FJ* 1}i/#/)i"7UVWW M NNS0KI;VWX>n1]O37F M q))FMr   c                       e Zd ZddedefdZy)BuiltinRuleNrF   depsc                 (    || _         |xs g | _        y r   )rF   rU   )r   rF   rU   s      r   r   zBuiltinRule.__init__7  s    JB	r   r   )r'   r/   r0   r1   listr   r   r   r   rT   rT   6  s     4 r   rT   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)* )? "}" spacer]   valuez1"[" space ( value ("," space value)* )? "]" space"\"" z "-" c              #   &   K   | ]	  }d |z    yw)z[0-9a-fA-F]Nr   ).0ns     r   	<genexpr>rf   T  s     CQ}q(C   )      ri   ri       "\"" 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)r_   rZ   rY   r^   integerra   r[   r\   uuidrl   r]   r`   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)ro   rp   rq   zdate-stringztime-stringzdate-time-stringz[\U00000000-\U0010FFFF]z[^\x0A\x0D]dotz|.()[]{}*+?z
[]()|{}*+?c            
           e Zd Zd Zd Z	 ddededefdZd Zde	d	efd
Z
d Zd Zd Zd Zd ZdedefdZdeeeef      dee   dedeeef   fdZd Zy)SchemaConverterc                    || _         || _        || _        || _        dt        i| _        i | _        t               | _        y )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   zSchemaConverter.__init__}  sB    %''Z
 
$'E!r   c                 <    t         j                  d |      }d| dS )Nc                 J    t         j                  | j                  d            S Nr   )GRAMMAR_LITERAL_ESCAPESgetgroup)ms    r   <lambda>z1SchemaConverter._format_literal.<locals>.<lambda>  s    -11!''!*= r   r7   )GRAMMAR_LITERAL_ESCAPE_REsub)r   literalescapeds      r   _format_literalzSchemaConverter._format_literal  s'    +//=w
 7)1~r   r   r   r   c                      t              dkD  sJ d       dt        f fddj                  dg d      d      S )zp
        not_literal('a') -> '[^a]'
        not_literal('abc') -> '([^a] | "a" ([^b] | "b" ([^c])?)?)?'
        r   zEmpty literal not supportedic              3      K   |    }r|dk(  rd| d d d| d nd| d | t              dz
  k  r3d j                  |       d	  | dz         E d {    d
 y y 7 
w)N_z[^z\\] | z"\\"? "r7   ]r9    (rA   )lenr   )r   cr   maybe_escaped_underscoresrecurser   s     r   r   z,SchemaConverter.not_literal.<locals>.recurse  s     
A(Q#X1#Um#!!A&&1#Qi3w<!##**1--
"1q5>))
 $ *s   A$A4'A2(A4r<   r@   rJ   )r   intrL   )r   r   r   r   r   s   `` `@r   not_literalzSchemaConverter.not_literal  sP     7|a>!>>	s 	 	 ww.gaj.#.//r   c                 R   t         j                  d|      }|| j                  vs| j                  |   |k(  r|}n^d}| | | j                  v rD| j                  | |    |k7  r.|dz  }| | | j                  v r| j                  | |    |k7  r.| | }|| j                  |<   |S )N-r   r9   )INVALID_RULE_CHARS_REr   r|   )r   nameruleesc_namekeyr   s         r   	_add_rulezSchemaConverter._add_rule  s    (,,S$74;;&$++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                 8     dt         f fd       S )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.
        re   c                 j   t        | t              r| D cg c]
  } |       c}S t        | t              ru| j                  d      }|D|
j                  vr5|j                  d      r
j                  sJ d       dd l}|j                  d      }|d   }
j                  j                  |      }|>
j                  |j                  |      j                         |      }|
j                  |<   t        |      dk(  s|d   dk(  r/|S |j                  d	      r	} | }|| d<   nt        d
|       |j                  d      d   j                  d      dd  D ]  }|||v sJ d| d| d|        ||   } |
j                  |<   | S | j                         D ]
  } |        | S c c}w )N$refzhttps://zDFetching remote schemas is not allowed (use --allow-fetch for force)r   #r9   r=   r<   z#/zUnsupported ref /zError resolving ref z: z not in )
isinstancerW   dictr   r}   
startswithrx   requestssplitresolve_refsjsonr   r(   values)re   xrefr   
frag_splitbase_urltargetselvr   r   r   visits            r   r   z+SchemaConverter.resolve_refs.<locals>.visit  s   !T"*+,Qa,,At$eeFm?s$**'<~~j1 --bab-'%(YYs^
#-a=!%!9!>%)%6%6 (S 1 6 6 8(&F 4:DJJx0z?a/:b>R3G#)M-!'!$cUm$'&	(+;C5)ABB"yy~b177<QR@ -".3&=O1#bXfXNO@!'	- '-DJJsO
 H XXZ !a! HQ -s   F0)r   )r   r   r   r   s   ```@r   r   zSchemaConverter.resolve_refs  s!    *	T *	 *	X V}r   c                 N     dj                   fdt        |      D              S )Nr   c              3   \   K   | ]#  \  }}j                  | rd nd |        % yw)r   zalternative-Nr   )rd   r   
alt_schemar   r   s      r   rf   z7SchemaConverter._generate_union_rule.<locals>.<genexpr>  s<      !Az 

:$t/PQRPS'TUs   ),)rL   	enumerate)r   r   alt_schemass   `` r   _generate_union_rulez$SchemaConverter._generate_union_rule  s&    zz%.{%;
 	
r   c           	          j                  d      rj                  d      sJ d       dd i dt              dt        t        t
        f   dt        fd	dt        t        t
        f   f fd
 j                   j                  r                     S d               z   dz         S )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 "$"r9   r=   r   sr   c                 $    | \  }}|rd|z   dz   S |S )Nr7   r   )r   txt
is_literals      r   to_rulez/SchemaConverter._visit_pattern.<locals>.to_rule
  s!     !S*&039s?9c9r   c                  r   } g fd}fd}k  rv   }|dk(  rj                   |       df       dz  nF|dk(  rJdz  k  r   dk7  sJ d    d	 d
 d       j                  d                ddf       n|dk(  r,dz  | dkD  r| dz
     dk(  sJ d|  d d         |       S |dk(  r||}dz  k  r<   dk7  r4   dk(  r|dz    z  }dz  n|   z  }dz  k  r	   dk7  r4k  sJ d|  d d        |dz  }dz  j                  |df       nE|dk(  rj                  d       dz  n(|dv r d         |z   dfd<   dz  n
|dk(  r?|}dz  k  r#   dk7  r|   z  }dz  k  r	   dk7  rk  sJ d|  d d        |dz  }dz  |dd j                  d      D cg c]  }|j                          }}d}d}		 t        |      dk(  rt	        |d         }|}	n:t        |      dk(  sJ |d   rt	        |d         nd}|d   rt	        |d         nd}	d   \  }
}|s=j                  |
      }|(j                   d!t              dz    |
      }||
<   |}
t        |rd"|
 d"n|
||	|#      dfd<   nd$}k  r   dk(  r<dz
  k  r4dz      }|t        v rdz  |   z  }dz  np|dz    z  }dz  n_   d"k(  rj                  s|d%z  }dz  n@   t        vr4dz
  k(  s|d$k(  sdz      dk(  sdz      t        vr|   z  }dz  nnk  r|rj                  |d&f       k  rv |       S c c}w # t
        $ r t        d| d  d      w xY w)'z
            Parse a unit at index i (advancing it), and return its string representation + whether it's a literal.
            c                  Z    j                   rt        } nt        } j                  d|       S )Nrr   )ry   DOTALLDOTr   )r   r   s    r   get_dotzBSchemaConverter._visit_pattern.<locals>.transform.<locals>.get_dot  s'    <<!D D~~d33r   c                  
   g } t        d       D ]B  \  }}|r*| j                  dj                  d |D              df       2| j                  |       D t	        |       dk(  r| d   S dj                  fdD              d	fS )
Nc                     | d   S )Nr9   r   )r   s    r   r   zUSchemaConverter._visit_pattern.<locals>.transform.<locals>.join_seq.<locals>.<lambda>(  s
    AaD r   r<   c              3   &   K   | ]	  }|d      yw)r   Nr   )rd   r   s     r   rf   zVSchemaConverter._visit_pattern.<locals>.transform.<locals>.join_seq.<locals>.<genexpr>*  s     +<QAaD+<rg   Tr9   r   r>   c              3   .   K   | ]  } |        y wr   r   )rd   r   r   s     r   rf   zVSchemaConverter._visit_pattern.<locals>.transform.<locals>.join_seq.<locals>.<genexpr>/  s      9 9s   F)r   appendrL   extendr   )retr   gseqr   s      r   join_seqzCSchemaConverter._visit_pattern.<locals>.transform.<locals>.join_seq%  s    %,S.%A &MJ!

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

1	&
 s8q=q6M 9S 995AAr   .Fr9   r@   r:   zUnsupported pattern syntax "z" at index z of /r   rJ   r   z Unbalanced parentheses; start = z, i = z, pattern = [r   \   z$Unbalanced square brackets; start = |)r   F)rK   r;   r:   r=   {}z#Unbalanced curly brackets; start = ,NzInvalid quantifier z in /r   r7   )rO   r<   r4   T)r   r   stripr   r   r(   r   r   rR   &ESCAPED_IN_REGEXPS_BUT_NOT_IN_LITERALSrz   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   z1SchemaConverter._visit_pattern.<locals>.transform  sN    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!AGGIOD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   'NAN N6rb   rk   )r   endswithr   r	   r1   r3   r   rz   )r   r   r   r   r   r   r   r   s   ```@@@@@r   _visit_patternzSchemaConverter._visit_pattern  s     !!#&7+;+;,
 	:9	: 
 !B-W	:uS$Y' 	:C 	:T	5d+ T	 T	l ~~ $$ 	$
 	

 	 44~E
 	
r   c                    |j                  d      d   }|| j                  vre|| j                  vrW| j                  j                  |       | j                  |   }| j                  ||      }| j                  j                  |       |S )Nr   r=   )r   r|   r   addr}   r   remove)r   r   ref_nameresolveds       r   _resolve_refzSchemaConverter._resolve_ref  sw    99S>"%4;;&3d6O6O+O%%))#.zz#Hzz(H5H%%,,S1r   c                 J    | j                  t        j                  |            S r   )r   r   dumps)r   ra   s     r   _generate_constant_rulez'SchemaConverter._generate_constant_rule  s    ##DJJu$566r   c                 	    |j                  d      }|j                  d      }t        v rdz   nxs d}|j                  d      x}! j                  | j                  |            S d|v sd|v r8 j                  | j	                  |j                  d      xs |d               S t        |t              r2 j                  | j	                  |D cg c]  }d|i c}            S d|v r$ j                  | j                  |d               S d	|v r/d
j                   fd|d	   D              } j                  ||      S |dv rd|v sd|v r~|d   durwt        |j                  dg             t        |j                  di       j                                j                  | j                  |j                  d                  S |dv rkd|v rgt               g }	 fd}
|d   D ]%  }d|v r|d   D ]  } |
|d         |
|d       '  j                  | j                  |	g             S |dv rd|v sd|v r|j                  d      xs |d   }t        |t              r: j                  |ddj                   fdt        |      D              z   dz         S  j                  | rdnd d      }|j                  dd       }|j                  d!      } j                  |dt        |||d"#      z   dz         S |d$v rd%|v r j                  |d%   |      S |d$v r:t!        j"                  d&|xs d      r  j%                  |dk(  rdn|t&        d'         S |d$v r9| d(t(        v r.| d(} j                  | j%                  |t(        |               S |d)k(  rgd*|v sd+|v r_ j%                  d,t&        d,         }|j                  d*d       }|j                  d+      } j                  |d-t        |||      z   d.z         S |d/k(  st+        |      d k(  r) j                  | j%                  d/t&        d/               S |t&        v s
J d0|         j%                  |dk(  rdn|t&        |         S c c}w )1Ntypeformatr   r   r   oneOfanyOfconstenumr   c              3   @   K   | ]  }j                  |        y wr   )r   )rd   r   r   s     r   rf   z(SchemaConverter.visit.<locals>.<genexpr>  s     W1t;;A>Ws   )Nr[   
propertiesadditionalPropertiesTrequiredallOfc                     | j                  d      x}j                  |   } d| v rC| d   j                         D ],  \  }}j                  ||f       |sj	                  |       . y y )Nr   r  )r   r}   itemsr   r   )comp_schemais_requiredr   	prop_nameprop_schemar  r  r   s        r   add_componentz,SchemaConverter.visit.<locals>.add_component  su    &??622C?"&**S/K;.2=l2K2Q2Q2S 4.	;"))9k*BC&$LL34 /r   F)r  )additional_properties)Nr\   r  prefixItemsz
"[" space  "," space c              3   ^   K   | ]$  \  }}j                  | rd nd d|        & yw)r   r<   ztuple-Nr   )rd   r   itemr   r   s      r   rf   z(SchemaConverter.visit.<locals>.<genexpr>  s<      )#At 

4D6#21FfQC)PQ)s   *-z
 "]" spacer<   r  minItemsr   maxItemsz	"," space)rI   )Nr]   r   z^uuid[1-5]?$rn   z-stringr]   	minLength	maxLengthrl   rb   rk   r[   zUnrecognized schema: )r   RESERVED_NAMESr   r   r   r   rW   r   rL   r~   r  _build_object_ruler   r   rR   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_namerM   rN   	prim_name	char_rulemin_lenmax_lenr  r  s   ` `                 @@r   r   zSchemaConverter.visit  s=   jj(

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

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

;Q0R  ,,F1BuHJK4 G_ 7a<j =%be<= "!67 >>''+R (   O+v&!8JJw'@6-+@E%&~~ #(( )'0'7) 
 ##  "&EdV4CR;PPT3U!V"JJz15	"JJz2	~~ '&	9[ #	#  ,,f1D&&vi'8)DD,,]0b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   Rr   r   c                    | j                  ||j                        }|j                  D ]\  }t        j	                  |      xs t
        j	                  |      }|sJ d| d       || j                  vsK| j                  ||       ^ |S )NzRule z
 not known)r   rF   rU   r  r   r   r|   r  )r   r   r   re   depdep_rules         r   r  zSchemaConverter._add_primitiveN  s    NN4.99 	3C&**3/O3F3J3J33OH4uSE448$++%##C2		3
 r   r  r  r  c           	           j                   t        t        |      fd      D cg c]
  \  }}|d    }}}i |D ]h  \  }}	 j                  |	 rdnd |       }
 j	                   rdnd | d j                  t        j                  |             d|
       |<   j |D cg c]	  }||v s| }}|D cg c]	  }||vs| c}|dk(  st        |t              rm rdnd d	} j                  |dk(  ri n|| d
      } j	                  | d j                  dt        d         d| z         d<   j                  d       d}|dj                  fd|D              z  }rP|dz  }|r|dz  } fd|dj                  fdt        t                    D              z  }|r|dz  }|dz  }|dz  }|S c c}}w c c}w c c}w )Nc                 P    j                  | d   d   t                    | d   fS )Nr9   r   )r   r   )ikvr   s    r   r   z4SchemaConverter._build_object_rule.<locals>.<lambda>e  s(    Aq	3z?!KSQRV T r   r   r   r   r<   z-kvz space ":" space T
additionalz-valuer]   z ":" space rK   z
"{" space r  c              3   (   K   | ]	  }|     y wr   r   )rd   kprop_kv_rule_namess     r   rf   z5SchemaConverter._build_object_rule.<locals>.<genexpr>  s     "QQ#5a#8"Qs   r   z "," space ( c           	          | ^}}|   }|dk(  r%	j                   rdnd d| d|z   dz         }n|rd| d}n|}t        |      d	kD  r+|d
	j                   rdnd | d |d            z   z  }|S )NrK   r   r<   zadditional-kvsz ( "," space z )*z( "," space  )?r   r>   z-restTfirst_is_optional)r   r   )
ksr:  r5  restkv_rule_nameresget_recursive_refsr   r6  r   s
         r   r?  z>SchemaConverter._build_object_rule.<locals>.get_recursive_refs  s    
T1!48..&" 5^D'.6EMC '(c:C&Ct9q=3&" 5aS>*44H"  C 
r   r   c              3   8   K   | ]  } |d  d        y w)NFr9  r   )rd   r   r?  optional_propss     r   rf   z5SchemaConverter._build_object_rule.<locals>.<genexpr>  s*       #>!"#5OOs   z )r8  z
 "}" space)rw   sortedr   r   r   r   r   r   r   r   r  r  r   rL   ranger   )r   r  r  r   r  r   kvsorted_propsr  r  prop_rule_namer5  required_propssub_name
value_ruler   r?  rA  r6  r   s   `  `            @@@@r   r  z"SchemaConverter._build_object_ruleX  sN    %%
  *%T
2 qE
 
  &0 	"I{!ZZvTcr%:9+FN -1NN&"-i[<((I)>?@@QR`Qab-y)		 &2CQ(]!CC%1GQh5F!G D(J7Ld,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   G4	G>G	GGc                 z    dj                  d t        | j                  j                         d       D              S )Nr6   c              3   0   K   | ]  \  }}| d |   yw)z ::= Nr   )rd   r   r   s      r   rf   z1SchemaConverter.format_grammar.<locals>.<genexpr>  s'      
d fE$ 
s   c                     | d   S r   r   )rD  s    r   r   z0SchemaConverter.format_grammar.<locals>.<lambda>  s
    A r   r2  )rL   rB  r|   r  )r   s    r   format_grammarzSchemaConverter.format_grammar  s5    yy 
$T[[%6%6%8>NO
 
 	
r   N)TF)r'   r/   r0   r   r   r1   r3   r   r   r   r   r   r   r   r   r   rT   r  r   r	   r   r   r
   r  rM  r   r   r   rt   rt   |  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   rt   r   r   c                    |xs g }t        j                  |       } t        |      D ci c]  \  }}||
 }}}t        |ddd      }|j	                  | d      } |j                  | d       |j                         S c c}}w )NF)r   r   r   r   stdinr<   )r   loadsr   rt   r   r   rM  )r   r   idxr   	converters        r   r-   r-     s    !rJZZF-6z-BC	T$)CJC5EI ##FG4FOOFB##%% Ds   A=)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   rR   rT   _up_to_15_digitsrL   r  r   r   r   r~   keysr  r   r   rt   r1   r-   r   r   r   <module>ra     s   L    $ R R> :+
Z
88#L	8	 j  	 ! 
 #

#45 &BJJz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   