o
    @jùW  ã                   @   s–   d dl Z d dlmZmZmZmZmZmZmZ ddl	m
Z
 ddlmZmZ ddlmZ ede
jdZd	ed
ef ded
ef fdd„ZG dd„ dƒZdS )é    N)ÚAnyÚCallableÚListÚSetÚTypeVarÚUnionÚcasté   )Úast)ÚEOLÚFluentParserStream)Ú
ParseErrorÚR)ÚboundÚfn.Úreturnc              
      s&   dddt dtdtdtf
‡ fdd„}|S )	NÚselfÚFluentParserÚpsÚargsÚkwargsr   c                    s`   | j sˆ | |g|¢R i |¤ŽS |j}ˆ | |g|¢R i |¤Ž}|jd ur%|S |j}| ||¡ |S ©N)Ú
with_spansÚindexÚspanÚadd_span)r   r   r   r   ÚstartÚnodeÚend©r   © úc/var/www/www-root/data/www/ai-bot.pdev.uz/venv/lib/python3.10/site-packages/fluent/syntax/parser.pyÚ	decorated   s   
zwith_span.<locals>.decorated)r   r   )r   r"   r    r   r!   Ú	with_span
   s   "r#   c                	   @   s(  e Zd ZdZdJdefdd„Zdedejfdd	„Z	dedej
fd
d„Zdedej
fdd„Zdedej
fdd„Zededeejejejf fdd„ƒZededejfdd„ƒZededejfdd„ƒZededejfdd„ƒZdedeej fdd„Zededejfdd„ƒZdedeejejf fdd„Z edededej!fd d!„ƒZ"dedeej! fd"d#„Z#dedefd$d%„Z$ededejfd&d'„ƒZ%dedeej&d(f fd)d*„Z'eded+edej&fd,d-„ƒZ(G d.d/„ d/ej)ƒZ*d0eeej+ej,e*f  d1e-deeej+ej,f  fd2d3„Z.ededej+fd4d5„ƒZ/dedefd6d7„Z0ded8ed9e-defd:d;„Z1ededej,fd<d=„ƒZ2ededeej3ej,ej4f fd>d?„ƒZ5ededeej3ej,f fd@dA„ƒZ6ededeej3ej7ej,f fdBdC„ƒZ8ededej9fdDdE„ƒZ:ededej;fdFdG„ƒZ<ededeejej;f fdHdI„ƒZ=d(S )Kr   z·This class is used to parse Fluent source content.

    ``with_spans`` enables source information in the form of
    :class:`.ast.Span` objects for each :class:`.ast.SyntaxNode`.
    Tr   c                 C   s
   || _ d S r   )r   )r   r   r    r    r!   Ú__init__%   s   
zFluentParser.__init__Úsourcer   c                 C   sÚ   t |ƒ}| ¡  g }d}|jr\|  |¡}| ¡ }t|tjƒr*t|ƒdkr*|jr*|}q|durTt|tjtj	fƒrM||_
| jrLttj|j
jƒjttj|jƒ_n| |¡ d}| |¡ |jst |¡}| jrk| d|j¡ |S )z>Create a :class:`.ast.Resource` from a Fluent source.
        Nr   )r   Úskip_blank_blockÚcurrent_charÚget_entry_or_junkÚ
isinstancer
   ÚCommentÚlenÚMessageÚTermÚcommentr   r   ÚSpanr   r   ÚappendÚResourcer   r   )r   r%   r   ÚentriesÚlast_commentÚentryÚblank_linesÚresr    r    r!   Úparse(   s4   
ÿ€

å
zFluentParser.parsec                 C   sP   t |ƒ}| ¡  |jdkr#|  |¡}t|tjƒr|S | ¡  |jdks|  |¡S )a˜  Parse the first :class:`.ast.Entry` in source.

        Skip all encountered comments and start parsing at the first :class:`.ast.Message`
        or :class:`.ast.Term` start. Return :class:`.ast.Junk` if the parsing is not successful.

        Preceding comments are ignored unless they contain syntax errors
        themselves, in which case :class:`.ast.Junk` for the invalid comment is returned.
        ú#)r   r&   r'   r(   r)   r
   ÚJunk)r   r%   r   Úskippedr    r    r!   Úparse_entryU   s   	


û
zFluentParser.parse_entryr   c           
   
   C   sÌ   |j }z|  |¡}| ¡  |W S  tye } zJ|j }| |¡ |j }||k r(|}|j||… }t |¡}| jr=| 	||¡ t 
|j|jrIt|jƒnd |j¡}	|	 	||¡ | |	¡ |W  Y d }~S d }~ww r   )r   Ú	get_entryÚexpect_line_endr   Úskip_to_next_entry_startÚstringr
   r9   r   r   Ú
AnnotationÚcoder   ÚlistÚmessageÚadd_annotation)
r   r   Úentry_start_posr4   ÚerrÚerror_indexÚnext_entry_startÚsliceÚjunkÚannotr    r    r!   r(   j   s*   


"
€ðzFluentParser.get_entry_or_junkc                 C   sB   |j dkr
|  |¡S |j dkr|  |¡S | ¡ r|  |¡S tdƒ‚)Nr8   ú-ÚE0002)r'   Úget_commentÚget_termÚis_identifier_startÚget_messager   ©r   r   r    r    r!   r<   ƒ   s   




zFluentParser.get_entryc                 C   s  d}d}	 d}|j dkr-||dkrdn|k r-| ¡  |d7 }|j dkr-||dkr*dn|k s|dkr3|}|j tkrS| d¡ | dd	„ ¡}|rS||7 }| d
d	„ ¡}|sF|j|drf|tt|j ƒ7 }| ¡  nnq|dkrqt 	|¡S |dkrzt 
|¡S |dkrƒt |¡S ttj	d ƒS )NéÿÿÿÿÚ Tr8   é   r	   ú c                 S   ó   | t kS r   ©r   ©Úxr    r    r!   Ú<lambda>£   ó    z*FluentParser.get_comment.<locals>.<lambda>c                 S   rW   r   rX   rY   r    r    r!   r[   ¦   r\   )Úlevelr   )r'   Únextr   Úexpect_charÚ	take_charÚis_next_line_commentr   Ústrr
   r*   ÚGroupCommentÚResourceComment)r   r   r]   ÚcontentÚiÚchr    r    r!   rN      s>   

ý

þ
ë


zFluentParser.get_commentc                 C   s^   |   |¡}| ¡  | d¡ |  |¡}|  |¡}|d u r(t|ƒdkr(td|jƒ‚t 	|||¡S )Nú=r   ÚE0005)
Úget_identifierÚskip_blank_inliner_   Úmaybe_get_patternÚget_attributesr+   r   Únamer
   r,   ©r   r   ÚidÚvalueÚattrsr    r    r!   rQ   ¸   s   



zFluentParser.get_messagec                 C   s\   |  d¡ |  |¡}| ¡  |  d¡ |  |¡}|d u r"td|jƒ‚|  |¡}t |||¡S )NrL   rh   ÚE0006)	r_   rj   rk   rl   r   rn   rm   r
   r-   ro   r    r    r!   rO   Æ   s   




zFluentParser.get_termc                 C   sL   |  d¡ |  |¡}| ¡  |  d¡ |  |¡}|d u r tdƒ‚t ||¡S )NÚ.rh   ÚE0012)r_   rj   rk   rl   r   r
   Ú	Attribute)r   r   Úkeyrq   r    r    r!   Úget_attributeÕ   s   



zFluentParser.get_attributec                 C   sD   g }|  ¡  | ¡ r | ¡  |  |¡}| |¡ |  ¡  | ¡ s
|S r   )Ú
peek_blankÚis_attribute_startÚskip_to_peekrx   r0   )r   r   rr   Úattrr    r    r!   rm   ä   s   

üzFluentParser.get_attributesc                 C   sD   |  ¡ }|d u rtddƒ‚| ¡ }|r||7 }| ¡ }|st |¡S )NÚE0004za-zA-Z)Útake_id_startr   Útake_id_charr
   Ú
Identifier)r   r   rn   rg   r    r    r!   rj   ð   s   
þ
zFluentParser.get_identifierc                 C   sJ   |j }|d u rtdƒ‚t|ƒ}|dkr|dks|dkr |  |¡S |  |¡S )NÚE0013é0   é9   é-   )r'   r   ÚordÚ
get_numberrj   )r   r   rg   Úccr    r    r!   Úget_variant_keyý   s   

zFluentParser.get_variant_keyÚhas_defaultc                 C   s|   d}|j dkr|rtdƒ‚| ¡  d}| d¡ | ¡  |  |¡}| ¡  | d¡ |  |¡}|d u r7tdƒ‚t |||¡S )NFÚ*ÚE0015Tú[ú]ru   )	r'   r   r^   r_   Ú
skip_blankrˆ   rl   r
   ÚVariant)r   r   r‰   Údefault_indexrw   rq   r    r    r!   Úget_variant	  s   




zFluentParser.get_variantc                 C   st   g }d}|  ¡  | ¡ r(|  ||¡}|jrd}| |¡ | ¡  |  ¡  | ¡ st|ƒdkr2tdƒ‚|s8tdƒ‚|S )NFTr   ÚE0011ÚE0010)rŽ   Úis_variant_startr‘   Údefaultr0   r=   r+   r   )r   r   Úvariantsr‰   Úvariantr    r    r!   Úget_variants!  s    
ø
zFluentParser.get_variantsc                 C   s>   d}|  ¡ }|r||7 }|  ¡ }|st|ƒdkrtddƒ‚|S )NrT   r   r}   z0-9)Ú
take_digitr+   r   )r   r   Únumrg   r    r    r!   Ú
get_digits8  s   þ
zFluentParser.get_digitsc                 C   s^   d}|j dkr|d7 }| ¡  ||  |¡7 }|j dkr*|d7 }| ¡  ||  |¡7 }t |¡S )NrT   rL   rt   )r'   r^   r›   r
   ÚNumberLiteral)r   r   rš   r    r    r!   r†   E  s   


zFluentParser.get_numberNc                 C   sP   |  ¡  | ¡ r| ¡  | j|ddS | ¡  | ¡ r&| ¡  | j|ddS dS )aò  Parse an inline or a block Pattern, or None

        maybe_get_pattern distinguishes between patterns which start on the
        same line as the indentifier (aka inline singleline patterns and inline
        multiline patterns), and patterns which start on a new line (aka block
        patterns). The distinction is important for the dedentation logic: the
        indent of the first line of a block pattern must be taken into account
        when calculating the maximum common indent.
        F)Úis_blockTN)Úpeek_blank_inlineÚis_value_startr{   Úget_patternÚpeek_blank_blockÚis_value_continuationrR   r    r    r!   rl   V  s   
zFluentParser.maybe_get_patternr   c                 C   s  g }|r|j }| ¡ }| |  |||j ¡¡ t|ƒ}ntttdƒƒ}|jrx|jt	krW|j }| 
¡ }| ¡ rR| ¡  | ¡ }t|t|ƒƒ}| |  || ||j ¡¡ q"| ¡  n!|jdkr`tdƒ‚|jdkrk|  |¡}	n|  |¡}	| |	¡ |js%|  ||¡}
t |
¡S )NÚinfinityÚ}ÚE0027Ú{)r   rk   r0   ÚIndentr+   r   ÚintÚfloatr'   r   r¡   r¢   r{   ÚminÚ
reset_peekr   Úget_placeableÚget_text_elementÚdedentr
   ÚPattern)r   r   r   ÚelementsÚblank_startÚfirst_indentÚcommon_indent_lengthr5   ÚindentÚelementÚdedentedr    r    r!   r    l  s8   





ç
zFluentParser.get_patternc                       s*   e Zd Zdededef‡ fdd„Z‡  ZS )zFluentParser.Indentrq   r   r   c                    s&   t tj| ƒ ¡  || _|  ||¡ d S r   )Úsuperr   r§   r$   rq   r   )r   rq   r   r   ©Ú	__class__r    r!   r$   ™  s   zFluentParser.Indent.__init__)Ú__name__Ú
__module__Ú__qualname__rb   r¨   r$   Ú__classcell__r    r    r¸   r!   r§   ˜  s    "r§   r°   Úcommon_indentc           	      C   s^  g }|D ]†}t |tjƒr| |¡ qt || jƒr-|jdt|jƒ| … |_t|jƒdkr-qt|ƒdkr7|d nd}t |tjƒrbt |j|j ¡}| jr]| 	t
tj|jƒjt
tj|jƒj¡ ||d< qt || jƒr…t |j¡}| jrƒ| 	t
tj|jƒjt
tj|jƒj¡ |}| |¡ qt|ƒdkr•|d nd}t |tjƒr­|j d¡|_|jdkr­| ¡  |S )zªDedent a list of elements by removing the maximum common indent from
        the beginning of text lines. The common indent is calculated in
        get_pattern.
        Nr   rS   z 
rT   )r)   r
   Ú	Placeabler0   r§   rq   r+   ÚTextElementr   r   r   r/   r   r   r   ÚrstripÚpop)	r   r°   r¾   Útrimmedrµ   ÚprevÚsumÚtext_elementÚlast_elementr    r    r!   r®   ž  s8   
$$
zFluentParser.dedentc                 C   s\   d}|j r)|j }|dks|dkrt |¡S |tkrt |¡S ||7 }| ¡  |j st |¡S )NrT   r¦   r¤   )r'   r
   rÀ   r   r^   )r   r   Úbufrg   r    r    r!   r­   Ï  s   

ö
zFluentParser.get_text_elementc                 C   s^   |j }|dks|dkr| ¡  d|› S |dkr|  ||d¡S |dkr*|  ||d¡S td|ƒ‚)Nú\ú"Úué   ÚUé   ÚE0025)r'   r^   Úget_unicode_escape_sequencer   )r   r   r^   r    r    r!   Úget_escape_sequenceá  s   

z FluentParser.get_escape_sequencerË   Údigitsc                 C   sX   |  |¡ d}t|ƒD ]}| ¡ }|s tdd|› |› |j› ƒ‚||7 }qd|› |› S )NrT   ÚE0026rÉ   )r_   ÚrangeÚtake_hex_digitr   r'   )r   r   rË   rÒ   ÚsequenceÚ_rg   r    r    r!   rÐ   ð  s   

z(FluentParser.get_unicode_escape_sequencec                 C   s0   |  d¡ | ¡  |  |¡}|  d¡ t |¡S )Nr¦   r¤   )r_   rŽ   Úget_expressionr
   r¿   )r   r   Ú
expressionr    r    r!   r¬   û  s
   



zFluentParser.get_placeablec                 C   sô   |   |¡}| ¡  |jdkri| ¡ dkr| ¡  |S t|tjƒr-|jd u r)t	dƒ‚t	dƒ‚t|tj
ƒr=|jd u r<t	dƒ‚nt|tjtjtjtjfƒsNt	dƒ‚| ¡  | ¡  | ¡  | ¡  |  |¡}t ||¡S t|tj
ƒrx|jd urxt	dƒ‚|S )NrL   ú>ÚE0016ÚE0018ÚE0017ÚE0029ÚE0019)Úget_inline_expressionrŽ   r'   Úpeekr«   r)   r
   ÚMessageReferenceÚ	attributer   ÚTermReferenceÚStringLiteralrœ   ÚVariableReferenceÚFunctionReferencer^   rk   r=   r˜   ÚSelectExpression)r   r   Úselectorr–   r    r    r!   rØ     sD   



ÿ
ÿüÿ

ÿ
zFluentParser.get_expressionc                 C   s^  |j dkr
|  |¡S | ¡ r|  |¡S |j dkr|  |¡S |j dkr0| ¡  |  |¡}t |¡S |j dkri| ¡  |  |¡}d }|j dkrN| ¡  |  |¡}d }| 	¡  |j
dkrb| ¡  |  |¡}t |||¡S | ¡ r«|  |¡}| 	¡  |j
dkr•t d|j¡s†tdƒ‚| ¡  |  |¡}t ||¡S d }|j dkr¥| ¡  |  |¡}t ||¡S td	ƒ‚)
Nr¦   rÊ   ú$rL   rt   ú(z^[A-Z][A-Z0-9_-]*$ÚE0008ÚE0028)r'   r¬   Úis_number_startr†   Ú
get_stringr^   rj   r
   ræ   ry   Úcurrent_peekr{   Úget_call_argumentsrä   rP   ÚreÚmatchrn   r   rç   râ   )r   r   rp   rã   Ú	argumentsr   r    r    r!   rà   6  sL   


















z"FluentParser.get_inline_expressionc                 C   sf   |   |¡}| ¡  |jdkr|S t|tjƒr/|jd u r/| ¡  | ¡  |  |¡}t 	|j
|¡S tdƒ‚)Nú:ÚE0009)rà   rŽ   r'   r)   r
   râ   rã   r^   Úget_literalÚNamedArgumentrp   r   )r   r   Úexprq   r    r    r!   Úget_call_argumenti  s   


zFluentParser.get_call_argumentc                 C   sÌ   g }g }t ƒ }| d¡ | ¡  	 |jdkrnD|  |¡}t|tjƒr9|jj|v r,t	dƒ‚| 
|¡ | |jj¡ nt|ƒdkrCt	dƒ‚| 
|¡ | ¡  |jdkrZ| ¡  | ¡  q	 | d¡ t ||¡S )Nrë   Tú)ÚE0022r   ÚE0021ú,)Úsetr_   rŽ   r'   rú   r)   r
   rø   rn   r   r0   Úaddr+   r^   ÚCallArguments)r   r   Ú
positionalÚnamedÚargument_namesÚargr    r    r!   rñ   }  s2   






zFluentParser.get_call_argumentsc                 C   sl   d}|  d¡ 	 | dd„ ¡}|sn|dkr||  |¡7 }n||7 }q|jtkr,tdƒ‚|  d¡ t |¡S )NrT   rÊ   Tc                 S   s   | dko| t kS )NrÊ   rX   rY   r    r    r!   r[   ¨  s    z)FluentParser.get_string.<locals>.<lambda>rÉ   ÚE0020)r_   r`   rÑ   r'   r   r   r
   rå   )r   r   rq   rg   r    r    r!   rï   ¡  s   
ù
	

zFluentParser.get_stringc                 C   s.   |  ¡ r	|  |¡S |jdkr|  |¡S tdƒ‚)NrÊ   ÚE0014)rî   r†   r'   rï   r   rR   r    r    r!   r÷   ·  s
   


zFluentParser.get_literal)T)>rº   r»   r¼   Ú__doc__Úboolr$   rb   r
   r1   r7   Ú	EntryTyper;   r   r(   r<   r#   r   r*   rc   rd   rN   r,   rQ   r-   rO   rv   rx   r   rm   r€   rj   rœ   rˆ   r   r‘   r˜   r›   r†   r¯   rl   r    Ú
SyntaxNoder§   rÀ   r¿   r¨   r®   r­   rÑ   rÐ   r¬   ÚInlineExpressionrè   rØ   rà   rø   rú   r  rñ   rå   rï   r÷   r    r    r    r!   r      sz    -$(+ÿþ
ý1þ2 2ÿþ#$r   )rò   Útypingr   r   r   r   r   r   r   rT   r
   Ústreamr   r   Úerrorsr   r  r   r#   r   r    r    r    r!   Ú<module>   s    $"