U
    e"                    @   s	  d dl mZ d dlZejeeeeeeeeeeeeeeeeeeeeeeeejejeed d dlm	Z	 d dl
Z
d dlZd dlmZmZ d dlmZmZ ddlmZmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddl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% ddlm&Z& ddlm'Z' ej(d  dkZ)ej*dkZ+dZ,G dd deZ-dddZ.dd Z/dd Z0d d! Z1d"d# Z2d$d% Z3d&d' Z4d(d) Z5d*d+d,Z6d-d. Z7d/d0 Z8d1d2 Z9d3d4 Z:d5d6 Z;d7d8 Z<d9d: Z=d;d< Z>d=d> Z?d?d@ Z@eeAeAdAZBdBdC ZCdDdE ZDdFdG ZEdHdI ZFdJdK ZGdLdM ZHdNdO ZIdPdQ ZJdRdS ZKdTdU ZLdVdW ZMdXdY ZNdZd[ ZOd\d] ZPd^d_ ZQd`da ZRddcddZSdedf ZTdgdh ZUdidj ZVdkdl ZWdmdn ZXdodp ZYdqdr ZZdsdt Z[ddudvZ\dwdx Z]dydz Z^d{d| Z_d}d~ Z`dd ZadddZbdd ZcdddZddd Zedd dD \ZfZgdd Zhdd Zidd Zjdd Zkdd Zldd Zmdd Zndd Zodd ZpdddZqdddZrdddZsdd Ztdd Zudd Zvdd ZweeAeAdZxdd Zydd Zzdd Z{dd Z|dd Z}dd Z~dddZdd Zdd Zdd ZddÄ Zddń ZdddǄZddɄ Zdd˄ Zdd̈́ Zddτ ZeeAeAdЃZdd҄ ZddԄ Zddք Zdd؄ ZdddۄZddd݄Zdd߄ Zdd ZeeAeAdZdd Zdd ZdddZdd Zdd Zdd Zdd ZdddZdd Zdd Zdd ZdddZdddZdd Zdd  Zdd ZdddZdddZe- fddZdd	d
ZdddZdddZdd ZeeAeAdZdddZdddZdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% ZeeAeAd&Zeed'd'd(d(d(d'd(d)d*ZeeAeAd+ZeeAeeB eAeB ZeeAeAd,Zd-d. Zd/d0 Ze- d d d d d d fd1d2Zd3d4 Zd5d6 ZeeAeAd7Zd8d9 Zd:d; Zd<d= ZÐd>d? ZeeAeAd@Ze- d d d d dfdAdBZƐdCdD ZǐddEdFZȐdGdH ZɐdIdJ ZʐdKdL ZːdMdN Z̐dOdP Z͐dQdR ZΐdSdT ZϐdUdV ZАdWdX ZѐdYdZ ZҐd[d\ ZӐd]d^ ZԐd_d` ZՐdadb Z֐dcdd Zאdedf ZؐddgdhZِddjdkZڐddldmZېdndo Zܐdpdq Zݐdrds Zސdtdu Zߐdvdw Zdxdy Zdzd{ Zde-fd|d}Zeee
d~jZdd Ze-fddZdd Zdd Zdd ZdddZdd ZdS (      )absolute_importN)Nodes	ExprNodesEncodedStringbytes_literalStringEncodingFileSourceDescriptorlookup_unicodecharunicode_categoryFutureOptionserrorwarningBuiltin
ModuleNodeUtils_unicode_bytesresys_parse_escape_sequences_parse_escape_sequences_rawpartialreduce_IS_PY3_IS_2BYTE_UNICODE_CDEF_MODIFIERSCOMMON_BINOP_MISTAKES)StringIO)lookupcategory)r   r      )PyrexScannerr   tentatively_scan)r   )r   )r   )r   )r   r   r   r   )r   )r   r      )r   )r   )r      i  )inlinenogilapic                   @   sD   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdd Zdd	 ZdS )
Ctxotherprivater   NFc                 K   s   | j | d S N)__dict__update)selfkwds r1   ;/tmp/pip-unpacked-wheel-7k3cqui1/Cython/Compiler/Parsing.py__init__7   s    zCtx.__init__c                 K   s&   t  }|j}|| j || |S r,   )r)   r-   r.   )r/   r0   ctxdr1   r1   r2   __call__:   s
    
zCtx.__call__)__name__
__module____qualname__level
visibility	cdef_flagtypedef_flagr(   overridabler'   	namespace	templatesallow_struct_enum_decoratorr3   r6   r1   r1   r1   r2   r)   *   s   r)   Expected an identifierc                 C   s2   | j dkr$| j| j}|   |S | | d S NIDENT)sycontextintern_ustringsystringnextr   )smessagenamer1   r1   r2   p_identB   s
    
rM   c                 C   sD   g }| j dkr@|| j| j |   | j dkr6q@|   q|S )NrD   ,)rE   appendrF   rG   rH   rI   )rJ   namesr1   r1   r2   p_ident_listJ   s    


rQ   c                 C   s   |   }| j}|   ||fS r,   )positionrE   rI   )rJ   posopr1   r1   r2   p_binop_operatorZ   s    rU   c                 C   s`   || }| j |kr\t| \}}|| }t||||}|dkrtj| jjkrTd|_qd |_q|S )N/T)	rE   rU   r   
binop_noder   divisionrF   future_directivesZtruedivision)rJ   opsZ
p_sub_exprn1rT   rS   n2r1   r1   r2   p_binop_expr`   s    
r]   c                 C   sb   |   }|   | jdkr(g }d  }}nt| ddd\}}}| d t| }tj|||||dS )N:F)
terminator	annotated)argsstar_argstarstar_argZresult_expr)rR   rI   rE   p_varargslistexpectp_testr   Z
LambdaNode)rJ   rS   ra   rb   rc   exprr1   r1   r2   	p_lambdefo   s&    

  
  rh   c                 C   s    t | }| jdkr| d |S )N:=zAinvalid syntax: assignment expression not allowed in this context)p_test_allow_walrus_afterrE   r   )rJ   rg   r1   r1   r2   rf      s    

rf   c                 C   sh   | j dkrt| S |  }t| }| j dkr`|   t| }| d t| }tj||||dS |S d S )Nlambdaifelse)testZtrue_valZ	false_val)	rE   rh   rR   	p_or_testrI   re   rf   r   ZCondExprNode)rJ   rS   rg   rn   r*   r1   r1   r2   rj      s    


rj   c                 C   sR   t | }| jdkrN|  }|js.| jddd |   t| }tj|||dS |S )Nri   z=Left-hand side of assignment expression must be an identifierFfatallhsrhs)	rj   rE   rR   is_namer   rI   rf   r   ZAssignmentExpressionNode)rJ   rs   rR   rt   r1   r1   r2   p_namedexpr_test   s    
rv   orand)z||&&c                 C   s   t | dtS )Nrw   )p_rassoc_binop_expr
p_and_testrJ   r1   r1   r2   ro      s    ro   c                 C   s~   || }| j |krF|  }| j }|   t| ||}t||||}n4| j tkrzt| j  |krzt|  d| j |f dd |S )NzAFound the C operator '%s', did you mean the Python operator '%s'?r!   r:   )rE   rR   rI   rz   r   rW   r   r   )rJ   rT   Z	p_subexprr[   rS   r\   r1   r1   r2   rz      s    
rz   c                 C   s   t | dtS )Nrx   )rz   
p_not_testr|   r1   r1   r2   r{      s    r{   c                 C   s8   | j dkr,|  }|   tj|t| dS t| S d S )Nnotoperand)rE   rR   rI   r   ZNotNoder~   p_comparisonrJ   rS   r1   r1   r2   r~      s
    
r~   c                 C   sT   t | }| jtkrP|  }t| }t | }tj||||d}| jtkrPt| |_|S )N)operatorZoperand1operand2)	p_starred_exprrE   comparison_opsrR   p_cmp_opr   ZPrimaryCmpNodep_cascaded_cmpcascade)rJ   r[   rS   rT   r\   r1   r1   r2   r      s    
  

r   c                 C   s   | j dkrt| S t| S d S N*)rE   r   rf   r|   r1   r1   r2   p_test_or_starred_expr   s    
r   c                 C   s   | j dkrt| S t| S d S r   )rE   r   rv   r|   r1   r1   r2    p_namedexpr_test_or_starred_expr   s    
r   c                 C   s@   |   }| jdkr d}|   nd}t| }|r<t||}|S )Nr   TF)rR   rE   rI   
p_bit_exprr   ZStarredUnpackingNode)rJ   rS   Zstarredrg   r1   r1   r2   r      s    

r   c                 C   s@   |   }t| }t| }tj|||d}| jtkr<t| |_|S )N)r   r   )	rR   r   r   r   ZCascadedCmpNoderE   r   r   r   )rJ   rS   rT   r\   resultr1   r1   r2   r      s     

r   c                 C   sp   | j dkr"|   | d d}n>| j dkrR|   | j dkrL|   d}q`d}n| j }|   |dkrld}|S )Nr   inZnot_inisis_not<>!=)rE   rI   re   rJ   rT   r1   r1   r2   r     s    



r   )
<>==>=<=r   r   r   r   r   c                 C   s   t | dtS )N)|)r]   
p_xor_exprr|   r1   r1   r2   r      s    r   c                 C   s   t | dtS )N)^)r]   
p_and_exprr|   r1   r1   r2   r   %  s    r   c                 C   s   t | dtS )N)&)r]   p_shift_exprr|   r1   r1   r2   r   *  s    r   c                 C   s   t | dtS )N)<<>>)r]   p_arith_exprr|   r1   r1   r2   r   /  s    r   c                 C   s   t | dtS )N)+-)r]   p_termr|   r1   r1   r2   r   4  s    r   c                 C   s   t | dtS )N)r   @rV   %z//)r]   p_factorr|   r1   r1   r2   r   9  s    r   c                 C   s   t | S r,   )	_p_factorr|   r1   r1   r2   r   >  s    r   c                 C   s   | j }|dkr6| j }|  }|   t||t| S | js|dkrj|  }|   t| }tj||dS |dkrzt| S |dkr| j	dkrt
| S t| S )N)r   r   ~r   r   r   rD   sizeof)rE   rR   rI   r   Z	unop_noder   in_python_fileZAmpersandNode
p_typecastrH   p_sizeofp_power)rJ   rE   rT   rS   argr1   r1   r2   r   B  s"    r   c                 C   s   |   }|   t| }t|tj}t|tjtjtjf}|sV|sV|j	d krV| 
d t| dd}| jdkrz|   d}nd}| d t| }|rtj|||dS tj|||||dS )	NzUnknown typer!   empty?r   r   )base_type_noder   )	base_type
declaratorr   	typecheck)rR   rI   p_c_base_type
isinstancer   MemoryViewSliceTypeNodeTemplatedTypeNodeCConstOrVolatileTypeNodeCTupleBaseTypeNoderL   r   p_c_declaratorrE   re   r   r   ZCythonArrayNodeZTypecastNode)rJ   rS   r   Zis_memsliceZis_other_unnamed_typer   r   r   r1   r1   r2   r   U  s4    


r   c                 C   sl   |   }|   | d t| r:t| }tj||d}n$t| }t| dd}tj	|||d}| d |S )N(r   r!   r   r   r   ))
rR   rI   re   looking_at_exprrf   r   ZSizeofVarNoder   r   ZSizeofTypeNode)rJ   rS   r   noder   r   r1   r1   r2   r   s  s    
 
r   c                 C   s   |   }|   d}| jdkr*d}|   | jdkrT| jtkrT|rJt| nt| }n|rh| jd|dd d }|r~tj||dS tj	||dS d S )NFfromTr   z''yield from' requires a source argumentrS   rq   r   )
rR   rI   rE   statement_terminatorsrf   
p_testlistr   r   ZYieldFromExprNodeYieldExprNode)rJ   rS   Zis_yield_fromr   r1   r1   r2   p_yield_expression  s"    
 r   c                 C   s   t | }tj|j|dS )Nrg   )r   r   ExprStatNoderS   )rJ   Z
yield_exprr1   r1   r2   p_yield_statement  s    r   c                 C   s   | j dkr4d|jkr| d |j| _t| |ddS |rD| d n>| j dkrZt| ddS | j d	krx|   t| ddS | d
 d S )Ndefpxddef statement not allowed hereT)is_async_def7Decorators can only be followed by functions or classesforis_asyncwithz2expected one of 'def', 'for', 'with' after 'async')rE   r:   r   p_def_statementp_for_statementrI   p_with_items)rJ   r4   
decoratorsr1   r1   r2   p_async_statement  s    




r   c                 C   s   | j dkr"|  d dkr"t| S d }| jdkr@|  }|   t| }| jdkr^t| |}qH|rptj	||d}| jdkr|  }|   t
| }t|d||}|S )Nnewr   rD   await)r   [.r   **)rH   peek
p_new_exprrE   rR   rI   p_atom	p_trailerr   ZAwaitExprNoder   rW   )rJ   Z	await_posr[   rS   r\   r1   r1   r2   r     s"    


r   c                 C   s,   |   }|   t| }t| tj||dS )N)cppclass)rR   rI   r   p_callr   ZNewExprNode)rJ   rS   r   r1   r1   r2   r     s    r   c                 C   sT   |   }| jdkrt| |S | jdkr0t| |S |   t| }tj|||dS d S )Nr   r   )obj	attribute)rR   rE   r   p_indexrI   rM   r   AttributeNode)rJ   node1rS   rL   r1   r1   r2   r     s    



 r   Tc           
      C   s  |   }|   g }g }d}d}| jdkrP| jdkrh|rL| jd|   d |   |t|  d}n| jdkr|   |t|  d}nt| }| jdkr|   |js| jd	|jd | j	
|j}tj|j|d
}	t| }||	|f nB|r
| jd|jd |r&|s&|d | n||g d}| jdkrFqP|   q | jdkr|s|st|dkrt|d dkrt| |d d gg}| d |pg g|fS )NFr   r   %Non-keyword arg following keyword argrS   Tr   =z!Expected an identifier before '='valuerN   r   asyncr!   r   )rR   rI   rE   r   rO   rf   rv   ru   rS   rF   rG   rL   r   IdentifierStringNodelenp_genexpre   )
rJ   allow_genexprS   positional_argskeyword_argsZstarstar_seenZlast_was_tuple_unpackr   encoded_namekeywordr1   r1   r2   p_call_parse_args  s\    


 
 
r   c                    s  d } fdd|D }t ttj d|}|rg }g }|D ]r}t|trl|\}	}
|tj|	j|	|
d q<|j	r|
|j q<|r|tj|d j|dd g }|| q<|r|tj|d j|dd |rt|dkr|d j	r|d }ntj |d	}||fS )
Nc                    s2   g | ]*}t |tr tj |d ntj |dqS )ra   r   )r   listr   	TupleNodeZAsTupleNode.0r   r   r1   r2   
<listcomp>"  s   z,p_call_build_packed_args.<locals>.<listcomp>r   rS   keyr   r   T)key_value_pairsreject_duplicatesr!   )r   )r   r   r   rW   r   tuplerO   DictItemNoderS   is_dict_literalextendr  DictNoder   MergedDictNode)rS   r   r   keyword_dictZ	subtuples	arg_tuplekwargs
dict_itemsitemr  r   r1   r   r2   p_call_build_packed_args  sB    

    
r  c                 C   sl   |   }t| \}}|sFt|dkrFt|d trFtj|||d dS t|||\}}tj||||dS d S )Nr!   r   )functionra   )r  r   r   )	rR   r   r   r   r   r   ZSimpleCallNoder  ZGeneralCallNode)rJ   r  rS   r   r   r  r  r1   r1   r2   r   I  s       r   c           
      C   s   |   }|   t| \}}|rPt|d dkrP|d \}}tj||||d}n6t||}|rh|d }	ntj||d}	tj|||	d}| 	d |S )Nr   r$   )basestartstopr   r  index])
rR   rI   p_subscript_listr   r   SliceIndexNodemake_slice_nodesr  	IndexNodere   )
rJ   r  rS   
subscriptsis_single_valuer  r  r   indexesr  r1   r1   r2   r   Z  s(      

 
r   c                 C   sH   d}t | g}| jdkr@d}|   | jdkr0q@|t |  q||fS )NTrN   Fr  )p_subscriptrE   rI   rO   )rJ   r!  itemsr1   r1   r2   r  n  s    


r  c                 C   sb   |   }t| d}| jdkr"|gS |   t| d}| jdkrF||gS |   t| d}|||gS )N)r^   r^   )r^   rN   r  )rR   p_slice_elementrE   rI   )rJ   rS   r  r  stepr1   r1   r2   r#  {  s    




r#  c                 C   s   | j |krt| S d S d S r,   )rE   rf   )rJ   Z
follow_setr1   r1   r2   r%    s    
r%  c                 C   s   |  d d S )N...)re   r|   r1   r1   r2   expect_ellipsis  s    r(  c                 C   sB   g }|D ]4}t |dkr(||d  q|t| f|  q|S )Nr!   r   )r   rO   make_slice_node)rS   r   r   	subscriptr1   r1   r2   r    s    r  c                 C   s<   |st | }|st | }|s*t | }t j| |||dS )N)r  r  r&  )r   NoneNodeZ	SliceNode)rS   r  r  r&  r1   r1   r2   r)    s    


  r)  c           	      C   sN  |   }| j}|dkrb|   | jdkr8tj|g d}n| jdkrLt| }nt| }| d |S |dkrrt| S |dkrt	| S |dkrt
| S |dkrt|  t|S |d	krt| S |d
kr| j}|   tj||dS |dkr| jd d }|   tj||dS |dkrt| \}}}|dkr>tj||dS |dkrXtj|||dS |dkrptj||dS |dkrtj||dS |dkrtj|||dS | d|  n|dkr@| j}|dkrt|}n\|dkrtj|dd}nB|dkrtj|dd}n(|dkr*| js*t|}n
t| |}|   |S | d d S ) Nr   r   r   yieldr   {`r'  INTFLOATr   ZIMAGr   BEGIN_STRINGcu)r   bytes_valuebfvalues )r   unicode_valuezinvalid string kind '%s'rD   NoneTrueTFalseFZNULLz!Expected an identifier or literal)rR   rE   rI   r   r  r   p_testlist_compre   p_list_makerp_dict_or_set_makerp_backquote_exprr(  EllipsisNodep_int_literalrH   	FloatNodeImagNodep_cat_string_literalCharNodeUnicodeNode	BytesNodeJoinedStrNode
StringNoder   r+  BoolNoder   ZNullNodep_name)	rJ   rS   rE   r   r   kindr4  r:  rL   r1   r1   r2   r     sr    
















r   c                 C   s   |   }| j}|   d}d}|d dkrV|d dkr@|d7 }n|d7 }|d d }qd }|rdd}n|r|dks|| jjd	krd}| jr|rt|d
 d}tj|||||dS )Nr9  r   ZUuLlZLlLUTZLLr%   z4illegal integer literal syntax in Python source fileF)is_c_literalr   unsignedlongness)	rR   rH   rI   rF   language_levelr   r   r   IntNode)rJ   rS   r   rR  rS  rQ  r1   r1   r2   rC    s4    

rC  c                 C   sH   |   }| js:|| jkr:| j|}t||}|d k	r:|S tj||dS )NrL   )rR   compile_time_exprcompile_time_envZlookup_herewrap_compile_time_constantr   NameNode)rJ   rL   rS   r   r   r1   r1   r2   rM    s    
rM  c                    s  t |}|d krt S |tkr,t S t|trDtj |dS t|tr^tj	 ||dS t|t
rxtj ||dS t|trtj t |jtd|jd}|jrtj dtj t |j|jd||d}|S t|t rtj t|dS t|trt|d}tj ||dS t|trR fdd|D }d |krLtj |d	S d S n(tszt|trztj	 |d
|dS t d||jjf  d S )Nr   )r   constant_resultg        r   )r[  asciic                    s   g | ]}t  |qS r1   )rY  r  r   r1   r2   r  3  s   z.wrap_compile_time_constant.<locals>.<listcomp>r   rO  z4Invalid type for compile-time constant: %r (type %s))reprr   r+  EllipsisrB  r   boolrL  intrU  floatrD  complexrE  imagrealrW   r   rH  r   r   r   rI  r	  r  r   longrstripr   	__class__r7   )rS   r   repr   Zbvaluera   r1   r   r2   rY    sP    





   



rY  c                 C   s  |   }t| \}}}|dks(| jdkr2|||fS |g|g|g  }}}d  }}| jdkr|   }t| \}}	}
|dkrt|d qPn:||kr||hddhddhfkrd}nt|d||f  qP||	 ||
 || qP|dks|dkrd |krtt|| j}|d	kr0t	d
d
d |D }|dkrg }t||D ]8\}}t|trf||7 }n|tj|t	|d qH|||fS )Nr2  r1  zCCannot concatenate char literal with another string or char literalr6  r3  r9  zFCannot mix string literals of different types, expected %s'', got %s'')r5  r2  r9  r3  r9  c                 S   s   g | ]}|d k	r|qS r,   r1   )r  r3  r1   r1   r2   r  a  s      z(p_cat_string_literal.<locals>.<listcomp>r   )rR   p_string_literalrE   r   rO   r   r   Z
join_bytessource_encodingr   joinzipr   r   r   rH  )rJ   rS   rN  r4  r:  ZbstringsZustringsZ	positionsZ	next_kindZnext_bytes_valueZnext_unicode_valuer3  r1   r1   r2   rF  A  sD    


 




rF  r3  c                 C   s`   | j dkrd S |  }t| |\}}}|dkrF|dkrB| d| |S |dkrR|S | d d S )Nr1  r3  r6  zf-string not allowed herer5  z#internal parser configuration error)rE   rR   rj  r   )rJ   Zrequired_typerS   rN  r4  r:  r1   r1   r2   p_opt_string_literalm  s    
rn  c                 C   s   | D ]}|dkr dS qdS )N   TFr1   )stringr2  r1   r1   r2   check_for_non_ascii_characters|  s    rq  c                 C   sP  |   }| jjdk}d}|d |d |d t| j f}| jd }t|dkrtt|t|krrt|d d|krd	|krt|d
 d|krd|krt|d d	|krd|krt|d d|k}d|krt|dkrt|d d}n6d|krd}d}n$d|krd}nd	|krd	}nd}|dkrX|d krXt	j
| jjkrXt| j}	d	}nP|d k	rp|dkrp|}|dkrt }	n$|dkrt| j}	nt| j}	|   | j}
| j}|
dkr|	| |r|st|rd}n|
dkrP|r@|s|d	ks|d dkr@|	| |rN|sNt|rNd}nt||	||  nT|
dkrf|	d n>|
dkrvqn.|
dkr| jd|d n| d|
| jf  q|dkrd }|	 }t|dkr t|d|  nD|	 \}}|r |r t	j
| jjkr |dkr| jd |d d }|dkr>t| ||d|kd!}|   |||fS )"Nr%   Fr   r!   r$   z"'z!Duplicate string prefix characterr5  r3  z*String prefixes b and u cannot be combinedr6  z*String prefixes b and f cannot be combinedz*String prefixes u and f cannot be combinedrr2  z+Invalid string prefix for character literalTr9  Zub)r3  r6  ZCHARSESCAPEZUuNEWLINE
Z
END_STRINGEOFzUnclosed string literalr   z(Unexpected token %r:%r in string literalzinvalid character literal: %rz0bytes can only contain ASCII literal characters.)is_raw)rR   rF   rT  r   rH   rf  lowersetr   r   unicode_literalsrY   r   ZStrLiteralBuilderrk  UnicodeLiteralBuilderZBytesLiteralBuilderrI   rE   rO   rq  _append_escape_sequenceZgetcharZ
getstrings
p_f_string)rJ   Zkind_overriderS   Zis_python3_sourceZ has_non_ascii_literal_charactersZstring_start_posZkind_stringrw  rN  charsrE   Zsystrr:  r4  r1   r1   r2   rj    s    
 






$





$



 


rj  c              	   C   s&  |d }|dkr,| t|dd  d n|dkrB|| n|dkr^|t| n|dkrjn|dkrt|dkr| t|d	d  d
 n|jd| dd nt|dkr| dkrd}|dkrd }zt|dd }t|}W n t	k
r*   |jdt
|dd d dd Y n tk
r   |d k	rtrt|d	krt|d dkrt|d dkrdt|d d  dt|d d  ? }n Y nX nPt|dkrt|d	d  d
}|dkr |d|  d}n|jd| dd |dkr"||| n
|| d S )Nr!   01234567   z'"\Zabfnrtvru  x   r$      zInvalid hex escape '%s'Frp   ZNUu)r3  r6  r9  r   Nr%   z!Unknown Unicode character name %sr3  r   Csi   i   
   i   )   r  i zInvalid unicode escape '%s')Zappend_charvalr`  rO   r   Zchar_from_escape_sequencer   r   r	   ordKeyErrorr]  lstrip	TypeErrorr   r
   Zappend_uescape)rN  builderZescape_sequencerJ   r2  ZchrvalZucharr1   r1   r2   r|    sV    

*


r|  c                 C   s.   g | ]&}t d |rdnd d djqS )s   (\\(?:s   \\?s]   [\\abfnrtv"\'{]|[0-7]{2,3}|N\{[^}]*\}|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8}|[NxuU]|s   )?|\{\{?|\}\}?|[^\\{}]+)zus-ascii)r   compiledecodematch)r  rw  r1   r1   r2   r    s   
r  )TFc                 C   s   | d | d | d | d fS )Nr   r!   r$   r1   )rS   rp  ir1   r1   r2   _f_string_error_pos,  s    r  c                 C   sj  g }d}t |}t }|r tnt}||k rF|}	|||}
|
d krVtt|||d |
 }|
 }|d }|dkr|st |dkrt	d|||  n
|
| q$|dkr|dkr|
d nD|jr|
tj|| d t }t| ||||\}}|| q$|d	kr:|d
kr&|
d	 ntt|||	d q$|
| q$|jrf|
tj|| d |S )Nr   zInvalid escape sequence\r!   r6  r-  z{{r   }z}}z#f-string: single '}' is not allowed)r   r   r{  r   r   r   r  endgroupr|  rO   r~  r   rH  Z	getstringp_f_string_exprr  )rJ   r:  rS   rw  r8  Z
next_startsizer  Z
_parse_seqr  r  partr2  Z
expr_nodesr1   r1   r2   r}  0  sF    




r}  c                 C   s  |}t |}d  } }}	d }
d }d}d}|}d}d}||kr@q|| }||kr|dkrt|sntt|||d d}nN||kr|r|d |k r||d  |kr||d  |krd}|}|d7 }n|}n|d	kr|}|d |k r||d  |kr||d  |krd}|d7 }n|d
kr(|d7 }n|dkrF|dkrF|d8 }n|dkrdtt|||d nf|dkr|dkr|d |k r|dkr||d  dkr|d7 }q4n|dkr|d7 }q4|}q|d7 }q4||| dddd}|d |d |d | d f}| s*tt|||d |dkr~|d7 }||k r`||  r`|d7 }q<||k r~|| }||| }|dkr|d7 }|d |krn|| }|d7 }|| }|dkrd}d}d}|d }||krq|| }|s2|s2|dkr|d7 }n&|dkr2|dkr*|d8 }n|}q|d	kr|s|d |k r||d  |kr||d  |kr| }|d7 }n|s| }|d7 }q||| }
|r|d kr|
d krd}|dkrtt|||d|rd| nd  td| }t||d | | j|d}t	|}|d k	rFt
j|sFt|d |  |
rdt
j|t| |
||d!}	g }|r|t
j|t|d" |t
j||||	d# |d |fS )$Ni   @r   Fr  z$backslashes not allowed in f-stringsTr$   r!   z'"z{[(z}])#zformat string cannot include #z><=!:}z!=><r   z><z
ru  z(empty expression not allowed in f-string!r^   r-  r  rr  z'missing '}' in format string expressionz, found '%s'r9  z(%s))Zparent_scannerrk  Zinitial_posz!invalid conversion character '%s'r7  r   )r   conversion_charformat_spec)r   r   r  replacestripisspacer   r"   rk  r   r   ZFormattedValueNodeZfind_conversion_funcrJ  r}  rO   rH  r   r   )rJ   r:  rS   Zstarting_indexrw  r  r  r  Zterminal_charr  Zformat_spec_strZ	expr_textZNO_CHARZnested_depth
quote_charZin_triple_quotesZbackslash_reportedr2  Zexpr_strZexpr_posZ	in_stringZstart_format_specbufscannerrg   Znodesr1   r1   r2   r  _  s    ,

2


















8

r  c                 C   s   |   }|   | jdkr2| d tj|g dS t| }| jdkr|jrT| d tj	||d}t
| |}| d tj|||tj| jjdkdS | jdkr|   t| |}n|g}| d tj||dS )	Nr  r   r   2iterable unpacking cannot be used in comprehensionr   r%   )looprO   typeZhas_local_scoperN   )rR   rI   rE   re   r   ListNoder   
is_starredr   ComprehensionAppendNode
p_comp_forComprehensionNoder   Z	list_typerF   rT  %p_namedexpr_test_or_starred_expr_list)rJ   rS   rg   rO   r  exprsr1   r1   r2   r?    s2    





   


r?  c                 C   s0   | j dkrt| |S | j dkr(t| |S |S d S )Nr   rl   )rE   r  	p_comp_if)rJ   bodyr1   r1   r2   p_comp_iter  s
    



r  c                 C   s^   |   }d}| jdkr"d}|   | d t| d|d}|jd t| ||d tj|f|S )NFr   Tr   allow_testlistr   )else_clauser  r   )	rR   rE   rI   re   p_for_boundsr.   r  r   ForStatNode)rJ   r  rS   r   kwr1   r1   r2   r     s    

r  c                 C   s<   |   }|   t| }tj|tj||t| |dgd dS )N	conditionr  
if_clausesr  )rR   rI   ro   r   
IfStatNodeIfClauseNoder  )rJ   r  rS   rn   r1   r1   r2   r  .  s    r  c                 C   s  |   }|   | jdkr0|   tj|g dS g }d}d}| jdkr|dkrb| jdkr\dnd}n.|t| jkr| d	| j|dkrd
ndf  |   | jdkr| d t| }|| d}nzt	| }|dkr| jdkrdnd}|dkr| 
d |}t	| }tj|j||d}|r.|d | n||g d}| jdkrj|   | jdkrhqjq<qjq<| jdkrrt|dkr0t|d tr0t|d dkr0|d d }|dkrt|tjstt|tj}tj|j|j|jd}	ntj}tj|j|d}	t| |	}
| 
d tj||
|	|dS t|dkrZt|d tsZ| d n
| 
d tj|g dS | 
d |dkr4g }g }|D ]L}t|tr|| n.|r|tj|d j|d g }|| q|r |tj|d j|d t|dkr"|d jr"|d S tj||tjdS g }g }|D ]L}t|tr\|| n.|r|tj|d j|d g }|| q@|r|tj|d j|d t|dkr|d jr|d S tj||ddS d S )Nr  r  r   Fr   r   r   r!   r$   z%unexpected %sitem found in %s literalry  dictzexpected expression, found '*'r^   )r  r   r   TrN   r   )Zkey_exprZ
value_exprr   )r  rO   r  r  r   )ra   r  )r   r  ) rR   rI   rE   r   r  r   r   r   rO   rf   re   r
  rS   r   r   AssertionErrorr  r   	dict_typeZDictComprehensionAppendNoder  r   set_typer  r  r  r  ZSetNodeZis_set_literalZMergedSequenceNoder  r  )rJ   rS   partsZtarget_typeZlast_was_simple_itemr  r  r   Zcomprehension_typerO   r  r$  Z	set_itemsr  r  r1   r1   r2   r@  D  s    

 




0
  




r@  c                 C   sx   |   }|   t| g}| jdkr<|   |t|  q| d t|dkr\|d }ntj||d}tj	||dS )NrN   r.  r!   r   r   r   )
rR   rI   rf   rE   rO   re   r   r   r  ZBackquoteNode)rJ   rS   ra   r   r1   r1   r2   rA    s    



rA  c                 C   sD   |d k	r|gpg }| j tkr@|t|  | j dkr6q@|   q|S NrN   )rE   expr_terminatorsrO   rf   rI   rJ   rg   r  r1   r1   r2   p_simple_expr_list  s    


r  c                 C   sD   |d k	r|gpg }| j tkr@|t|  | j dkr6q@|   q|S r  )rE   r  rO   r   rI   r  r1   r1   r2   p_test_or_starred_expr_list  s    


r  c                 C   sD   |d k	r|gpg }| j tkr@|t|  | j dkr6q@|   q|S r  )rE   r  rO   r   rI   r  r1   r1   r2   r    s    


r  c                 C   sB   |   }t| }| jdkr:|   t| |}tj||dS |S d S NrN   r   )rR   rf   rE   rI   r  r   r  rJ   rS   rg   r  r1   r1   r2   r     s    

r   c                 C   sB   |   }t| }| jdkr:|   t| |}tj||dS |S d S r  )rR   r   rE   rI   r  r   r  r  r1   r1   r2   p_testlist_star_expr  s    

r  c                 C   sV   |   }t| }| jdkr:|   t| |}tj||dS | jdkrNt| |S |S d S )NrN   r   r   )rR   r   rE   rI   r  r   r  r   r  r1   r1   r2   r>    s    



r>  c                 C   s2   t | tj|jtj|j|dd}tj|j|dS )Nr   r   )r  )r  r   r   rS   r   r   ZGeneratorExpressionNode)rJ   rg   r  r1   r1   r2   r     s
     r   )r   r  r  r^   r   rt  c                 C   s&   |   }|   t| }tj||dS N)rP   )rR   rI   rQ   r   Z
GlobalNoderJ   rS   rP   r1   r1   r2   p_global_statement  s    r  c                 C   s&   |   }|   t| }tj||dS r  )rR   rI   rQ   r   ZNonlocalNoder  r1   r1   r2   p_nonlocal_statement  s    r  c                 C   s  t | }d}| jdkr>|js(|js(|jr>d}|   t| |_| jdkr^|jr^| j	d|j
d |g}| jdkr|   | jdkrt| }nt | }|| qdt|dkrxtd	| jr`|d
 }t|tjrtj|j
|jt|j
|j|jd}n$t|tjtjtjfst	|j
d | jd d }|   | jdkrDt| }nt| }tj|j
|||dS |d
 }tj|j
|dS |d }t|dkrtj|j
|d
 ||dS tj|j
|d d |dS d S )NFr^   Tr   zqa starred assignment target must be in a list or tuple - maybe you meant to use an index assignment: var[0] = ...r   r,  r!   z([-+*/%^&|]|<<|>>|\*\*|//|@)=r   r  z&Illegal operand for inplace operation.r   )r   rs   rt   r   r$   )rs   rt   first)Zlhs_listrt   ) r  rE   ru   Zis_subscriptZis_attributerI   p_annotation
annotationr  r   rS   r   rO   r   r   r  r   r   r  r  r  r)  r  r  r   rZ  r   r   ZInPlaceAssignmentNoder   SingleAssignmentNodeZCascadedAssignmentNode)rJ   rg   Zhas_annotationZ	expr_listrs   r   rt   r1   r1   r2   p_expression_or_assignment#  sP    




r  c                 C   s   |   }d}|   | jdkrL|   t| }| jdkrP|   | jdk}nd }g }| jdkr|t|  | jdkr|   | jdkrd}q|t|  qltj||d}tj|||| dS )Nr   r   rN   rt  rv  r!   r   )r  streamZappend_newline)	rR   rI   rE   rf   rO   r   r  r   ZPrintStatNode)rJ   rS   Zends_with_commar  ra   r  r1   r1   r2   p_print_statementV  s2    




 r  c                 C   s   |   }|   t| }t|tjrZd}|j}t|dkrd| jdt| |dd |g}n
d}|g}| j	dkr|r| jddd |   |
t|  | j	d	kr|   |
t|  tj||d
S )NT)r$   r%   z.expected tuple of length 2 or 3, got length %dFr   r   z@tuple variant of exec does not support additional 'in' argumentsrp   rN   r   )rR   rI   r   r   r   r  ra   r   r   rE   rO   rf   r   ZExecStatNode)rJ   rS   codeZtuple_variantra   r1   r1   r2   p_exec_statementr  s2     

r  c                 C   s&   |   }|   t| }tj||dS )Nr   )rR   rI   r  r   ZDelStatNode)rJ   rS   ra   r1   r1   r2   p_del_statement  s    r  c                 C   s.   |   }| d |r$| jddd t|S )NpassExpected a newlineTZignore_semicolon)rR   re   expect_newliner   PassStatNode)rJ   with_newlinerS   r1   r1   r2   p_pass_statement  s
    
r  c                 C   s   |   }|   t|S r,   )rR   rI   r   ZBreakStatNoder   r1   r1   r2   p_break_statement  s    r  c                 C   s   |   }|   t|S r,   )rR   rI   r   ZContinueStatNoder   r1   r1   r2   p_continue_statement  s    r  c                 C   s6   |   }|   | jtkr$t| }nd }tj||dS )Nr   )rR   rI   rE   r   r   r   ZReturnStatNode)rJ   rS   r   r1   r1   r2   p_return_statement  s    

r  c                 C   s   |   }|   d }d }d }d }| jtkrt| }| jdkrh|   t| }| jdkr|   t| }n| jdkr|   t| }|s|s|rtj|||||dS t|S d S )NrN   r   )exc_type	exc_valueexc_tbcause)rR   rI   rE   r   rf   r   ZRaiseStatNodeZReraiseStatNode)rJ   rS   r  r  r  r  r1   r1   r2   p_raise_statement  s2    




r  c           
      C   s   |   }| j}|   t| ddg}| jdkrJ|   |t| dd q$g }tj| jjk}|D ]~\}}}}|dkrt	j
||||d}	nLt	j|tj||p|dtj|tj||d|rdnd d	|ko|d kd d
d}	||	 q`t	j||dS )Nr!   
as_allowedrN   cimport)module_nameas_nameis_absoluterV  r   r   r   )r  r:   Zget_top_level_module	name_listrr   stats)rR   rE   rI   p_dotted_namerO   r   r   rF   rY   r   ZCImportStatNoder  r   rZ  
ImportNoder   StatListNode)
rJ   rS   rN  r$  r  r  target_namedotted_namer  statr1   r1   r2   p_import_statement  s<    

	r  c              	   C   s  |   }|   | jdkrBd}| jdkrF|t| j7 }|   qnd }|d k	rp| jdkrp|   | jd }}n.|d krtj| jjkrd}t	| dd\}}}}| jdkr| 
d | j}|   |dk}d}	| jd	kr|   | jd	d fg}
|   n"| jd
krd}	|   t| g}
| jdkrV|   |	rD| jdkrDqV|
t|  q|	rf| d |dkr|s| 
d n|r| 
d nz|
D ]t\}}}|dkr| 
d|  qztt|}W n. tk
r   | 
d| | Y  qY nX | jj| qt|S |r0tj||||
dS g }g }|
D ]>\}}}|tj||d ||tj||pn|df q<tj|
d d |d}tj|tj|tj||d||d|dS d S )N)r   r'  r   importr  r9  Fr  zExpected 'import' or 'cimport'r  r   r   TrN   r   
__future__z?from __future__ imports must occur at the beginning of the filezinvalid syntaxZbracesznot a chancez future feature %s is not defined)r  Zrelative_levelimported_namesr   rV  r   )r  r:   r  )moduler$  )rR   rI   rE   r   rF   rG   r   r   rY   r  r   p_imported_namerO   re   getattrAttributeErroraddr   r  ZFromCImportStatNoder   r   rZ  r  ZFromImportStatNoder  )rJ   first_statementrS   r:   Zdotted_name_posr  _rN  Z
is_cimportZis_parenthesizedr  name_posrL   r  	directiveZimported_name_stringsr$  Zimport_listr1   r1   r2   p_from_import_statement  s    










 
 r  c                 C   s"   |   }t| }t| }|||fS r,   )rR   rM   	p_as_name)rJ   rS   rL   r  r1   r1   r2   r  @  s    r  c                 C   sb   |   }t| }d }|g}| jdkr<|   |t|  q|rHt| }||| jd||fS )Nr   )	rR   rM   rE   rI   rO   r  rF   rG   rl  )rJ   r  rS   r  r  rP   r1   r1   r2   r  G  s    
r  c                 C   s,   | j dkr$| jdkr$|   t| S d S d S )NrD   as)rE   rH   rI   rM   r|   r1   r1   r2   r  T  s    r  c                 C   sH   |   }|   t| }| jdkr4|   t| }nd }tj|||dS )NrN   )r  r   )rR   rI   rf   rE   r   ZAssertStatNode)rJ   rS   Zcondr   r1   r1   r2   p_assert_statement\  s    

r
  );rt  rv  c                 C   sT   |   }|   t| g}| jdkr<|   |t|  qt| }tj|||dS )Nelifr  )rR   rI   p_if_clauserE   rO   p_else_clauser   r  )rJ   rS   r  r  r1   r1   r2   p_if_statementl  s    

 r  c                 C   s(   |   }t| }t| }tj|||dS )Nr  )rR   rv   p_suiter   r  )rJ   rS   rn   r  r1   r1   r2   r  x  s     r  c                 C   s"   | j dkr|   t| S d S d S )Nrm   )rE   rI   r  r|   r1   r1   r2   r    s    
r  c                 C   s:   |   }|   t| }t| }t| }tj||||dS )N)r  r  r  )rR   rI   rv   r  r  r   ZWhileStatNode)rJ   rS   rn   r  r  r1   r1   r2   p_while_statement  s     r  Fc                 C   sL   |   }|   t| d|d}t| }t| }|j|||d tj|f|S )NTr  )r  r  r   )rR   rI   r  r  r  r.   r   r  )rJ   r   rS   r  r  r  r1   r1   r2   r     s    r   c                 C   s   t | }| jdkr4|   t| ||d}t||dS | js|s| jdkr^|   t| }n
|d  }}t| }|  }t	| }|  }	t| }
t| }t
| }|d krtj||d}n(|jst|jd n||jkrt|d |d |
d krt|	d	 t||||
||d
S | d i S d S )Nr   r   )targetiteratorr   rV  z4Target of for-from statement must be a variable namez5Variable name in for-from range does not match targetr   z,Relation directions in for-from do not match)r  bound1Z	relation1Z	relation2bound2r&  )p_for_targetrE   rI   p_for_iteratorr  r   r   p_for_from_relationrR   rM   p_for_from_stepr   rZ  ru   r   rS   rL   re   )rJ   r  r   r  r  r  Zrel1Z	name2_posZname2Zrel2_posZrel2r  r&  r1   r1   r2   r    sP    





r  c                 C   s*   | j tkr| j }|   |S | d d S )Nz#Expected one of '<', '<=', '>' '>=')rE   inequality_relationsrI   r   r   r1   r1   r2   r    s
    
r  c                 C   s0   | j dkr(| jdkr(|   t| }|S d S d S )NrD   Zby)rE   rH   rI   r   )rJ   r&  r1   r1   r2   r    s
    r  )r   r   r   r   c                 C   sl   |   }t| }| jdkrd|   |g}| j|krV|t|  | jdkrLqV|   q(tj||dS |S d S r  )rR   r   rE   rI   rO   r   r  )rJ   r_   rS   rg   r  r1   r1   r2   p_target  s    



r  c                 C   s
   t | dS )Nr   )r  r|   r1   r1   r2   r    s    r  c                 C   s6   |   }|rt| }nt| }|r(tjntj||dS )N)sequence)rR   r   ro   r   ZAsyncIteratorNodeZIteratorNode)rJ   r  r   rS   rg   r1   r1   r2   r    s
    
r  c                 C   s   |   }|   t| }g }d }| jdkr~| jdkrD|t|  q*| jdkr^|   t| }tj||||d}| jdkr~|S | jdkr|   t| }tj|||dS | 	d d S )N)exceptrm   r  rm   )r  except_clausesr  finally)r  finally_clausezExpected 'except' or 'finally')
rR   rI   r  rE   rO   p_except_clauser   ZTryExceptStatNodeZTryFinallyStatNoder   )rJ   rS   r  r  r  r   r1   r1   r2   p_try_statement  s4    


 

 r"  c                 C   s   |   }|   d }d }d}| jdkrt| }t|tjrB|j}n|g}| jdksr| jdkr| jdkr| j	j
dkr|   t| }n>| jdkr| jdkr|   |   }t| }tj||d}d}t| }tj|||||d	S )
NFr^   rN   rD   r	  r$   rV  T)patternr  r  is_except_as)rR   rI   rE   rf   r   r   r  ra   rH   rF   rT  rM   rZ  r  r   ZExceptClauseNode)rJ   rS   r  r  r$  pos2rL   r  r1   r1   r2   r!    s8    


  r!  c           
   	   C   s   |   }|   t| dd }| d | jr|}| j||}|r| j| t	
|.}t|}t||| |j| jd}t||}	W 5 Q R X |	S d S n
t|S d S )Nr3  r$   z!Syntax error in include statement)rk  parse_comments)rR   rI   rj  r  compile_time_evalrF   Zfind_include_fileZincluded_filesrO   r   Zopen_source_filer   r"   encodingr&  p_statement_listr   r  )
rJ   r4   rS   Zunicode_include_file_nameZinclude_file_nameZinclude_file_pathr6  Zsource_descs2treer1   r1   r2   p_include_statement1  s     
r,  c                 C   s.   |    | jdkr"| js"t| }nt| }|S )Ntemplate)rI   rH   r   p_with_templater   )rJ   r   r1   r1   r2   p_with_statementF  s
    
r/  c           	   	   C   s   d}d}| j dkr\t| 6}|   t| |}| d | j dkrL| d W 5 Q R X | }|sjt| |}t| }t|D ]\}}}||fd|i|}qz|S )a  
    Copied from CPython:
    | 'with' '(' a[asdl_withitem_seq*]=','.with_item+ ','? ')' ':' b=block {
        _PyAST_With(a, b, NULL, EXTRA) }
    | 'with' a[asdl_withitem_seq*]=','.with_item+ ':' tc=[TYPE_COMMENT] b=block {
        _PyAST_With(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) }
    Therefore the first thing to try is the bracket-enclosed
    version and if that fails try the regular version
    Fr1   r   r   r^   r9  r  )rE   r#   rI   p_with_items_listre   r   r  reversed)	rJ   r   Zbrackets_succeededr$  errorsr  clsrS   r0   r1   r1   r2   r   O  s     






r   c                 C   s:   g }| t| | | jdkr q6|   | jdkrq6q|S )NrN   r   )rO   p_with_itemrE   rI   )rJ   r   r$  r1   r1   r2   r0  o  s    

r0  c                 C   s   |   }| jsx| jdkrx| jdkrx|r0| d | j}|   d }| jdkrf|   t| }| d tj	|||dfS t| }d }| jdkr| jdkr|   t
| }tj||||dfS d S )	NrD   )r'   gilzwith gil/nogil cannot be asyncr   r   )stater  r	  )managerr  r   )rR   r   rE   rH   r   rI   rf   re   r   ZGILStatNoder   ZWithStatNode)rJ   r   rS   r6  r  r7  r  r1   r1   r2   r4  |  s$    


r4  c                 C   s   |   }g }|   | d || j |   | jdkrZ|   || j |   q2| d | jdkr|   | d |   t }||_	t
| ||}|   |S t|d d S )Nr   rN   r  r^   z-Syntax error in template function declaration)rR   rI   re   rO   rH   rE   r  expect_indentr)   r@   p_c_func_or_var_declarationexpect_dedentr   )rJ   rS   r@   body_ctxZfunc_or_varr1   r1   r2   r.    s*    





r.  c                 C   s0  | j dkrt| }n| j dkr,t| }n | j dkr@t| }n| j dkrTt| }n| j dkrht| }n| j dkr|t| }n| j dkrt| }n| j dkrt| }n| j d	krt	| }nt| j d
krt
| }n`| j dkrt| |d}nH| j dkrt| }n4| j dkrt| }n| j dkr$t| }nt| }|S )Nglobalnonlocalprintexecdelbreakcontinuereturnraiser  r   r  r,  assertr  )rE   r  r  r  r  r  r  r  r  r  r  r  r   r
  r  r  )rJ   r  r   r1   r1   r2   p_simple_statement  s<    






















rG  c                 C   s   t | |d}|j}g }t|tjs,|| | jdkrt|   | jdkrJqtt | |d}t|tjrdq,|| d}q,|st|}n$t|dkr|d }ntj	||d}| jdkrt|tj
r|jjr|jjdkr| d	| | d
 |S )NrE  r  r  Fr!   r   r  cdefz@The 'cdef' keyword is only allowed in Cython files (pyx/pxi/pxd)z%Syntax error in simple statement list)rG  rS   r   r   r  rO   rE   rI   r   r  r   rg   ru   rL   r   r  )rJ   r4   r  r  rS   r  r1   r1   r2   p_simple_statement_list  s2    






rI  c                 C   s   | j }d| _ t| }|| _ |S )Nr!   )rW  r   )rJ   oldrg   r1   r1   r2   p_compile_time_expr  s
    rK  c                 C   sd   |   }| j}|   t| }| d t| }| jrL||}||| | j	ddd t
|S )Nr   r  Tr  )rR   rX  rI   rM   re   rK  r'  compile_time_valuedeclarer  r   r  )rJ   rS   denvrL   rg   r   r1   r1   r2   p_DEF_statement  s    

rO  c           	      C   s   |   }| j}|}| j}d }|   t| }|o<t||| _t| |}| jrX|}d}| jdkrqfq| jdkr|   || _t| |}|r|}|st	
|}|| _|S )Nr   ZELIFELSE)rR   r'  rX  rI   rK  r_  rL  r  rE   r   r  )	rJ   r4   rS   Z
saved_evalZcurrent_evalrN  r   rg   r  r1   r1   r2   p_IF_statement	  s0    




rQ  c           
      C   s  |j }d }| jdkr2|jdkr(| d t| |S | jdkrDt| S | jdkrjt|  ddd t| |S | jd	kr|jd
kr| d |j| _t	| }|j
s| jdkr| jdkr| jdkrq| d n| jdkr|rt| ddS d}| jdkrd}|   n| jdkrd}d}|   |r|jdkr:| d |j| _t| ||d}|d k	rtjtjtjf}|j
r|tjtjf7 }t||s| d ||_|S |jr| jddd n
| jdkrd|jkr|jdkr| d |j| _t| |S | jdkr*|jd kr | d! t| |S | jd"krV|jdkrL| d# t| |S |jd$kr| jdkr| jd%krt| S | jdkr|jd%krt| d&dS |jd'krt| }|d k	r|S | d( | jd)krt| S | jd*krt| S | jd+krt| S | jd,kr"t | S | jd-kr6t!| S | jdkrV|   t"| ||S | jdkr| jdkr| j}|  }	|   | jdkrt"| ||S |r| d | #d||	 t$| ||d.S d S )/Nctypedefr  
module_pxdz#ctypedef statement not allowed hereZDEFZIFzThe 'IF' statement is deprecated and will be removed in a future Cython version. Consider using runtime conditions or C macros instead. See https://github.com/cython/cython/issues/4310r!   r}   r   )r  classc_classr  propertyrT  c_class_pxdr*   zdecorator not allowed here)r   rH  cpdefrU  r   rD   r   r   r  )r  r   rH  rY  )r  rT  r  rV  rX  zcdef statement not allowed here)r>   %'api' not allowed with this statementFrp   r   r   rX  r   rU  )r  r  rU  r*   z!class definition not allowed hereincludez"include statement not allowed hererV  rW  T)rX  rW  z%Executable statement not allowed hererl   whiler   tryr   rE  )%r<   rE   r:   r   p_ctypedef_statementrO  r   rR   rQ  p_decoratorsrA   rH   r  rI   p_cdef_statementr   CFuncDefNodeCVarDefNodeCClassDefNodeCStructOrUnionDefNodeCEnumDefNoder   r   r(   r   p_class_statementr,  p_property_declp_ignorable_statementr  r  r   r"  r/  r   put_backrI  )
rJ   r4   r  r<   r   r>   r   tupZ
ident_nameZ	ident_posr1   r1   r2   p_statement&	  s    



















$


rk  c                 C   sv   |   }g }| jdkrBt| ||d}t|tjr2q|| d}q|sPt|S t|dkrd|d S tj||dS d S )NDEDENTrv  rE  Fr!   r   r  )	rR   rE   rk  r   r   r  rO   r   r  )rJ   r4   r  rS   r  r  r1   r1   r2   r)  	  s    


r)  c                 C   s   t | |ddd S )NFwith_doc_onlyr!   )p_suite_with_docstringrJ   r4   r1   r1   r2   r  	  s    r  c                 C   s   |  d d }| jdkrH|   |   |r4t| }t| |}|   n@|jr\| jddd |j	dkrrt
| |}nt| }| jddd	 |st|\}}||fS )
Nr^   rt  rZ  Frp   )r  rU  r  r*   zSyntax error in declarationsTr  )re   rE   rI   r8  p_doc_stringr)  r:  r(   r   r:   rI  r  r  _extract_docstring)rJ   r4   ro  docr  r1   r1   r2   rp  	  s$    




rp  c                 C   s  g }g }d}| j |kr| j dks,| j dkr:| jddd d}| j dkr|  d dkr| j}|   |   t| rt| }n.t| |d	}	t| d
d}
t	j
|	j|	|
d}d}tj|j|d}|||f d}npt| rt| }n.t| |d	}	t| d
d}
t	j
|	j|	|
d}d}|| |d
7 }t|dkrB| jd|jd | j dkrx| j |kr|r| dd|  q|   q||fS )z
    Parses positional and keyword arguments. end_sy_set
    should contain any s.sy that terminate the argument list.
    Argument expansion (* and **) are not allowed.

    Returns: (positional_args, keyword_args)
    r   r   r   z$Argument expansion not allowed here.Frp   rD   r   r@   r!   r   r   Tr   r   r   rN   zUnmatched %sz or )rE   r   r   rH   rI   r   rf   r   r   r   CComplexBaseTypeNoderS   r   r   rO   r   rl  )rJ   Z
end_sy_setr@   r   r   Zpos_idxZparsed_typeidentr   r   r   Zkeyword_nodeZwas_keywordr1   r1   r2   p_positional_and_keyword_args	  sZ    
 
 

rx  c                 C   s(   | j dkrt| |dS t| ||dS d S )Nr   ru  nonemptyr@   )rE   p_c_complex_base_typep_c_simple_base_type)rJ   rz  r@   r1   r1   r2   r   	  s    
r   c                 C   s.   | j dkr&| jtkr&| j}|   |S dS d S )NrD   r9  )rE   rH   calling_convention_wordsrI   )rJ   r   r1   r1   r2   p_calling_convention
  s
    r~  )Z	__stdcallZ__cdeclZ
__fastcallc                 C   s   |   }|   t| |d}t| dd}tj|||d}| jdkr|g}| jdkr|   | jdkrfqt| |d}t| dd}|tj|||d qHtj||d}| 	d | jdkrt
| rt| |}nt| ||}|S )	Nru  Tr   r   rN   r   )
componentsr   )rR   rI   r   r   r   rv  rE   rO   r   re   is_memoryviewslice_accessp_memoryviewslice_accessp_buffer_or_template)rJ   r@   rS   r   r   	type_noder  r1   r1   r2   r{  
  s:      


  


r{  c              
   C   s  d}d}d}d}g }|   }d }	}
| jdkrv| jdkrL|	rFt|d d}	n | jdkrv|
rdt|d d}
nqv|   q$|	s~|
rt| ||d}t|tjrtj	||j
|	|
d	|_
|S tj	|||	|
d	S | jdkrt|d
| j  t| rd}| jdkr"| jtkr"t| j \}}| j}|   n8t| \}}| jdkrV| jtkrV| j}|   nd}| jdkr| jdkrd}|   nt| r| j}|   | jdkr|| |   t| }qn| j}|   }|   |r| jdkr| jdkrx|   }|   | jdksF| jdksF| jdksF| jdkrV| jtkrV| dd| n | dd| | d|| d }n| jdkr| d|| d }tj||||||||d}| jdkrt| rt| |}nt| ||}| jdkr
|   t| }tj|||d}|S )Nr   r!   rD   constzDuplicate 'const'ZvolatilezDuplicate 'volatile'ry  )r   is_constis_volatilez"Expected an identifier, found '%s'r`  rb  r   r   r   r   r   )r   r   r   r   )rL   module_pathis_basic_c_typesignedrb  rS  r@   r   )r   rL   )rR   rE   rH   r   rI   r   r   r   r   r   r   looking_at_base_typespecial_basic_c_typesp_sign_and_longnessbasic_c_type_nameslooking_at_dotted_namerO   rM   r}  ri  CSimpleBaseTypeNoder  r  r  ZCNestedBaseTypeNode)rJ   rz  r@   Zis_basicr  rS  rb  r  rS   r  r  r   rL   r  Zold_posr  r1   r1   r2   r|  ,
  s    

 

 

    





$   
r|  c                 C   sn   |   }|   t| d|\}}| d | jdkr@t| ||}tj|dd |D d}tj	||||d}|S )N)r  r  r   c                 S   s"   g | ]\}}t j|j||d qS )r  )r   r
  rS   )r  r  r   r1   r1   r2   r  
  s   z(p_buffer_or_template.<locals>.<listcomp>r  )r   r   r   )
rR   rI   rx  re   rE   r  r   r  r   r   )rJ   r   r@   rS   r   r   r  r   r1   r1   r2   r  
  s$    


r  c                 C   sV   |r|s|S |s4|r4t | r&t| |S t| |d S n|sR|sRt | rNt| |S |S d S r,   )r  r  r  )rJ   r   rz  r   r1   r1   r2   p_bracketed_base_type
  s    

r  c                 C   s   | j | j|  fg}|   d}| jdkr0d}n8| j dkrh|| j | j|  f |   | j dkrhd}|d d d D ]}| j|  qv|S )NFr^   Tr/  r   )rE   rH   rR   rI   rO   ri  )rJ   savedretvalsvr1   r1   r2   r  
  s    


r  c                 C   sd   |   }|   t| \}}|D ]}t|dk r | d q | d t||}tj|||d}|S )Nr$   zDAn axis specification in memoryview declaration does not have a ':'.r  )r   Zaxes)	rR   rI   r  r   r   re   r  r   r   )rJ   r   rS   r   r  r*  r"  r   r1   r1   r2   r  
  s    

r  c                 C   s   | j dko| jtkS rC   )rE   rH   r}  r|   r1   r1   r2   looking_at_name
  s    r  c                 C   st  | j tkrdS | jdkrld}| j }|  }g }|   | jdkrj|   || j |  f | d q8| j| j |  f}| jdkrd}n| jdks| jdkr|   | jdk}| j|  n\| jdkr|   | jdk}| j|  n4| jd	kr|   | jd
kpt|  }| j|  |	  |D ]&}| jd|  | dd|d  q&| d|| | oj|d S dS d S )NFrD   r   Tr   r   )r   r  r   r   r  r!   r   )rD   )
rH   base_type_start_wordsrE   rR   rI   rO   re   ri  r   reverse)rJ   is_typerL   r  dotted_pathr  pr1   r1   r2   r   
  sD    






r   c                 C   s   | j dko| jtkS rC   )rE   rH   r  r|   r1   r1   r2   r    s    r  c                 C   sD   | j dkr<| j}|  }|   | j dk}| d|| |S dS d S )NrD   r   r   )rE   rH   rR   rI   ri  )rJ   rL   r  r   r1   r1   r2   r    s    

r  )voidcharr`  ra  doublebint)r   r   )r$   r   )r!   r   )Z
Py_UNICODEZPy_UCS4Z	Py_hash_tZ
Py_ssize_tZssize_tZsize_tZ	ptrdiff_tZPy_tss_t)shortre  r  rR  )structunionenumpackedc                 C   sp   d}d}| j dkrh| jtkrh| jdkr,d}n2| jdkr<d}n"| jdkrLd}n| jd	kr^|d7 }|   q||fS )
Nr!   r   rD   rR  r  r$   r  r   re  )rE   rH   sign_and_longness_wordsrI   )rJ   r  rS  r1   r1   r2   r  7  s    




r  c                 C   s,   t | d}|d k	r$t|}| j|_nd }|S )Nr3  )rn  r   rk  r(  )rJ   literalcnamer1   r1   r2   p_opt_cnameF  s    

r  c              	   C   s   |   }| jdkrx|   | jdks,t| rVtj|| jdd d}	t| |||	|}
qt	| |||||dd}
| 
d nt| ||||||}
|s|
jr| jdkrt|   d|
j  | jdkr|   }| jd	krt| |
}
n|   t| |||
|}
d
}q|
S )Nr   r   r9  )rL   r  r!   )r   r  cmethod_flagrz  calling_convention_allowedz&%s on something that is not a function)r   r   r   r   )rR   rE   rI   r  r   CNameDeclaratorNoderF   rG   p_c_func_declaratorr   re   p_c_simple_declaratorcalling_conventionr   p_c_array_declarator)rJ   r4   r   r  r  
assignablerz  r  rS   r  r   r1   r1   r2   r   O  s8    

 


r   c                 C   sB   |   }|   | jdkr$t| }nd }| d tj|||dS )Nr  )r  Z	dimension)rR   rI   rE   r   re   r   ZCArrayDeclaratorNode)rJ   r  rS   Zdimr1   r1   r2   r  r  s    


r  c              
   C   s   t | ||dd}t| }| d t| }t| |jdk\}}	}
|rZ|
rZt|  ddd |pdt| }t| }t	j
||||||	|p|jp||dS )	Nr   )r  nonempty_declaratorsr   externzThe keyword 'nogil' should appear at the end of the function signature line. Placing it before 'except' or 'noexcept' will be disallowed in a future version of Cython.r$   r}   )r  ra   Zhas_varargsZexception_valueZexception_checkr'   with_gil)p_c_arg_listp_optional_ellipsisre   p_nogilp_exception_value_clauser;   r   rR   
p_with_gilr   ZCFuncDeclaratorNoder'   )rJ   rS   r4   r  r  ra   Zellipsisr'   exc_val	exc_check
exc_clauser  r1   r1   r2   r  |  s0    
    r  )r   r   r   rV   r   z++z--r   r   r   r   r   r   rN   r   r   r   r   r   r   []()r  r   r_  c              	   C   s  |   }t| }| jdkr| jdk}	|   |   }
| jdkoF| jdk}|rT|   t| ||||||d}|r|tj|
|d}|	rtj||d}tj||d}n>| jdks| jdkr| j	j
r| jdkrtjntj}|   t| ||||||d}|||d}nd }| jdkrl| j}|r.t|   d	 |   t| }|d
kr| jdkr|r|   t| }n|rt|   d d}d }|d kr|jd k	r|r|jd | }|d
kr|jdkr|r| j}dd |D r|   |dkr| d d}n`|dkr | d d}nF|dkrH| j|krH|d9 }|   n| jdkrf|| j7 }|   |tkr| jd| dd ||7 }n@|dkr| j}|tkr| jd| dd |d | }|   tj||||d}||_|S )Nr  r   r  rD   )r   r  r  r  rz  )r  r   ry   zDeclarator should be emptyr   r   zEmpty declaratorr9  ::r  c                 S   s   g | ]}|d krdqS )z+-*/<=>!%&|([^~,r!   r1   )r  r2  r1   r1   r2   r    s      z)p_c_simple_declarator.<locals>.<listcomp>r   r   r  r   r  r  )r   r   r   r   r$   z,Overloading operator '%s' not yet supported.Frp    )rL   r  default)rR   r~  rE   rI   rH   r   r   ZCConstDeclaratorNodeZCPtrDeclaratorNoderF   cppZ CppRvalueReferenceDeclaratorNodeZCReferenceDeclaratorNoder   r  rf   r?   r;   re   supported_overloaded_operatorsr  r  )rJ   r4   r   r  r  r  rz  rS   r  Z	is_ptrptrZ	const_posr  r  r   Z
node_classrt   rL   r  rT   r1   r1   r2   r    s    


  
 












  r  c                 C   s(   | j dkr | jdkr |   dS dS d S )NrD   r'   r!   r   rE   rH   rI   r|   r1   r1   r2   r    s    r  c                 C   s(   | j dkr |   | d dS dS d S )Nr   r5  r!   r   )rE   rI   Zexpect_keywordr|   r1   r1   r2   r    s
    

r  c                 C   sb  d}d}|rdnd}| j dkr:| jdkr:d}|   d}n| j dkr,d}|   | j dkrjd}|   n| j dkrd}|  d	 }|   | j dkr| j}|d
kr|  d	 |d krt|  d nt| |}|   n&| j dkr,tj|  dd}|   n&| j dkr d}|   nd}t| }|sX|sX| j	j
rXd}t|  dd	d |||fS )a  
    Parse exception value clause.

    Maps clauses to exc_check / exc_value / exc_clause as follows:
     ______________________________________________________________________
    |                             |             |             |            |
    | Clause                      | exc_check   | exc_value   | exc_clause |
    | ___________________________ | ___________ | ___________ | __________ |
    |                             |             |             |            |
    | <nothing> (default func.)   | True        | None        | False      |
    | <nothing> (cdef extern)     | False       | None        | False      |
    | noexcept                    | False       | None        | True       |
    | except <val>                | False       | <val>       | True       |
    | except? <val>               | True        | <val>       | True       |
    | except *                    | True        | None        | True       |
    | except +                    | '+'         | None        | True       |
    | except +*                   | '+'         | '*'         | True       |
    | except +<PyErr>             | '+'         | <PyErr>     | True       |
    | ___________________________ | ___________ | ___________ | __________ |

    Note that the only reason we need `exc_clause` is to raise a
    warning when `'except'` or `'noexcept'` is placed after the
    `'nogil'` keyword.
    FNTrD   Znoexceptr  r   r   r$   r'   r!   zf'except +nogil' defines an exception handling function. Use 'except + nogil' for the 'nogil' modifier.r   r   zdImplicit noexcept declaration is deprecated. Function declaration should contain 'noexcept' keyword.r}   )rE   rH   rI   rR   r   rM  r   rG  rf   rF   legacy_implicit_noexceptr   )rJ   Z	is_externr  r  r  Zplus_char_posrL   r1   r1   r2   r    sL    






r  )r   r   r'  r   r^   rV   c           	      C   sL   g }|}| j tkrH|t| ||||||d | j dkr:qH|   d}q|S )N)rz  kw_onlyr`   rN   r   )rE   c_arg_list_terminatorsrO   p_c_arg_declrI   )	rJ   r4   	in_pyfuncr  r  r  r`   ra   is_self_argr1   r1   r2   r  C  s    
 
r  c                 C   s   | j dkrt|  dS dS d S )Nr'  r!   r   )rE   r(  r|   r1   r1   r2   r  S  s    
r  c                 C   s`  |   }d }}	d }
d }| jr<tj|d g dddd|d d	}nt| |d}t| ||d}| jdkr| js| j}|   | jdkr| jdkr|   n
| 	d |st	|d|  |d	k}	|d
k}|r| jdkr|   t
| }| jdkrF|   d|jkr>| jdkrt|}
|   n d|jkr2t| }
n
t	|d nt| }
tj|||||	|
||dS )Nr   )rL   r  r  r  rb  rS  r  r@   rz  )r   rw   rD   r;  zExpected 'None'z*'%s None' only allowed in Python functionsrw   r   r^   r   r   )r   r   r&   z;default values cannot be specified in pxd files, use ? or *)r   r   not_noneor_noner  r  r  )rR   r   r   r  r   r   rE   rI   rH   r   r  r:   r   r+  	modifiersrf   ZCArgDeclNode)rJ   r4   r  r  rz  r  r`   rS   r  r  r  r  r   r   rN  r1   r1   r2   r  Z  sb        




r  c                 C   s(   | j dkr | jdkr |   dS dS d S )NrD   r(   r!   r   r  r|   r1   r1   r2   p_api  s    r  c                 C   s  |   }t| |j|_|jp"t| |_|jrF|jdkrFt|d|j  |jdkrf| jdkrft| ||S | jdkr|   t| ||S t	| rd|_
|jrt|d t| |S | jdkr|jrt|d t| |S | jd	kr|jd
krt|d |jrt|d t| ||S | jdkr2| jdkr2t| ||S | jdkr| jtkr|jd
kr`t|d |jr~| jdkr~t|d t| ||S | jdkr| jdkrt| ||S t| ||S d S )N)r+   publiczCannot combine 'api' with '%s'r  r   r  r!   z$cdef blocks cannot be declared cpdefr^   rU  rS  z*Extension type definition not allowed herez(Extension types cannot be declared cpdefrD   r   z/C struct/union/enum definition not allowed herer  z'C struct/union cannot be declared cpdeffused)rR   p_visibilityr;   r(   r  r   rE   p_cdef_extern_blockrI   r  r'   r>   p_cdef_blockr:   p_c_class_definitionrH   p_cpp_class_definitionstruct_enum_unionp_struct_enump_fused_definitionr9  )rJ   r4   rS   r1   r1   r2   r`    sL    











r`  c                 C   s   t | |ddS )Nr!   )r<   )r  rq  r1   r1   r2   r    s    r  c                 C   s   |j rt|d d }| d | jdkr2|   nt| dd }|ddd}| jd	krn|   t| dd |_t| r|d|_	t
| |d
\}}tj|||||jdS )Nz+cdef extern blocks cannot be declared cpdefr   r   r3  r$   r!   r  )r<   r;   r?   T)include_fileverbatim_includer  r?   )r>   r   re   rE   rI   rj  rH   r?   r  r'   rp  r   ZCDefExternNode)rJ   rS   r4   r  r  r  r1   r1   r2   r    s(    




r  c           	      C   s  |    d}| jjr>| jdks2| jdkr>| jdkr>d}|    | jdkr| j}|    t| }|d kr|jd k	r|jd | }nd  }}|r| d |r| jdkr|    t| }| 	d	 nt
j|d
g ddddd}| 	d g }d }| jdkrt| || n<|    |   t| }| jdkr8t| || q|   |s\|jdkr\t|d t
j|||||||j|j|j|j|jdk|dS )NFrU  rD   r  Tr  zUnnamed scoped enum not allowedr   r   r`  r!   r   )rL   r  r  r  rb  rS  r^   rt  rl  r  zDEmpty enum definition not allowed outside a 'cdef extern from' blockrT  )rL   r  scopedr$  underlying_typer=   r;   Zcreate_wrapperr(   in_pxdrt  )rI   rF   r  rE   rH   r  r?   r   r   re   r   r  p_c_enum_liner8  rr  r:  r;   re  r=   r>   r(   r:   )	rJ   rS   r4   r  rL   r  r  r$  rt  r1   r1   r2   p_c_enum_definition  sl    &




      r  c                 C   sZ   | j dkrDt| || | j dkrL|   | j dkr4qLt| || qn|   | d d S )Nr  rN   r  zSyntax error in enum item list)rE   p_c_enum_itemrI   r  )rJ   r4   r$  r1   r1   r2   r    s    


r  c                 C   sr   |   }t| }t| }|d kr8|jd k	r8|jd | }d }| jdkrV|   t| }|tj	||||d d S )Nr  r   )rL   r  r   )
rR   rM   r  r?   rE   rI   rf   rO   r   ZCEnumDefItemNode)rJ   r4   r$  rS   rL   r  r   r1   r1   r2   r  $  s    

  r  c           	      C   sp  d}| j dkr8d}|   | jdks.| j dkr8| d | j }|   t| }t| }|d krv|jd k	rv|jd | }d }| jdkr<|   g }| jdkr|   | jd	dd
 nj| d | 	  t
|jd}| jdkr| jdkr|t| |  | q|   | d	 q|   |sF|jdkrFt|d n
| d tj||||||j|j|j|jdk|d
S )NFr  TrD   r  r  r^   r  r  r  rt  )r;   rm  r  zOEmpty struct or union definition not allowed outside a 'cdef extern from' blockz*Syntax error in struct or union definitionrT  )	rL   r  rN  
attributesr=   r;   r(   r  r  )rH   rI   rE   expectedrM   r  r?   r  re   r8  r)   r;   rO   r9  rR   r:  r   r   rd  r=   r(   r:   )	rJ   rS   r4   r  rN  rL   r  r  r;  r1   r1   r2   p_c_struct_or_union_definition1  sX    




      r  c                 C   s   |j dkrt|d |   t| }| d |   |   g }| jdkrx| jdkrf|t	|  n|   |   qB| 
  |st|d tj|||dS )z5
    c(type)def fused my_fused_type:
        ...
    rS  z&Fused type definition not allowed herer^   rm  r  zNeed at least one type)rL   types)r:   r   rI   rM   re   r  r8  rE   rO   r   r:  r   ZFusedTypeNode)rJ   rS   r4   rL   r  r1   r1   r2   r  ]  s"    






r  c                 C   s&   | j dkrt| ||S t| ||S d S )Nr  )rH   r  r  )rJ   rS   r4   r1   r1   r2   r    s    
r  c                 C   sX   |   }|}| jdkrT| jdkrT| j}|dkrL||krL| jd||f dd |   |S )NrD   )r  r  readonlyr+   z,Conflicting visibility options '%s' and '%s'Frp   )rR   rE   rH   r   rI   )rJ   Zprev_visibilityrS   r;   r1   r1   r2   r    s    r  c                 C   s4   | j dkr0| jdkr0| j}|   |gt|  S g S )NrD   )r&   )rE   rH   rI   p_c_modifiers)rJ   modifierr1   r1   r2   r    s
    r  c                 C   s  |j dk}t| }t| d|jd}t| ||d|ddd}|j|_| jdkrn| jdkrn|j dkrn|   d}nd	}| jd
kr| j	ddd |   t
|  | jdkr|j dkr|js| 	d t| tdd\}}	tj||j|||	|||j|j|d
}
n|r||_|g}| jdkrN|   | jdkr.qNt| ||ddd}|| q
| jd }| jddd |j dkr| j|krt| }nd }tj||j|||j dk||j||jd	}
|
S )N)rV  rX  r!   ry  )r  )r  r  rz  rD   r  	cpp_classr   ->z~Return type annotation is not allowed in cdef/cpdef signatures. Please define it before the function name, as in C signatures.Frp   r^   )r  rV  rT  rX  r  z&C function definition not allowed herer  r}   )	r;   r   r   r  rt  r  r(   r>   is_const_methodrN   rt  z&Syntax error in C variable declarationTr  )rT  rX  )r;   r   declaratorsr  rt  r(   r  r>   )r:   r  r   r@   r   r>   rE   rH   rI   r   rf   rp  r)   r   ra  r;   r(   r  rO   Z
start_liner  rr  rb  )rJ   rS   r4   r  r  r   r   r  rt  Zsuiter   r  Zdoc_liner1   r1   r2   r9    s|    
 


 

	r9  c                 C   s   |   }|   t| |j}t| }|d|d}|r:d|_| jdkrPt| ||S | jdkrp| jt	krpt
| ||S | jdkr| jdkrt| ||S t| dd}t| |ddd}| jdd	d
 tj||||||jdkdS d S )Nr!   )r=   r;   rU  rD   r  r  )r  rz  z"Syntax error in ctypedef statementTr  rT  )r   r   r;   r(   r  )rR   rI   r  r;   r  r(   rE   r  rH   r  r  r  r   r   r  r   ZCTypeDefNoder:   )rJ   r4   rS   r;   r(   r   r   r1   r1   r2   r^    s0    
  r^  c                 C   sJ   g }| j dkrF|  }|   t| }|tj||d | d q|S )Nr   )	decoratorz"Expected a newline after decorator)rE   rR   rI   rv   rO   r   ZDecoratorNoder  )rJ   r   rS   r  r1   r1   r2   r_    s    
r_  c                 C   s0   | j dkr,|tkr,| jd| dd t| S |S )zqStep over incorrectly placed cdef modifiers (@see _CDEF_MODIFIERS) to provide a good error message for them.
    rD   zTCannot use cdef modifier '%s' in Python function signature. Use a decorator instead.Frp   )rE   r   r   rM   )rJ   rL   r1   r1   r2   _reject_cdef_modifier_in_py  s    r  c                 C   s   |r|d j n|  }|r"|   |   t| t| }| dd| jdkrP| jn| j  t	| dd\}}}| d t| | j d }| jdkr|   t
| }t| | j t| tdd	\}	}
|r|   tj||||||	|
|||d

S )Nr   r   z~Expected '(', found '%s'. Did you use cdef syntax in a Python declaration? Use decorators and Python type annotations instead.rD   r   )r_   r  r  r}   )	rL   ra   rb   rc   rt  r  r   r   return_type_annotation)rS   rR   Zenter_asyncrI   r  rM   re   rE   rH   rd   r  rp  r)   Z
exit_asyncr   ZDefNode)rJ   r   r   rS   rL   ra   rb   rc   r  rt  r  r1   r1   r2   r     sD    

       r   r   c              	   C   s4  t | dd|d}d }d }| jdkrt|dkr8| d |   |D ]
}d|_qD| jdkrz|   |t | dd|d n| j|kr| d | jdkr|   | jd	krt| |d
}| jdkr|   |t | ddd|d n| j|kr| d | jdkr|   t| |d
}| jdkr*|   |||fS )Nr!   )r  r  r`   rV   r   zTGot zero positional-only arguments despite presence of positional-only specifier '/'rN   z-Syntax error in Python function argument listr   rD   )r`   )r  r  r  r`   r   )r  rE   r   r   rI   Zpos_onlyr  p_py_arg_decl)rJ   r_   r`   ra   rb   rc   r   r1   r1   r2   rd   %  sL    



 






  


rd   c                 C   sB   |   }t| }d }|r2| jdkr2|   t| }tj|||dS )Nr^   )rL   r  )rR   rM   rE   rI   r  r   ZPyArgDeclNode)rJ   r`   rS   rL   r  r1   r1   r2   r  I  s    r  c           
   
   C   s   |   }|   tt| }| j|_d }d }| jdkrVt| dd\}}t|||\}}|d krlt	j
|g d}t| tdd\}}	tj||||||	|| jjdkdS )	Nr   Fr   r   rU  r}   r%   )rL   basesr   rt  r  r   Zforce_py3_semantics)rR   rI   r   rM   rk  r(  rE   r   r  r   r  rp  r)   r   ZPyClassDefNoderF   rT  )
rJ   r   rS   
class_namer  r  r   r   rt  r  r1   r1   r2   rf  S  s,    
   
rf  c                 C   s>  |    g }t| }| jdkr:|    || t| }q|rR|jdkrRt|d |r|| jdkr|| jdkr||    t| }n|}d }d }d }d }	| jdkrt| dd\}
}|r| d	 t||
|\}}|d krt	j
|g d
}| jdkr|jdkr|jst|  d t| \}}}	| jdkrR|jdkr8d}nd}t| t|d\}}n| d d }d }|jdkr|st|d |rt|d nt|jdkr|st|d |st|d nF|jdkr|jr|st|d |st|d nt|d|j  tj||j|j|jd|||||||	|jdk||dS )Nr   r  z6Qualified class name only allowed for 'extern' C classrD   r	  r   Fr  z$C classes cannot take keyword bases.r   r   )r  r  zBName options only allowed for 'public', 'api', or 'extern' C classr^   rT  rX  rV  r}   z"Syntax error in C class definitionz)Module name required for 'extern' C classz?Type object name specification not allowed for 'extern' C classr  z>Object struct name specification required for 'public' C classz<Type object name specification required for 'public' C classr+   z;Object struct name specification required for 'api' C classz9Type object name specification required for 'api' C classzInvalid class visibility '%s')r;   r=   r(   r  r  r  r  objstruct_nametypeobj_name
check_sizer  rt  r  )rI   rM   rE   rO   r;   r   rH   r   r  r   r  r(   rR   p_c_class_optionsr:   rp  r)   r  r   rc  r=   rl  )rJ   rS   r4   r  r  r  r  r  r  r  r   r   r  Z
body_levelrt  r  r1   r1   r2   r  j  s    










r  c                 C   s   d }d }d }|  d | jdkr"q| jdkr>|   t| }nL| jdkrZ|   t| }n0| jdkr|   t| }|dkr| d|  | jdkrq|   q|  d	d
 |||fS )Nr   rD   objectr  r  )ignorewarnr   z/Expected one of ignore, warn or error, found %rrN   r  z)Expected 'object', 'type' or 'check_size')re   rE   rH   rI   rM   r   )rJ   r  r  r  r1   r1   r2   r    s,    








r  c                 C   sB   |   }|   t| }t| tdddd\}}tj||||dS )NrW  r}   Trn  )rL   rt  r  )rR   rI   rM   rp  r)   r   ZPropertyNode)rJ   rS   rL   rt  r  r1   r1   r2   rg    s      
rg  c                 C   s:   | j dkr6|  }t| }| jddd tj||dS dS )zO
    Parses any kind of ignorable statement that is allowed in .pxd files.
    r1  zSyntax error in stringTr  r   N)rE   rR   r   r  r   r   )rJ   rS   Zstring_noder1   r1   r2   rh    s    
rh  c                 C   sP   | j dkrH|  }t| \}}}| jddd |dkr:|S t|d |S d S d S )Nr1  zSyntax error in doc stringTr  ri  2Python 3 requires docstrings to be unicode strings)rE   rR   rF  r  r   )rJ   rS   rN  Zbytes_resultZunicode_resultr1   r1   r2   rr    s    

rr  c                 C   s   d}| dkrnpt | tjr:| jjr~| j}tj| jg d} nDt | tjr~| jr~| j}t |d tjr~|d jjr~|d j}|d= |dkrd}nHt |tj	rt
| jd |j}n(t |tjr|j}|dkr|j}n|j}|| fS )z
    Extract a docstring from a statement or from the first statement
    in a list.  Remove the statement if found.  Return a tuple
    (plain-docstring or None, node).
    Nr  r   r  )r   r   r   rg   Zis_string_literalr  rS   r  r   rI  r   r   rK  r:  )r   Zdoc_noder  rt  r1   r1   r2   rs    s4    
rs  c                 C   s@   t | ||ddd}| jdkr<| dt| jt| jf  |S )Nr}   r!   rE  rv  !Syntax error in statement [%s,%s])r)  rE   r   r]  rH   )rJ   r:   r4   r  r1   r1   r2   p_code  s    
 r  z$^#\s*cython\s*:\s*((\w|[.])+\s*=.*)$c              
   C   s`  i }| j dkr\|  }t| j}|rR|d }ztj|dd}W nF tk
r } z(| j	|j
d dd |   W Y qW 5 d }~X Y nX |D ]}||krqtj|tkr||  || 7  < || ||< q|| || krt|d|f  q| j	d	||| || f |d
 qd|kr2| j|d  d|krH|d | j_|| |   q|S )NZcommentliner!   T)Zignore_unknownr   Frp   zDuplicate directive found: %sz@Conflicting settings found for top-level directive %s: %r and %rr   rT  r  )rE   rR   !_match_compiler_directive_commentrH   r  r  r   Zparse_directive_list
ValueErrorr   ra   rI   Zdirective_typesgetr   r   rF   set_language_levelr  r.   )rJ   r   rS   mZdirectives_stringZnew_directiveserL   r1   r1   r2   p_compiler_directive_comments!  sD    
  



r  c           
      C   s   |   }t| }d| _| jjd krd| jd |d jrddd l}|jd|d j t	t
jr\dndd |rldnd	}t| }t| ||d
dd}	| jdkr| dt| jt| jf  t|||	||dS )NFZ3strr   zwCython directive 'language_level' not set, using '3str' for now (Py3). This has changed from earlier releases! File: %sr!   r$   )
stacklevelrT  r  r}   rE  rv  r  )rt  r  full_module_namedirective_comments)rR   r  r&  rF   rT  r  filenamewarningsr  FutureWarningcythonZcompiledrr  r)  rE   r   r]  rH   r   )
rJ   r   r  r4   rS   r  r  r:   rt  r  r1   r1   r2   p_moduleH  s4    

 r	  c                 C   s8   t | }| jdkr,| d | d d}nd}||fS )Nr   r   FT)rM   rE   re   )rJ   rL   requiredr1   r1   r2   p_template_definitionc  s    


r  c              
   C   s  |    t| }t| }|d kr8|jd k	r8|jd | }| jdkrLt|d | jdkr|    t| g}| jdkr|    |t|  qh| d dd |D }nd }d }| jd	kr|    t	| |d
g}| jdkr|    |t	| |d
 q| d ng }| jdkrt| 
 d t| }| jdkr|    | d |   t|  g }	t|jd|ph|jd}
||
_| jdkr| jdkr|	t| |
 n|    | d qt|   nd }	| d tj|||||j|jdk|	|dS )Nr  r   z*Qualified class name not allowed C++ classr   rN   r  c                 S   s   g | ]\}}|qS r1   r1   )r  rL   r
  r1   r1   r2   r  }  s     z*p_cpp_class_definition.<locals>.<listcomp>r   ru  r   z&Name options not allowed for C++ classr^   rt  r  )r;   r:   r'   rm  r  r  z$Syntax error in C++ class definitionrT  )rL   r  base_classesr;   r  r  r@   )rI   rM   r  r?   rE   r   r  rO   re   r   rR   r  r8  rr  r)   r;   r'   r@   p_cpp_class_attributer  r:  r   ZCppClassNoder:   )rJ   rS   r4   r  r  r@   Ztemplate_namesr  r'   r  r;  r1   r1   r2   r  m  sj    










r  c                 C   s   d }| j dkrt| }| jdkr0t| |  |S | jdkrDt| |S | j dkr| jtkr| jdkrrt| |  |S t| |  |S n\t| |  |}|d k	rt	j
t	jt	jf}|jr|t	jt	jf7 }t||s| d ||_|S d S )Nr   r   rR  rD   r  r   )rE   r_  rH   r  rR   r^  r  r  r9  r   ra  rb  rc  rA   rd  re  r   r   r   )rJ   r4   r   r   rj  r1   r1   r2   r    s(    






r  c           
      C   sv  d| }|r`|  | |r*|  d|  t|}|tkr|  d|d |d f  tdt|D ]}t| || |d  qb|  d|  d S t|tjrz
|j	}W n t
k
r   |jj}Y nX |  d||jf  |j D ]*\}}	|d	kr|d
krt| |	|d | qd S |tkr`|  d tt|D ]}t| || |d  q2|  d|  d S |  d||f  d S )Nz  z%s: z	(%s @ %s
r   r!   r$   z%s)
z%s @ %s
tagrS   z[
z%s]
z%s%s
)writer  r	  ranger   print_parse_treer   r   Noder  r  rg  r7   rS   r-   r$  r   )
r6  r   r:   r  indtr  r  rL   r   r1   r1   r2   r    s:    



r  c                 C   s   |   }t| }tj||dS )a  An annotation just has the "test" syntax, but also stores the string it came from

    Note that the string is *allowed* to be changed/processed (although isn't here)
    so may not exactly match the string generated by Python, and if it doesn't
    then it is not a bug.
    r   )rR   rf   r   ZAnnotationNode)rJ   rS   rg   r1   r1   r2   r    s    r  )rB   )T)NN)r3  )N)N)N)N)r   )r   )F)TF)TF)F)r   )r   )r   )r   )F)N)FN)N)N)r   r   r   r!   )NF)r   r!   )r!   )N)r  r   r  rM  r  r  r	  r  ior   r   r   unicodedatar   r	   r    r
   	functoolsr   r   ZScanningr"   r   r#   r9  r   r   r   r   r   r   r   r   r   ZErrorsr   r   r   r   r   version_infor   
maxunicoder   r   r)   rM   rQ   rU   r]   rh   rf   rj   rv   r   ro   rz   r{   r~   r   r   r   r   r   r   	frozensetr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r  r#  r%  r(  r  r)  r   rC  rM  rY  rF  rn  rq  rj  r|  r   r   r  r}  r  r?  r  r  r  r@  rA  r  r  r  r   r  r>  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r   r  r  r  r  r   r  r  r  r  r  r  r  r"  r!  r,  r/  r   r0  r4  r.  rG  rI  rK  rO  rQ  rk  r)  r  rp  rx  r   r~  r}  r{  r|  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r`  r  r  r  r  r  r  r  r  r  r  r9  r^  r_  r  r   rd   r  rf  r  r  rg  rh  rr  rs  r  r  r  r  r  r	  r  r  r  r  r  r1   r1   r1   r2   <module>   s  
                 	


	3*? 
),f.
/ 	n
	
3
 Q+		 "#
q8	a)
	
 #
PE     4)>,"@
 $
L	#
'
>