
    Pi                        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j        d          Z ej        d          ZddddZdZ	 dHd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+                    d, d-D                       z   d.z   g            ed/g            ed0d1g           ed2g           d3Z  ed4g            ed5g            ed6d7d8g           ed9d7g           ed:d8g           ed;d<g          d=Z!d>Z"d?Z# e$dd@ge %                                e!%                                          Z& e$dA          Z' e$dB          Z( G dC dD          Z)dIdEe*dFe	ee*                  fdGZ+dS )JzPython 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dS )LlamaGrammar_grammarc                ,    || _         t          | _        d S N)r   LLAMA_GRAMMAR_DEFAULT_ROOT_root)selfr   argskwargss       k/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/llama_cpp/llama_grammar.py__init__zLlamaGrammar.__init__   s     /


    Tgrammarverbosereturnc                      | |          S )N)r    )clsr   r   s      r   from_stringzLlamaGrammar.from_string   s    sG$$$$r   filec                 F   	 t          |          5 }|                                }d d d            n# 1 swxY w Y   n0# t          $ r#}t          | j        j         d|           d }~ww xY w|r|                     ||          S t          | j        j         d          )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&&((# # # # # # # # # # # # # # # 	 	 	=)NNNN  	
  	=??7G?<<<}%\\\
 
 	
s-   > 2> 6> 6> 
A+A&&A+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QQr   N)T)r'   
__module____qualname__strr   classmethodboolr   r
   r   r&   r.   r   r   r   r   r      s        0 0 0 0 0 % %# % % % % % [% 
 
U39- 
 
 
 
 
 [
  R R3 R R R R 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\")
"Fc                     s|dk    r|dk    r  dS |dk    r|  dS d}|dk    r9|rd dd         |z  z   dz   }n!rd dnd                      g|z            }d fd
	|dk    r||k    r|dz  }|| ||z
  |dk              z  }n)drdz   nd   d}|dk    rr
d  d| d}n|| dz  }|S )Nr      ?+ r7    Fc                     |r	r d n}| dk    rdS | dk    rd| dS r|sd| d | dz
  d           dS d| d| z                                   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     #1~++	+++ 	
 a<<2\\"w???" 	JO 	JWwWW1d!S!S!SWWWW"NNNW,4466$.IIr   rB   r@   )z*)?*)F)join)rG   	min_items	max_itemsrI   item_rule_is_literalresultitem_operatorrH   s   `  `   @r   _build_repetitionrR      s     #>>i1nn???"!^^	 1???"F1}} 	N$:IadOi783>FF/=F+.++++3LLi' FJ J J J J J J J* 1}}i//#//)i"7UVWWWWXNJNS00XIXXX>>n>777]777FF))))FMr   c                        e Zd ZddedefdZdS )BuiltinRuleNrF   depsc                 &    || _         |pg | _        d S 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  V  
dS )z[0-9a-fA-F]Nr   ).0ns     r   	<genexpr>rf   T  s'      CCQ}q(CCCCCCr   )      rh   rh       "\"" 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\   uuidrk   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)rn   ro   rp   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dS )SchemaConverterc                    || _         || _        || _        || _        dt          i| _        i | _        t                      | _        d S )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__}  sJ    %''Z
 
$'EE!!!r   c                 F    t                               d |          }d| dS )Nc                 \    t                               |                     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~~~r   TFr   r   r   c                      t                    dk    s
J d            dt          f fdd                    dg d          dR           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V  dV  d| dV  nd| dV  | t                    dz
  k     r9dV                      |          V  d	V   | dz             E d {V  d
V  d S d S )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#XX#1mmm###&!&&&&&&&1iii3w<<!###**1-----


"71q5>>)))))))




 $#r   r<   r@   rJ   )r   intrL   )r   r   r   r   r   s   `` `@r   not_literalzSchemaConverter.not_literal  s     7||a!>	s 	 	 	 	 	 	 	 	 	 ww.ggajj.#..///r   c                 ,   t                               d|          }|| j        vs| j        |         |k    r|}nQd}| | | j        v r<| j        | |          |k    r'|dz  }| | | j        v r| j        | |          |k    '| | }|| 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74;&&$+h*?4*G*GCCA Q  DK//K8 0Q 0 01T99Q  Q  DK//K8 0Q 0 01T99 "q""CC
r   schemaurlc                 @     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                    t          | t                    rfd| D             S t          | t                    r|                     d          }|n|	j        vrd|                    d          r	j        s
J d            dd l}|                    d          }|d         }	j                            |          }|E		                    |                    |          
                                |          }|	j        |<   t          |          dk    s|d         d	k    r|S n5|                    d
          r}
 | }|| d<   nt          d|           |                    d          d                             d          dd          D ]#}|||v sJ d| d| d|             ||         }$|	j        |<   n"|                                 D ]} |           | S )Nc                 &    g | ]} |          S r   r   )rd   xvisits     r   
<listcomp>z?SchemaConverter.resolve_refs.<locals>.visit.<locals>.<listcomp>  s!    ,,,Qa,,,r   $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|   
startswithrw   requestssplitresolve_refsjsonr   r(   values)re   refr   
frag_splitbase_urltargetselvr   r   r   r   s           r   r   z+SchemaConverter.resolve_refs.<locals>.visit  s4   !T"" '!,,,,!,,,,At$$ %!eeFmm?s$*'<'<~~j11 C -b bab b-'%(YYs^^
#-a=!%!9!9!>%)%6%6 (S 1 1 6 6 8 8(& &F 4:DJx0z??a//:b>R3G3G#)M 4H-- C!'!$mcmm$'&		()AC)A)ABBB"yy~~b177<<QRR@ - -".3&===N#NNNNfNN 4A=@!'&,DJsOOXXZZ ! !aHr   )r   )r   r   r   r   s   ```@r   r   zSchemaConverter.resolve_refs  sK    *	T *	 *	 *	 *	 *	 *	 *	 *	 *	X uV}}r   c                 d     d                      fdt          |          D                       S )Nr   c              3   ^   K   | ]'\  }}                     | rd nd |           V  (dS )r   zalternative-Nr   )rd   r   
alt_schemar   r   s      r   rf   z7SchemaConverter._generate_union_rule.<locals>.<genexpr>  sc        !Az 

:$'Tt0O'TQR'T'TUU     r   )rL   	enumerate)r   r   alt_schemass   `` r   _generate_union_rulez$SchemaConverter._generate_union_rule  sM    zz    %.{%;%;  
 
 	
r   c           	                               d          r                    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        r                        n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   n|S )Nr7   r   )r   txt
is_literals      r   to_rulez/SchemaConverter._visit_pattern.<locals>.to_rule
  s#     !S*&0939s??c9r   c                     } g fd}fd}k     rX         }|dk    r&                      |            df           dz  n|dk    r_dz  k     r&         dk    sJ d          d	 d
 d                                 d                         ddf           n|dk    r7dz  | dk    r| dz
           dk    sJ d|  d d              |            S |dk    r|}dz  k     rP         dk    rD         dk    r|dz            z  }dz  n|         z  }dz  k     r         dk    Dk     sJ d|  d d             |dz  }dz                       |df           n|dk    r                     d           dz  n|dv r  d                   |z   dfd<   dz  n|dk    r|}dz  k     r.         dk    r"|         z  }dz  k     r         dk    "k     sJ d|  d d             |dz  }dz  d |dd                             d          D             }d}d}	 t          |          dk    rt          |d                   }|}nSt          |          dk    sJ |d         rt          |d                   nd}|d         rt          |d                   nd}n$# t          $ r t	          d | d! d          w xY wd         \  }	}
|
sI                    |	          }|0                     d"t                    dz    |	          }||	<   |}	t          |
rd#|	 d#n|	|||
$          dfd<   nd%}k     rʉ         dk    rIdz
  k     r@dz            }|t          v rdz  |         z  }dz  n|dz            z  }dz  no         d#k    rj	        s|d&z  }dz  nQ         t          vrAdz
  k    s'|d%k    s!dz            dk    sdz            t          vr|         z  }dz  nnk     |r                     |d'f           k     X |            S )(z
            Parse a unit at index i (advancing it), and return its string representation + whether it's a literal.
            c                  \    j         rt          } nt          }                     d|           S )Nrq   )rx   DOTALLDOTr   )r   r   s    r   get_dotzBSchemaConverter._visit_pattern.<locals>.transform.<locals>.get_dot  s/    < !DD D~~fd333r   c                  J   g } t          d           D ]Q\  }}|r5|                     d                    d |D                       df           <|                     |           Rt	          |           dk    r| d         S d                    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          V  dS )r   Nr   )rd   r   s     r   rf   zVSchemaConverter._visit_pattern.<locals>.transform.<locals>.join_seq.<locals>.<genexpr>*  s&      +<+<QAaD+<+<+<+<+<+<r   Tr9   r   r>   c              3   .   K   | ]} |          V  d S r   r   )rd   r   r   s     r   rf   zVSchemaConverter._visit_pattern.<locals>.transform.<locals>.join_seq.<locals>.<genexpr>/  s+       9 9 9 9 9 9 9 9r   F)r   appendrL   extendr   )retr   gseqr   s      r   join_seqzCSchemaConverter._visit_pattern.<locals>.transform.<locals>.join_seq%  s    %,S..%A%A & &MJ! &

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

1s88q==q6M 9 9 9 9S 9 9 9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 = c                 6    g | ]}|                                 S r   )strip)rd   r   s     r   r   zESchemaConverter._visit_pattern.<locals>.transform.<locals>.<listcomp>d  s     OOO!AGGIIOOOr   ,NzInvalid quantifier z in /r   r7   )rO   r<   r4   T)r   r   r   r   r(   r   r   rR   &ESCAPED_IN_REGEXPS_BUT_NOT_IN_LITERALSry   NON_LITERAL_SET)startr   r   r   square_bracketscurly_bracketsnums	min_times	max_timesr   sub_is_literalidr   nextr   r   lengthr   patternr   sub_rule_idsr   	transforms                 @r   r   z1SchemaConverter._visit_pattern.<locals>.transform  sx    E
 +-C4 4 4 4 4
B 
B 
B 
B 
B 
B f**AJ88JJ		51222FAA#XXFA6zz#AJ#---c'!*ccQRccY`ccc .--JJ ;GGIIKK$8$8 ; ; ;UCDDDD#XXFA		geai&8C&?&?&?_%__q__V]__ '@&??#8::%#XX&'OFAf**s):):"1:--+wq1q5y/AAOFAA+wqz9OFA f**s):): F


cecc1ccZacc #

#s*OFAJJ78888#XXJJ|,,,FAA/))&ws2w//!3U;CGFAA#XX%&NFAf**s):):&'!*4Q f**s):): F


bUbb!bbY`bb #

"c)NFAOO~ad/C/I/I#/N/NOOOD !I $It99>>(+DGI(1II#&t99>>>>8<Q(FDGQI8<Q(IDGTI%   (Q.QQwQQQ  
 -0G)S.) !)--c22:!%40Q0Q#l:K:Ka:O0Q0QSV!W!WB02L-  **8AJJJJJc%%1?	   CGG !Gf**"1:--!fqj..#*1q5>D#'MMM !Q '71: 5 !Q '71q1u9+= = !Q$QZ3..t7H.#u,GFAA$QZ>>!OO&"}}&q1u~44&q1u~_DD#wqz1GFAA!- f**.  4

GT?333_ f**b 8::s   %A>K$ $!Lrb   rj   )r   endswithr   r	   r1   r3   r   ry   )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	 T	 T	 T	 T	 T	 T	 T	 T	 T	 T	 T	l ~~ $F		$$$		 4 44~E
 
 	
r   c                    |                     d          d         }|| j        vr`|| j        vrW| j                            |           | j        |         }|                     ||          }| j                            |           |S )Nr   r=   )r   r{   r~   addr|   r   remove)r   r   ref_nameresolveds       r   _resolve_refzSchemaConverter._resolve_ref  s    99S>>"%4;&&3d6O+O+O%))#...z#Hzz(H55H%,,S111r   c                 P    |                      t          j        |                    S r   )r   r   dumps)r   ra   s     r   _generate_constant_rulez'SchemaConverter._generate_constant_rule  s     ##DJu$5$5666r   c                 
    |                     d          }|                     d          }t          v rdz   npd}|                     d          x})                     |                     |                    S d|v sd|v rE                     |                     |                     d          p|d                             S t          |t                    r4                     |                     d |D                                 S d	|v r/                     |                     |d	                             S d
|v r=d                     fd|d
         D                       }                     ||          S |dv rd|v sd|v r|d         durt          |                     dg                     t          |                     di           
                                                               |                     |                     d                              S |dv rd|v r{t                      g } fd}	|d         D ],}
d|
v r|
d         D ]} |	|d            |	|
d           -                     |                     |g                     S |dv rd|v sd|v r|                     d          p|d         }t          |t                    rI                     |dd                     fdt          |          D                       z   dz             S                      | rdnd d          }|                     d d!          }|                     d"          }                     |dt          |||d#$          z   dz             S |d%v r d&|v r                     |d&         |          S |d%v r@t!          j        d'|pd          r)                     |dk    rdn|t&          d(                   S |d%v rF| d)t(          v r:| d)}                     |                     |t(          |                             S |d*k    rd+|v sd,|v rw                     d-t&          d-                   }|                     d+d!          }|                     d,          }                     |d.t          |||          z   d/z             S |d0k    st+          |          d!k    r5                     |                     d0t&          d0                             S |t&          v sJ d1|                                  |dk    rdn|t&          |                   S )2Ntypeformatr   r   r   oneOfanyOfc                     g | ]}d |iS )r  r   )rd   ts     r   r   z)SchemaConverter.visit.<locals>.<listcomp>  s    0R0R0R&!0R0R0Rr   constenumr   c              3   B   K   | ]}                     |          V  d S r   )r   )rd   r   r   s     r   rf   z(SchemaConverter.visit.<locals>.<genexpr>  s1      WW1t;;A>>WWWWWWr   )Nr[   
propertiesadditionalPropertiesTrequiredallOfc                     |                      d          x}j        |         } d| v rN| d                                         D ]5\  }}                    ||f           |r                    |           4d S d S )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  s    &??6222C?"&*S/K;..2=l2K2Q2Q2S2S 4 4.	;"))9k*BCCC& 4$LL333	 /.4 4r   F)r  )additional_properties)Nr\   r  prefixItemsz
"[" space  "," space c              3   `   K   | ](\  }}                     | rd nd d|           V  )dS )r   r<   ztuple-Nr   )rd   r   itemr   r   s      r   rf   z(SchemaConverter.visit.<locals>.<genexpr>  se       ) )#At 

4D)P2E##2)P)PQ)P)PQQ) ) ) ) ) )r   z
 "]" spacer<   r  minItemsr   maxItemsz	"," space)rI   )Nr]   r   z^uuid[1-5]?$rm   z-stringr]   	minLength	maxLengthrk   rb   rj   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   r   hybrid_namer  r  ttr  item_rule_namerM   rN   	prim_name	char_rulemin_lenmax_lenr
  r  s   ` `                 @@r   r   zSchemaConverter.visit  s   jj((

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

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

;Q0R0R    ,,,F1B1BuuHJK4 4 4 4 4 4 4 G_ 7 7a<<j = =%be<<<<<= "M!66666>>''+R (     O++v&!8!8JJw''@6-+@E%&& ~~ #(( ) ) ) ) )'0'7'7) ) )  
 ##   "&Ed3U4<OCCR3U3U3U!V!V"JJz155	"JJz22	~~ '&	9[   #	#   ,,,f1D1D&&vi'8)DDD,,,]0b2
 2
, &&#v--='   +++ )))-@@@(111I>>##I/B9/MNN  
 H$$6!![F%:%:++FOF4KLLIjja00Gjj--G>>#Iw@@A !   X%%3v;;!+;+;>>4..x9RSS  
 /1113S63S3S111&&#v--;,  r   r   r   c                    |                      ||j                  }|j        D ]e}t                              |          pt
                              |          }|sJ d| d            || j        vr|                     ||           f|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..9 	3 	3C&**3//O3F3J3J33O3OH444S444448$+%%##C222r   r
  r  r  c           	           j         d t          t          |          fd          D             }i |D ]s\  }}                     | rdnd |           }                      rdnd | d                     t          j        |                     d|           |<   tfd|D             }	fd	|D             |d
k    st          |t                    r rdnd d}
                     |d
k    ri n||
 d          }                     |
 d 
                    dt          d                   d| z             d<                       d           d}|d                    fd|	D                       z  }r_|dz  }|	r|dz  } fd|d                    fdt          t                              D                       z  }|	r|dz  }|dz  }|dz  }|S )Nc                 $    g | ]\  }}|d          S )r   r   )rd   r   kvs      r   r   z6SchemaConverter._build_object_rule.<locals>.<listcomp>a  s0     
 
 
2 qE
 
 
r   c                 r                         | 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??!K!KSQRV T r   r   r   r<   z-kvz space ":" space c                     g | ]}|v |	S r   r   rd   kr  s     r   r   z6SchemaConverter._build_object_rule.<locals>.<listcomp>r  s    CCCQ(]]!]]]r   c                     g | ]}|v|	S r   r   r9  s     r   r   z6SchemaConverter._build_object_rule.<locals>.<listcomp>s  s#    GGGQh5F5F!5F5F5Fr   T
additionalz-valuer]   z ":" space rK   z
"{" space r  c              3   (   K   | ]}|         V  d S r   r   )rd   r:  prop_kv_rule_namess     r   rf   z5SchemaConverter._build_object_rule.<locals>.<genexpr>  s)      "Q"QQ#5a#8"Q"Q"Q"Q"Q"Qr   r   z "," space ( c           	         | ^}}|         }|dk    r)	                      rdnd d| d|z   dz             }n|rd| d}n|}t          |          d	k    r2|d
	                      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   )
ksrB  r:  restkv_rule_nameresget_recursive_refsr   r>  r   s
         r   rG  z>SchemaConverter._build_object_rule.<locals>.get_recursive_refs  s    
T1!488..D!4"DDD'666EM CC ' '::::CC&Ct99q==3>!4">a>>>**44HHH" "  C 
r   r   c              3   B   K   | ]} |d          d          V  d S )NFrA  r   )rd   r   rG  optional_propss     r   rf   z5SchemaConverter._build_object_rule.<locals>.<genexpr>  sP         #">!""#5OOO     r   z )r@  z
 "}" space)rv   sortedr   r   r   r   r   r   r   r   r"  r#  r   rL   ranger   )r   r
  r  r   r  sorted_propsr  r  prop_rule_namerequired_propssub_name
value_ruler   rG  rI  r>  r   s   ` ``         @@@@r   r  z"SchemaConverter._build_object_ruleX  s    %

 
*%%TTTT  
 
 
  &0 	 	"I{!ZZFT&9ccrF9FF N -1NN<,"<i<<<((I)>)>??bbR`bb- -y)) DCCC\CCCGGGG\GGG D((J7Ld,S,S(?t 3???H+t339N### J '+nn   ##Hoh.GHH,
,,-' 's#
 !!#&&&"""Q"Q"Q"Q."Q"Q"QQQQ 	DLD ('       & EJJ     s>2233     D  EMDr   c                     d                     d t          | j                                        d           D                       S )Nr6   c              3   *   K   | ]\  }}| d | V  dS )z ::= Nr   )rd   r   r   s      r   rf   z1SchemaConverter.format_grammar.<locals>.<genexpr>  sH       
 
d   $  
 
 
 
 
 
r   c                     | d         S r   r   )r4  s    r   r   z0SchemaConverter.format_grammar.<locals>.<lambda>  s
    A r   r7  )rL   rJ  r{   r  )r   s    r   format_grammarzSchemaConverter.format_grammar  sS    yy 
 
$T[%6%6%8%8>N>NOO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  rT  r   r   r   rs   rs   |  s}       	* 	* 	*   LQ0 00$(0	0 0 0 04  34 3c 3 3 3 3j
 
 
w
 w
 w
r  7 7 7S S Sj3 k    OsCx)O c(O 	O
  %T3Y/O O O Ob
 
 
 
 
r   rs   r   r   c                 
   |pg }t          j        |           } d t          |          D             }t          |ddd          }|                    | d          } |                    | d           |                                S )Nc                     i | ]\  }}||	S r   r   )rd   idxr   s      r   
<dictcomp>z'json_schema_to_gbnf.<locals>.<dictcomp>  s    CCC	T$CCCr   F)r   r   r   r   stdinr<   )r   loadsr   rs   r   r   rT  )r   r   	converters      r   r-   r-     s    !rJZFCCYz-B-BCCCJ5E  I ##FG44FOOFB##%%%r   )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   rz   compiler   r   r   rR   rT   _up_to_15_digitsrL   r#  r$  r   r   r}   keysr  r   r   rs   r1   r-   r   r   r   <module>rj     sm   L  L                            $ R R R R R R R R> :+
Z
88#L	8	 j  				 ! ! ! ! ! ! ! ! 
 #
#455 &BJz22 !&e%@@  
 PU5 5 5 5p        %$Wa44  {5r::K+; ;R@@ [!14D!DbIIkT	.)  {7/9JKK[;BBB  k]	7  [;gY  K
,,CC2BCCC
C
C	D
	 		  K\
  k2VH==K++?   H Kk
  K 	a
  _vv.>??;7&BB;7&BB#$AK=QQ   
%UI_))++I.A.F.F.H.HI 
 #m$$),\):): &q
 q
 q
 q
 q
 q
 q
 q
h	& 	& 	&$s)1D 	& 	& 	& 	& 	& 	&r   