3
q<\                @   sJ
  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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*dZ+G dd deZ,dddZ-dd Z.d d! Z/d"d# Z0dd%d&Z1d'd( Z2d)d* Z3d+d, Z4d-d. Z5d/d0 Z6d1d2 Z7d3d4 Z8d5d6 Z9d7d8 Z:d9d: Z;d;d< Z<d=d> Z=eje>e>d?d@dAdBdCdDdEdFdGdHg
Z?dIdJ Z@dKdL ZAdMdN ZBdOdP ZCdQdR ZDdSdT ZEdUdV ZFdWdX ZGdYdZ ZHd[d\ ZId]d^ ZJd_d` ZKdadb ZLdcdd ZMdedf ZNdgdh ZOddidjZPdkdl ZQdmdn ZRdodp ZSdqdr ZTdsdt ZUdudv ZVdwdx ZWdydz ZXdd{d|ZYd}d~ ZZdd Z[dd Z\dd Z]dd Z^dddZ_dd Z`dddZadd Zbdd dD \ZcZddd Zedd Zfdd Zgdd Zhdd Zidd Zjdd Zkdd ZldddZmdddZndd Zodd Zpdd Zqdd Zreje>e>ddddddgZsdd Ztdd Zudd Zvdd Zwdd Zxdd ZydddZzddĄ Z{ddƄ Z|ddȄ Z}ddʄ Z~dd̄ Zddd΄Zeje>e>dddgZddӄ ZddՄ Zddׄ Zddل Zeje>e>dddgZdd݄ Zdd߄ Zdd Zdd ZdddZdddZdd Zdd Zeje>e>d?dCd@dBgZdd Zdd ZdddZdd Zdd Zdd Zdd ZdddZdd ZdddZdd dZdd Zd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je>e>dddg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, Zd-d. Zeje>e>d/d0d1d2d3d4gZejedĐdŐdƐdǐdȐdɐdʐdːd5Zeje>e>d6d7d8d9gZeje>eeB e>eB Zeje>e>ddѐd:d;gZd<d= Zd>d? Ze, d d d d d d fd@dAZdBdC ZdDdE Zeje>e>dFdGdHdIdJdKdLdMdNdOdPdQdRdSdAdEdBd@dCd?dTdUdVddWgZdXdY ZdZd[ Zd\d] Zd^d_ Zeje>e>dHd`daddgZe, d d d d dfdbdcZddde ZÐd̐dfdgZĐdhdi ZŐdjdk ZƐdldm Zǐdndo ZȐdpdq Zɐdrds Zʐdtdu Zːdvdw Z̐dxdy Z͐dzd{ Zΐd|d} Zϐd~d ZАdd Zѐdd ZҐdd ZӐdd ZԐd͐d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 Zde,fddZejee	jdjZdd Ze,fddZdd Zdd Zdd ZdА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)StringIO)lookupcategory)r   r      )PyrexScannerr   StringSourceDescriptor)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 j| d S )N)__dict__update)selfkwds r/   g/home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python3.6/site-packages/Cython/Compiler/Parsing.py__init__7   s    zCtx.__init__c             K   s&   t  }|j}|j| j |j| |S )N)r(   r+   r,   )r-   r.   ctxdr/   r/   r0   __call__:   s
    
zCtx.__call__)__name__
__module____qualname__level
visibility	cdef_flagtypedef_flagr'   overridabler&   	namespace	templatesallow_struct_enum_decoratorr1   r4   r/   r/   r/   r0   r(   *   s   r(   Expected an identifierc             C   s*   | j dkr| j}| j  |S | j| d S )NIDENT)sysystringnextr   )smessagenamer/   r/   r0   p_identB   s
    
rH   c             C   s@   g }x6| j dkr:|j| j | j  | j dkr0P | j  qW |S )NrA   ,)rB   appendrC   rD   )rE   namesr/   r/   r0   p_ident_listJ   s    
rL   c             C   s   | j  }| j}| j  ||fS )N)positionrB   rD   )rE   posopr/   r/   r0   p_binop_operatorZ   s    rP   c             C   sd   || }xV| j |kr^t| \}}|| }tj||||}|dkr
tj| jjkrVd|_q
d |_q
W |S )N/T)	rB   rP   r   
binop_noder   divisioncontextfuture_directivestruedivision)rE   ops
p_sub_exprn1rO   rN   n2r/   r/   r0   p_binop_expr`   s    
r[   Tc             C   sp   | j  }| j  | jdkr(g }d  }}nt| ddd\}}}| jd |rTt| }nt| }tj|||||dS )N:F)
terminator	annotated)argsstar_argstarstar_argresult_expr)	rM   rD   rB   p_varargslistexpectp_testp_test_nocondr   
LambdaNode)rE   allow_conditionalrN   r_   r`   ra   exprr/   r/   r0   	p_lambdefo   s    



rj   c             C   s   t | ddS )NF)rh   )rj   )rE   r/   r/   r0   p_lambdef_nocond   s    rk   c             C   sh   | j dkrt| S | j }t| }| j dkr`| j  t| }| jd t| }tj||||dS |S d S )Nlambdaifelse)testtrue_val	false_val)	rB   rj   rM   	p_or_testrD   rd   re   r   CondExprNode)rE   rN   ri   ro   r)   r/   r/   r0   re      s    


re   c             C   s   | j dkrt| S t| S d S )Nrl   )rB   rk   rr   )rE   r/   r/   r0   rf      s    
rf   c             C   s   t | dtS )Nor)rt   )p_rassoc_binop_expr
p_and_test)rE   r/   r/   r0   rr      s    rr   c             C   sH   || }| j |krD| j }| j }| j  t| ||}tj||||}|S )N)rB   rM   rD   ru   r   rR   )rE   rW   	p_subexprrY   rN   rO   rZ   r/   r/   r0   ru      s    
ru   c             C   s   t | dtS )Nand)rx   )ru   
p_not_test)rE   r/   r/   r0   rv      s    rv   c             C   s8   | j dkr,| j }| j  tj|t| dS t| S d S )Nnot)operand)rB   rM   rD   r   NotNodery   p_comparison)rE   rN   r/   r/   r0   ry      s
    
ry   c             C   sT   t | }| jtkrP| j }t| }t | }tj||||d}| jtkrPt| |_|S )N)operatoroperand1operand2)	p_starred_exprrB   comparison_opsrM   p_cmp_opr   PrimaryCmpNodep_cascaded_cmpcascade)rE   rY   rN   rO   rZ   r/   r/   r0   r}      s    


r}   c             C   s   | j dkrt| S t| S d S )N*)rB   r   re   )rE   r/   r/   r0   p_test_or_starred_expr   s    
r   c             C   s@   | j  }| jdkr d}| j  nd}t| }|r<tj||}|S )Nr   TF)rM   rB   rD   
p_bit_exprr   StarredUnpackingNode)rE   rN   starredri   r/   r/   r0   r      s    

r   c             C   s@   | j  }t| }t| }tj|||d}| jtkr<t| |_|S )N)r~   r   )	rM   r   r   r   CascadedCmpNoderB   r   r   r   )rE   rN   rO   rZ   resultr/   r/   r0   r      s    


r   c             C   sp   | j dkr"| j  | jd d}n>| j dkrR| j  | j dkrL| j  d}q`d}n| j }| j  |dkrld}|S )Nrz   innot_inisis_notz<>z!=)rB   rD   rd   )rE   rO   r/   r/   r0   r      s    



r   <>z==z>=z<=z<>z!=r   r   rz   c             C   s   t | dtS )N|)r   )r[   
p_xor_expr)rE   r/   r/   r0   r     s    r   c             C   s   t | dtS )N^)r   )r[   
p_and_expr)rE   r/   r/   r0   r   	  s    r   c             C   s   t | dtS )N&)r   )r[   p_shift_expr)rE   r/   r/   r0   r     s    r   c             C   s   t | dtS )N<<>>)r   r   )r[   p_arith_expr)rE   r/   r/   r0   r     s    r   c             C   s   t | dtS )N+-)r   r   )r[   p_term)rE   r/   r/   r0   r     s    r   c             C   s   t | dtS )Nr   @rQ   %//)r   r   rQ   r   r   )r[   p_factor)rE   r/   r/   r0   r     s    r   c             C   s   t | S )N)	_p_factor)rE   r/   r/   r0   r   "  s    r   c             C   s   | j }|d	kr6| j }| j }| j  tj||t| S | js|dkrj| j }| j  t| }tj||dS |dkrzt| S |dkr| j	dkrt
| S t| S )
Nr   r   ~r   )r{   r   rA   sizeof)r   r   r   )rB   rM   rD   r   	unop_noder   in_python_fileAmpersandNode
p_typecastrC   p_sizeofp_power)rE   rB   rO   rN   argr/   r/   r0   r   &  s"    r   c       	      C   s   | j  }| j  t| }t|tj}t|tj}t|tj}| rb| rb| rb|jd krb| j	d t
| dd}| jdkr| j  d}nd}| jd t| }|rtj|||dS tj|||||dS )	NzUnknown typer    )empty?r   r   )base_type_noder{   )	base_type
declaratorr{   	typecheck)rM   rD   p_c_base_type
isinstancer   MemoryViewSliceTypeNodeTemplatedTypeNodeCConstTypeNoderG   r   p_c_declaratorrB   rd   r   r   CythonArrayNodeTypecastNode)	rE   rN   r   is_memsliceis_templateis_constr   r   r{   r/   r/   r0   r   9  s0    



r   c             C   sl   | j  }| j  | jd t| r:t| }tj||d}n$t| }t| dd}tj	|||d}| jd |S )N()r{   r    )r   )r   r   ))
rM   rD   rd   looking_at_exprre   r   SizeofVarNoder   r   SizeofTypeNode)rE   rN   r{   noder   r   r/   r/   r0   r   V  s    


r   c             C   s   | j  }| j  d}| jdkr*d}| j  | 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)rN   fatal)r   )
rM   rD   rB   statement_terminatorsre   
p_testlistr   r   YieldFromExprNodeYieldExprNode)rE   rN   is_yield_fromr   r/   r/   r0   p_yield_expressionj  s    

r   c             C   s   t | }tj|j|dS )N)ri   )r   r   ExprStatNoderN   )rE   
yield_exprr/   r/   r0   p_yield_statement  s    r   c             C   s   | j dkr4d|jkr| jd |j| _t| |ddS |rD| jd n>| j dkrZt| ddS | j d	krx| j  t| ddS | jd
 d S )Ndefpxdzdef statement not allowed hereT)is_async_defz7Decorators can only be followed by functions or classesfor)is_asyncwithz2expected one of 'def', 'for', 'with' after 'async')rB   r8   r   p_def_statementp_for_statementrD   p_with_items)rE   r2   
decoratorsr/   r/   r0   p_async_statement  s    




r   c             C   s   | j dkr"| j d dkr"t| S d }| jdkr@| j }| j  t| }x| jd
kr`t| |}qJW |rttj	||d}| jd	kr| j }| j  t
| }tj|d	||}|S )Nnewr   rA   awaitr   [.)r   z**)r   r   r   )rC   peek
p_new_exprrB   rM   rD   p_atom	p_trailerr   AwaitExprNoder   rR   )rE   	await_posrY   rN   rZ   r/   r/   r0   r     s"    

r   c             C   s,   | j  }| j  t| }t| tj||dS )N)cppclass)rM   rD   r   p_callr   NewExprNode)rE   rN   r   r/   r/   r0   r     s    r   c             C   sT   | j  }| jdkrt| |S | jdkr0t| |S | j  t| }tj|||dS d S )Nr   r   )obj	attribute)rM   rB   r   p_indexrD   rH   r   AttributeNode)rE   node1rN   rG   r/   r/   r0   r     s    



r   c       
      C   s  | j  }| j  g }g }d}d}x2| jdkrT| jdkrl|rP| jd| j  d | j  |jt|  d}n| jdkr| j  |jt|  d}nt| }| jdkr| j  |js| jd	|jd | jj	|j
}tj|j|d
}	t| }|j|	|f nD|r| jd|jd |r,| r,|d j| n|j|g d}| jdkrJP | j  q$W | jdkr| r| rt|dkrt|d dkrt| |d d gg}| jd |pg g|fS )NFr   r   z%Non-keyword arg following keyword arg)rN   Tz**=z!Expected an identifier before '=')valuer    rI   r   asyncr   )r   r   )rM   rD   rB   r   rJ   re   is_namerN   rT   intern_ustringrG   r   IdentifierStringNodelenp_genexprd   )
rE   allow_genexprN   positional_argskeyword_argsstarstar_seenlast_was_tuple_unpackr   encoded_namekeywordr/   r/   r0   p_call_parse_args  sV    



 
r   c                s  d } fdd|D }t ttj d|}|rg }g }xz|D ]r}t|trn|\}	}
|jtj|	j|	|
d q>|j	r|j
|j q>|r|jtj|d j|dd g }|j| q>W |r|j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 ))r_   )r   )r   listr   	TupleNodeAsTupleNode).0r   )rN   r/   r0   
<listcomp>  s   z,p_call_build_packed_args.<locals>.<listcomp>r   )rN   keyr   r   T)key_value_pairsreject_duplicatesr    )r   )r   r   r   rR   r   tuplerJ   DictItemNoderN   is_dict_literalextendr  DictNoder   MergedDictNode)rN   r   r   keyword_dict	subtuples	arg_tuplekwargs
dict_itemsitemr  r   r/   )rN   r0   p_call_build_packed_args  s4    



r  c             C   sn   | j  }t| \}}| rHt|dkrHt|d trHtj|||d dS t|||\}}tj||||dS d S )Nr    r   )functionr_   )r  r   r   )	rM   r   r   r   r   r   SimpleCallNoder  GeneralCallNode)rE   r  rN   r   r   r  r  r/   r/   r0   r   ,  s     r   c       
      C   s   | j  }| j  t| \}}|rPt|d dkrP|d \}}tj||||d}n6t||}|rh|d }	ntj||d}	tj|||	d}| j	d |S )Nr   r#   )basestartstop)r_   )r  index])
rM   rD   p_subscript_listr   r   SliceIndexNodemake_slice_nodesr   	IndexNoderd   )
rE   r  rN   
subscriptsis_single_valuer  r  r   indexesr  r/   r/   r0   r   =  s    



r   c             C   sL   d}t | g}x4| jdkrBd}| j  | jdkr2P |jt |  qW ||fS )NTrI   Fr  )p_subscriptrB   rD   rJ   )rE   r   itemsr/   r/   r0   r  Q  s    

r  c             C   sb   | j  }t| d}| jdkr"|gS | j  t| d}| jdkrF||gS | j  t| d}|||gS )Nr\   rI   r  )r\   )r\   rI   r  )r\   rI   r  )rM   p_slice_elementrB   rD   )rE   rN   r  r  stepr/   r/   r0   r"  ^  s    




r"  c             C   s   | j |krt| S d S d S )N)rB   re   )rE   
follow_setr/   r/   r0   r$  n  s    
r$  c             C   s"   | j d | j d | j d d S )Nr   )rd   )rE   r/   r/   r0   expect_ellipsisv  s    

r'  c             C   sF   g }x<|D ]4}t |dkr*|j|d  q
|jt| f|  q
W |S )Nr    r   )r   rJ   make_slice_node)rN   r  r   	subscriptr/   r/   r0   r  {  s    
r  c             C   s<   |st j| }|st j| }|s*t j| }t j| |||dS )N)r  r  r%  )r   NoneNode	SliceNode)rN   r  r  r%  r/   r/   r0   r(    s    


r(  c       	      C   sP  | j  }| j}|dkrb| j  | jdkr8tj|g d}n| jdkrLt| }nt| }| jd |S |dkrrt| S |dkrt	| S |dkrt
| S |dkrt|  tj|S |d	krt| S |d
kr| j}| j  tj||dS |dkr| jd d  }| j  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 | jd|  n|dkrB| j}|dkrtj|}n^|dkrtj|dd}nD|dkrtj|dd}n*|dkr,| j r,tj|}n
t| |}| j  |S | jd d S )!Nr   r   )r_   yieldr   {`r   INTFLOAT)r   IMAGr    BEGIN_STRINGcu)r   bytes_valuebf)values )r   unicode_valuezinvalid string kind '%s'rA   NoneTrueTFalseFNULLz!Expected an identifier or literalr   )rM   rB   rD   r   r   r   p_testlist_comprd   p_list_makerp_dict_or_set_makerp_backquote_exprr'  EllipsisNodep_int_literalrC   	FloatNodeImagNodep_cat_string_literalCharNodeUnicodeNode	BytesNodeJoinedStrNode
StringNoder   r*  BoolNoder   NullNodep_name)	rE   rN   rB   r   r   kindr5  r:  rG   r/   r/   r0   r     sr    
















r   c             C   s   | j  }| j}| j  d}d}x:|d dkrX|d dkrB|d7 }n|d7 }|d d }q W d }|rhd}n|r|dks| jjd	krd}| jr|rt|d
 d}tj|||||dS )Nr9  r    UuLlLlLUTLLr$   z4illegal integer literal syntax in Python source fileF)is_c_literalr   unsignedlongnessr   r   r   )	rM   rC   rD   rT   language_levelr   r   r   IntNode)rE   rN   r   rW  rX  rV  r/   r/   r0   rD    s2    

rD  c             C   sJ   | j  }| j r<|| jkr<| jj|}t||}|d k	r<|S tj||dS )N)rG   )rM   compile_time_exprcompile_time_envlookup_herewrap_compile_time_constantr   NameNode)rE   rG   rN   r   r   r/   r/   r0   rO    s    
rO  c                s  t |}|d krtj S |tkr,tj 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 r|t|tr|tj	 |jd
|dS t d||jjf  d S )N)r   )r   constant_resultg        r   )r`  asciic                s   g | ]}t  |qS r/   )r^  )r  r   )rN   r/   r0   r    s   z.wrap_compile_time_constant.<locals>.<listcomp>)r_   rS  z4Invalid type for compile-time constant: %r (type %s))reprr   r*  EllipsisrC  r   boolrM  intrZ  floatrE  complexrF  imagrealrR   r   rI  r   r   r   rJ  r  r   r   longrstripr   	__class__r5   )rN   r   repr   bvaluer_   r/   )rN   r0   r^    sD    








r^  c             C   s  | j  }t| \}}}|dks(| jdkr2|||fS |g|g|g  }}}d  }}x| jdkr| j  }t| \}}	}
|dkrt|d qRnF||krt||gtddgtddgfkrd}nt|d||f  qR|j|	 |j|
 |j| qRW |dks|dkr d |kr ttj|| j	}|dkrBt
djd	d
 |D }|dkrg }xFt||D ]8\}}t|trz||7 }n|jtj|t
|d q\W |||fS )Nr3  r2  zCCannot concatenate char literal with another string or char literalr7  r4  r9  zFCannot mix string literals of different types, expected %s'', got %s''r6  c             S   s   g | ]}|d k	r|qS )Nr/   )r  r4  r/   r/   r0   r  F  s    z(p_cat_string_literal.<locals>.<listcomp>)r   )r6  r3  r9  )r4  r9  )rM   p_string_literalrB   r   setrJ   r   r   
join_bytessource_encodingr   joinzipr   r   r   rI  )rE   rN   rP  r5  r:  bstringsustrings	positions	next_kindnext_bytes_valuenext_unicode_valuer4  r/   r/   r0   rG  &  s@    

$




rG  r4  c             C   s`   | j dkrd S | j }t| |\}}}|dkrF|dkrB| jd| |S |dkrR|S | jd d S )Nr2  r4  r7  zf-string not allowed herer6  z#internal parser configuration error)rB   rM   ro  r   )rE   required_typerN   rP  r5  r:  r/   r/   r0   p_opt_string_literalR  s    
r|  c             C   s   x| D ]}|dkrdS qW dS )N   TFr/   )stringr3  r/   r/   r0   check_for_non_ascii_charactersa  s    
r  c             C   s4  | j  }| jjdk}d}| jjdj }t|dkrtt|t|krRt|d d|krld|krlt|d d|krd	|krt|d
 d|krd	|krt|d d|k}d|krt|dkrt|d d}n2d	|krd	}d}n d|krd}nd|krd}nd}|dkr4|d kr4t	j
| jjkr4tj| j}d}nP|d k	rL|dkrL|}|dkr`tj }n$|dkrxtj| j}ntj| j}x| j  | j}	| j}
|	dkr|j|
 |r| rt|
rd}n|	dkr4|r$|s|dks|
d dkr$|j|
 |r2| r2t|
r2d}nt|||
|  nR|	dkrJ|jd n<|	dkrXP n.|	dkrr| jd|d n| jd|	| jf  qW |dkrd }|j }t|dkrt|d|  nD|j \}}|r|rt	j
| jjkr|dkr | jd|d d }|d	kr"t| ||d|kd}| j  |||fS ) Nr$   Fz"'r    z!Duplicate string prefix characterr6  r4  z*String prefixes b and u cannot be combinedr7  z*String prefixes b and f cannot be combinedz*String prefixes u and f cannot be combinedrr3  z+Invalid string prefix for character literalTr9  ubCHARSESCAPEUuNEWLINE

END_STRINGEOFzUnclosed string literal)rN   z(Unexpected token %r:%r in string literalzinvalid character literal: %rz0bytes can only contain ASCII literal characters.)is_raw)r4  r7  )rM   rT   rY  rC   rk  lowerr   rp  r   r   unicode_literalsrU   r   StrLiteralBuilderrr  UnicodeLiteralBuilderBytesLiteralBuilderrD   rB   rJ   r  _append_escape_sequencegetchar
getstrings
p_f_string)rE   kind_overriderN   is_python3_source has_non_ascii_literal_characterskind_stringr  rP  charsrB   systrr:  r5  r/   r/   r0   ro  h  s    





$





$






ro  c             C   s$  |d }|dkr,|j t|dd  d n|dkrB|j| n|dkr^|jtj| n|dkrjn|dkrt|dkr|j t|d	d  d
 n|jd| dd nr|dko| dkrd}|dkrd }yt|dd  }t|}W n t	k
r(   |jdt
|dd! j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|jd|  d#}n|jd| dd |dkr |j|| n
|j| d S )$Nr    01234567   z'"\abfnrtvr  x   r#      zInvalid hex escape '%s'F)r   NUur4  r7  r9  Nr$   z!Unknown Unicode character name %sr   Csi   i   
   i      i zInvalid unicode escape '%s')r4  r7  r9  r   r   r   )r  r  r   )append_charvalre  rJ   r   char_from_escape_sequencer   r   r	   ordKeyErrorrb  lstrip	TypeErrorr   r
   append_uescape)rP  builderescape_sequencerE   r3  chrvalucharr/   r/   r0   r    sJ    
"$*


r  c             C   s.   g | ]&}t jd |rdnd d j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  r  r/   r/   r0   r    s   r  Fc             C   s  g }d}t |}tj }t|}|r(tnt}	x4||k rb|}
|d |
 |d< |	||}|d krntt|d |j }|j	 }|d }|dkr| rt |dkrt
d|||  n
|j| q0|dkr"|dkr|jd nF|jr|jtj||j d	 tj }t| ||||\}}|j| q0|d
krV|dkrB|jd
 n| jdt|d q0|j| q0W |jr|jtj||j d	 |S )Nr   r#   zInvalid escape sequence\r    r7  r-  z{{)r   }z}}z#f-string: single '}' is not allowed)rN   )r   r   r  r   r   r   r   r  endgroupr  rJ   r  r   rI  	getstringp_f_string_expr)rE   r:  rN   r  r8  
next_startsizer  	error_pos
_parse_seqr  r  partr3  	expr_noder/   r/   r0   r    sF    



r  c             C   s  |}t |}d  } }}	d }
d"}d}|}d}x||krB| jd || }||kr|dkr|d |d | |d f}t|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r2|d7 }n|dkrP|dkrP|d8 }nd|dkrf| jd nN|dkr|dkr|dkr|d |k r||d  dkr|d7 }q0|}P |d7 }q0W ||| jddjdd}|d |d |d | d f}|j st|d |dkrR|d7 }|d |kr:t|d n|| }|d7 }|| }|dkrTd}d}d}|d }x||kr| jd|d || }| r| r|dkr|d7 }n$|dkr|dkr|d8 }n|}P |d	kr:| r.|d |k r.||d  |kr.||d  |kr.| }|d7 }n|s:| }|d7 }qrW ||| }
|dkrl| jd|  td| }t||d | | j|d}t|}|d k	rtj	j
| rt|d|  |
rtj|t| |
||d }	|d tj	||||	d!fS )#Nr#      r   Fz'missing '}' in format string expressionr  r    z$backslashes not allowed in f-stringsz'"Tz{[(z}])#zformat string cannot include #z!:}!r   z
r  z(empty expression not allowed in f-stringz(invalid conversion char at end of stringr\   zmissing '}' in format specifier)rN   r-  r  z4missing '}' in format string expression', found '%s'z(%s))parent_scannerrr  initial_posz!invalid conversion character '%s')r8  )r   conversion_charformat_speci   @)r   r   replacestripr   r!   rr  r   r   FormattedValueNodefind_conversion_funcrK  r  )rE   r:  rN   starting_indexr  ir  r  terminal_charr  format_spec_strNO_CHARnested_depth
quote_charin_triple_quotesr3  r  expr_strexpr_pos	in_stringstart_format_specbufscannerri   r/   r/   r0   r  @  s    
,

2




*










:


r  c             C   s   | j  }| j  | jdkr2| jd tj|g dS t| }| jd
kr|jrT| jd tj	||d}t
| |}| jd tj|||tj| jjdkdS | jd	kr| j  t| |}n|g}| jd tj||dS )Nr  )r_   r   r   z2iterable unpacking cannot be used in comprehension)ri   r$   )looprJ   typehas_local_scoperI   )r   r   )rM   rD   rB   rd   r   ListNoder   
is_starredr   ComprehensionAppendNode
p_comp_forComprehensionNoder   	list_typerT   rY  p_test_or_starred_expr_list)rE   rN   ri   rJ   r  exprsr/   r/   r0   r@    s*    








r@  c             C   s0   | j dkrt| |S | j dkr(t| |S |S d S )Nr   r   rm   )r   r   )rB   r  	p_comp_if)rE   bodyr/   r/   r0   p_comp_iter  s
    



r  c             C   s^   | j  }d}| jdkr"d}| j  | jd t| d|d}|jd t| ||d tj|f|S )NFr   Tr   )allow_testlistr   )else_clauser  r   )	rM   rB   rD   rd   p_for_boundsr,   r  r   ForStatNode)rE   r  rN   r   kwr/   r/   r0   r    s    

r  c             C   s<   | j  }| j  t| }tj|tj||t| |dgd dS )N)	conditionr  )
if_clausesr  )rM   rD   rf   r   
IfStatNodeIfClauseNoder  )rE   r  rN   ro   r/   r/   r0   r    s    r  c             C   s  | j  }| j  | jdkr0| j  tj|g dS g }d}d}x,| jdkr|dkrf| jdkr`dnd}n.|t| jkr| jd	| j|dkrd
ndf  | j  | jdkr| jd t| }|j| d}nzt	| }|dkr| jdkrdnd}|dkr| j
d |}t	| }tj|j||d}|r2|d j| n|j|g d}| jdkrf| j  | jdkrhP q@P q@W | jdkrvt|dkr2t|d tr2t|d dkr2|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| |	}
| j
d tj||
|	|dS t|dkr^t|d t r^| jd n
| j
d tj|g dS | j
d |dkr<g }g }xT|D ]L}t|tr|j| n.|r|jtj|d j|d g }|j| qW |r|jtj|d j|d t|dkr*|d jr*|d S tj||tjdS g }g }xT|D ]L}t|trf|j| n.|r|jtj|d j|d g }|j| qJW |r|jtj|d j|d t|dkr|d jr|d S tj||ddS d S )Nr  )r  r   Fr   **r    r#   z%unexpected %sitem found in %s literalrp  dictzexpected expression, found '*'r\   )r  r   TrI   r   r   )key_expr
value_expr)ri   )r  rJ   r  z2iterable unpacking cannot be used in comprehension)r_   )r_   r  )r   r  )r   r  r   )r   r   ) rM   rD   rB   r   r
  r   r   r   rJ   re   rd   r  rN   r   r   AssertionErrorr  r   	dict_typeDictComprehensionAppendNoder  r   set_typer  r  r  r	  SetNodeis_set_literalMergedSequenceNoder  r  )rE   rN   partstarget_typelast_was_simple_itemr  r  r   comprehension_typerJ   r  r#  	set_itemsr  r  r/   r/   r0   rA     s    






0


 




rA  c             C   s|   | j  }| j  t| g}x$| jdkr>| j  |jt|  qW | jd t|dkr`|d }ntj||d}tj	||dS )NrI   r.  r    r   )r_   )r   )
rM   rD   re   rB   rJ   rd   r   r   r   BackquoteNode)rE   rN   r_   r   r/   r/   r0   rB  n  s    


rB  c             C   sH   |d k	r|gpg }x0| j tkrB|jt|  | j dkr8P | j  qW |S )NrI   )rB   expr_terminatorsrJ   re   rD   )rE   ri   r  r/   r/   r0   p_simple_expr_list}  s    
r  c             C   sH   |d k	r|gpg }x0| j tkrB|jt|  | j dkr8P | j  qW |S )NrI   )rB   r   rJ   r   rD   )rE   ri   r  r/   r/   r0   r    s    
r  c             C   sB   | j  }t| }| jdkr:| j  t| |}tj||dS |S d S )NrI   )r_   )rM   re   rB   rD   r  r   r   )rE   rN   ri   r  r/   r/   r0   r     s    

r   c             C   sB   | j  }t| }| jdkr:| j  t| |}tj||dS |S d S )NrI   )r_   )rM   r   rB   rD   r  r   r   )rE   rN   ri   r  r/   r/   r0   p_testlist_star_expr  s    

r  c             C   sV   | j  }t| }| jdkr:| j  t| |}tj||dS | jdkrNt| |S |S d S )NrI   )r_   r   r   )r   r   )rM   r   rB   rD   r  r   r   r   )rE   rN   ri   r  r/   r/   r0   r?    s    



r?  c             C   s2   t | tj|jtj|j|dd}tj|j|dS )N)r   )ri   )r  )r  r   r   rN   r   r   GeneratorExpressionNode)rE   ri   r  r/   r/   r0   r     s    r   r   r  r  r\   r   r  c             C   s&   | j  }| j  t| }tj||dS )N)rK   )rM   rD   rL   r   
GlobalNode)rE   rN   rK   r/   r/   r0   p_global_statement  s    r  c             C   s&   | j  }| j  t| }tj||dS )N)rK   )rM   rD   rL   r   NonlocalNode)rE   rN   rK   r/   r/   r0   p_nonlocal_statement  s    r  c             C   s  t | }| jdkr6|js$|js$|jr6| j  t| |_| jdkrV|jrV| j	d|j
d |g}x<| jdkr| j  | jdkrt| }nt | }|j| q^W t|dkrttj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  | jdkr@t| }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 )Nr\   r   zqa starred assignment target must be in a list or tuple - maybe you meant to use an index assignment: var[0] = ...)rN   r,  r    z([-+*/%^&|]|<<|>>|\*\*|//|@)=r   )r  r  z&Illegal operand for inplace operation.)r~   lhsrhs)ri   r#   )r  r	  )lhs_listr	  r   r   r   ) r  rB   r   is_subscriptis_attributerD   re   
annotationr  r   rN   r   rJ   r   r   r  r   r   r  r  r  r(  r  r  r   r_  r   r   InPlaceAssignmentNoder   SingleAssignmentNodeCascadedAssignmentNode)rE   ri   	expr_listr  r~   r	  r/   r/   r0   p_expression_or_assignment  sH    




r  c             C   s   | j  }d}| j  | jdkrL| j  t| }| jdkrP| j  | jd	k}nd }g }| jd
kr|jt|  x4| jdkr| j  | jdkrd}P |jt|  qnW tj||d}tj|||| dS )Nr   z>>rI   r  r  r    )r_   )r  streamappend_newline)r  r  )r  r  )r  r  )	rM   rD   rB   re   rJ   r   r   r   PrintStatNode)rE   rN   ends_with_commar  r_   r  r/   r/   r0   p_print_statement  s.    



r  c             C   s   | j  }| j  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	 | j  |j
t|  | j	d
kr| j  |j
t|  tj||dS )NTr#   r$   z.expected tuple of length 2 or 3, got length %dF)rN   r   r   z@tuple variant of exec does not support additional 'in' arguments)r   rI   )r_   )r#   r$   )rM   rD   r   r   r   r   r_   r   r   rB   rJ   re   r   ExecStatNode)rE   rN   codetuple_variantr_   r/   r/   r0   p_exec_statement!  s,    


r  c             C   s&   | j  }| j  t| }tj||dS )N)r_   )rM   rD   r  r   DelStatNode)rE   rN   r_   r/   r/   r0   p_del_statement<  s    r  c             C   s.   | j  }| jd |r$| jddd tj|S )NpasszExpected a newlineT)ignore_semicolon)rM   rd   expect_newliner   PassStatNode)rE   with_newlinerN   r/   r/   r0   p_pass_statementD  s
    
r#  c             C   s   | j  }| j  tj|S )N)rM   rD   r   BreakStatNode)rE   rN   r/   r/   r0   p_break_statementK  s    r%  c             C   s   | j  }| j  tj|S )N)rM   rD   r   ContinueStatNode)rE   rN   r/   r/   r0   p_continue_statementQ  s    r'  c             C   s6   | j  }| j  | jtkr$t| }nd }tj||dS )N)r   )rM   rD   rB   r   r   r   ReturnStatNode)rE   rN   r   r/   r/   r0   p_return_statementW  s    

r)  c             C   s   | j  }| j  d }d }d }d }| jtkrt| }| jdkrh| j  t| }| jdkr| j  t| }n| jdkr| j  t| }|s|s|rtj|||||dS tj|S d S )NrI   r   )exc_type	exc_valueexc_tbcause)rM   rD   rB   r   re   r   RaiseStatNodeReraiseStatNode)rE   rN   r*  r+  r,  r-  r/   r/   r0   p_raise_statementa  s0    




r0  c          
   C   s  | j  }| j}| j  t| ddg}x(| jdkrL| j  |jt| dd q&W g }tj| jjk}x|D ]\}}}}|dkrt	j
||||d}	nr|rd|krtj|tj|| jjddgd	}
nd }
t	j|tj||p|d
tj|tj||d|rdnd |
dd}	|j|	 qfW t	j||dS )Nr    )
as_allowedrI   cimport)module_nameas_nameis_absoluter   r   )r   )r_   )rG   r   )r3  r8   	name_list)r  r	  )stats)rM   rB   rD   p_dotted_namerJ   r   r   rT   rU   r   CImportStatNoder   r  r   r   r  r_  
ImportNodeStatListNode)rE   rN   rP  r#  r7  r5  target_namedotted_namer4  statr6  r/   r/   r0   p_import_statement~  s<    

r?  c             C   s  | j  }| j  | jdkr@d}x$| jdkr<|d7 }| j  q W nd }|d k	rn| jdkrn| j  | jjd }}n.|d krtj| jjkrd}t| dd\}}}}| jdkr| j	d	 | j}| j  |dk}d}	| jd
k r| j  | jjd
d d fg}
| j  n$| jdkrd}	| j  t
| |g}
x>| jdkr\| j  |	rH| jdkrHP |
jt
| | q W |	rn| jd |dkr|s| j	d n|r| j	d nvxt|
D ]l\}}}}|dkr| j	d| P ytt|}W n( tk
r   | j	d| | P Y nX | jjj| qW tj|S |dkr8tj||||
dS g }g }xH|
D ]@\}}}}|jtj||d |j|tj||pz|df qFW tj|
d d |d}tj|tj|tj||d||d|dS d S )Nr   r   r    importr2  r9  F)r1  zExpected 'import' or 'cimport'r   r   TrI   r   
__future__z?from __future__ imports must occur at the beginning of the filezinvalid syntaxbracesznot a chancez future feature %s is not defined)r3  relative_levelimported_names)r   )rG   )r_   )r3  r8   r6  )moduler#  )r@  r2  )r@  r2  )rM   rD   rB   rT   r   r   r   rU   r8  r   p_imported_namerJ   rd   getattrAttributeErroraddr   r!  FromCImportStatNoder   r   r_  r  FromImportStatNoder:  )rE   first_statementrN   r8   dotted_name_posr=  _rP  
is_cimportis_parenthesizedrD  name_posrG   r4  	directiveimported_name_stringsr#  import_listr/   r/   r0   p_from_import_statement  s    








 rU  classstructunionc             C   sD   | j  }d }|r(| jtkr(| j}| j  t| }t| }||||fS )N)rM   rC   imported_name_kindsrD   rH   	p_as_name)rE   rO  rN   rP  rG   r4  r/   r/   r0   rF    s    rF  c             C   sf   | j  }t| }d }|g}x$| jdkr>| j  |jt|  qW |rLt| }||| jjdj||fS )Nr   )	rM   rH   rB   rD   rJ   rZ  rT   r   rs  )rE   r1  rN   r<  r4  rK   r/   r/   r0   r8     s    r8  c             C   s,   | j dkr$| jdkr$| j  t| S d S d S )NrA   as)rB   rC   rD   rH   )rE   r/   r/   r0   rZ    s    rZ  c             C   sH   | j  }| j  t| }| jdkr4| j  t| }nd }tj|||dS )NrI   )condr   )rM   rD   re   rB   r   AssertStatNode)rE   rN   r\  r   r/   r/   r0   p_assert_statement  s    

r^  ;r  c             C   sX   | j  }| j  t| g}x$| jdkr>| j  |jt|  qW t| }tj|||dS )Nelif)r  r  )rM   rD   p_if_clauserB   rJ   p_else_clauser   r  )rE   rN   r  r  r/   r/   r0   p_if_statement$  s    
rc  c             C   s(   | j  }t| }t| }tj|||dS )N)r  r  )rM   re   p_suiter   r  )rE   rN   ro   r  r/   r/   r0   ra  0  s
    ra  c             C   s"   | j dkr| j  t| S d S d S )Nrn   )rB   rD   rd  )rE   r/   r/   r0   rb  7  s    
rb  c             C   s:   | j  }| j  t| }t| }t| }tj||||dS )N)r  r  r  )rM   rD   re   rd  rb  r   WhileStatNode)rE   rN   ro   r  r  r/   r/   r0   p_while_statement>  s    rf  c             C   sL   | j  }| j  t| d|d}t| }t| }|j|||d tj|f|S )NT)r  r   )r  r  r   )rM   rD   r  rd  rb  r,   r   r  )rE   r   rN   r  r  r  r/   r/   r0   r   J  s    r   c             C   s$  t | }| jdkr4| j  t| ||d}t||dS | j o@| r| jdkr`| j  t| }n
|d  }}t| }| j }t	| }| j }	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 | jd i S d S )Nr   )r   )targetiteratorr   )rG   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)rg  bound1	relation1	relation2bound2r%  )p_for_targetrB   rD   p_for_iteratorr  r   r   p_for_from_relationrM   rH   p_for_from_stepr   r_  r   r   rN   rG   rd   )rE   r  r   rg  rh  ri  rel1	name2_posname2rel2_posrel2rl  r%  r/   r/   r0   r  U  sH    





r  c             C   s*   | j tkr| j }| j  |S | jd d S )Nz#Expected one of '<', '<=', '>' '>=')rB   inequality_relationsrD   r   )rE   rO   r/   r/   r0   ro    s
    
ro  c             C   s0   | j dkr(| jdkr(| j  t| }|S d S d S )NrA   by)rB   rC   rD   r   )rE   r%  r/   r/   r0   rp    s
    rp  c             C   sp   | j  }t| }| jdkrh| j  |g}x0| j|krX|jt|  | jdkrNP | j  q*W tj||dS |S d S )NrI   )r_   )rM   r   rB   rD   rJ   r   r   )rE   r]   rN   ri   r  r/   r/   r0   p_target  s    

rx  c             C   s
   t | dS )Nr   )rx  )rE   r/   r/   r0   rm    s    rm  c             C   s6   | j  }|rt| }nt| }|r(tjntj||dS )N)sequence)rM   r   rr   r   AsyncIteratorNodeIteratorNode)rE   r  r   rN   ri   r/   r/   r0   rn    s
    
rn  c             C   s   | j  }| j  t| }g }d }| jdkrx| jdkrF|jt|  q,W | jdkrb| j  t| }tj||||d}| jdkr|S | jdkr| j  t| }tj|||dS | j	d d S )Nexceptrn   )r  except_clausesr  finally)r  finally_clausezExpected 'except' or 'finally')r|  rn   )
rM   rD   rd  rB   rJ   p_except_clauser   TryExceptStatNodeTryFinallyStatNoder   )rE   rN   r  r}  r  r  r/   r/   r0   p_try_statement  s,    




r  c             C   s   | j  }| j  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| j  t| }n>| jdkr| jdkr| j  | j  }t| }tj||d}d}t| }tj|||||d	S )
NFr\   rI   rA   r[  r#   )rG   T)patternrg  r  is_except_as)rM   rD   rB   re   r   r   r   r_   rC   rT   rY  rH   r_  rd  r   ExceptClauseNode)rE   rN   r*  r+  r  pos2rG   r  r/   r/   r0   r    s0    

r  c       
      C   s   | j  }| j  t| dd }| jd | jr|}| jj||}|r| jj| t	j
|.}t|}t||| |j| jd}t||}	W d Q R X |	S d S n
tj|S d S )Nr4  r#   z!Syntax error in include statement)rr  parse_comments)rM   rD   ro  r   compile_time_evalrT   find_include_fileincluded_filesrJ   r   open_source_filer   r!   encodingr  p_statement_listr   r!  )
rE   r2   rN   unicode_include_file_nameinclude_file_nameinclude_file_pathr7  source_descs2treer/   r/   r0   p_include_statement  s     
r  c             C   s0   | j   | jdkr$| j r$t| }nt| }|S )Ntemplate)rD   rC   r   p_with_templater   )rE   r   r/   r/   r0   p_with_statement  s
    
r  c             C   s   | j  }| j rt| jdkrt| jd
krt|r2| jd | j}| j  | jdkr\| j  t| }nt| }tj	|||dS t
| }d }| jdkr| jdkr| j  t| }| jdkr| j  t| |d}nt| }tj|||||d	S )NrA   r&   gilzwith gil/nogil cannot be asyncrI   )stater  r[  )r   )managerrg  r  r   )r&   r  )rM   r   rB   rC   r   rD   r   rd  r   GILStatNodere   r   WithStatNode)rE   r   rN   r  r  r  rg  r/   r/   r0   r     s*    



r   c             C   s   | j  }g }| j  | jd |j| j | j  x*| jdkr\| j  |j| j | j  q4W | jd | jdkr| j  | jd | j  t }||_	t
| ||}| j  |S t|d d S )Nr   rI   r  r\   z-Syntax error in template function declaration)rM   rD   rd   rJ   rC   rB   r   expect_indentr(   r>   p_c_func_or_var_declarationexpect_dedentr   )rE   rN   r>   body_ctxfunc_or_varr/   r/   r0   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@  r2  r   )rL  r,  assertr  )r@  r2  )rB   r  r  r  r  r  r%  r'  r)  r0  r?  rU  r   r^  r#  r  )rE   rL  r   r/   r/   r0   p_simple_statement9  s<    






















r  c             C   s   t | |d}|j}g }t|tjs,|j| xJ| jdkrv| j  | jdkrLP t | |d}t|tjrfq.|j| d}q.W |stj|}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| jd
| | jd |S )N)rL  r_  r  r  Fr    r   )r7  cdefz@The 'cdef' keyword is only allowed in Cython files (pyx/pxi/pxd)z%Syntax error in simple statement list)r  r  )r  r  )r  rN   r   r   r!  rJ   rB   rD   r   r;  r   ri   r   rG   r   r   )rE   r2   rL  r>  rN   r7  r/   r/   r0   p_simple_statement_list[  s2    





r  c             C   s   | j }d| _ t| }|| _ |S )Nr    )r[  r   )rE   oldri   r/   r/   r0   p_compile_time_expr~  s
    r  c             C   sd   | j  }| j}| j  t| }| jd t| }| jrL|j|}|j|| | j	ddd t
j|S )Nr   zExpected a newlineT)r  )rM   r\  rD   rH   rd   r  r  compile_time_valuedeclarer   r   r!  )rE   rN   denvrG   ri   r   r/   r/   r0   p_DEF_statement  s    

r  c       	      C   s   | j  }| j}|}| j}d }xL| j  t| }|o>t|j|| _t| |}| jrZ|}d}| jdkrP qW | jdkr| j  || _t| |}|r|}|st	j
|}|| _|S )Nr   ELIFELSE)rM   r  r\  rD   r  rd  r  rd  rB   r   r!  )	rE   r2   rN   
saved_evalcurrent_evalr  r   ri   r  r/   r/   r0   p_IF_statement  s2    




r  c       	   	   C   s  |j }d }| jdkr2|jd+kr(| jd t| |S | jdkrDt| S | jdkrXt| |S | jdkr|jd,krv| jd |j| _t| }|j r| jd-kr| jdkr| j	dkrq| jd n| jdkr|rt
| ddS d}| jdk rd}| j  n| jdkrd}d}| j  |r|jd.kr*| jd |j| _t| ||d}|d k	rtjtjtjf}|jrt|tjtjf7 }t||s| jd ||_|S |jr| jddd n | jdkrd|jkr|jdkr| jd |j| _t| |S | jdkr|jd/kr| jd  t| |S | jd!krF|jd0kr<| jd" t| |S |jd	krr| jdkrr| j	dkrrt| S | jdkr|jdkrt
| d#dS |jd1krt| }|d k	r|S | jd$ | jd%krt| S | 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rF| j  t | ||S | jdkr| j	dkr| j	}| j  | jdkrt | ||S |r| jd | j!d| t"| ||d*S d S )2NctypedefrE  
module_pxdz#ctypedef statement not allowed hereDEFIFr   rV  c_classr  propertyc_class_pxdr)   zdecorator not allowed herer   r  cpdefrA   r   z7Decorators can only be followed by functions or classesr  r    )r"  r   zcdef statement not allowed here)r<   z%'api' not allowed with this statementF)r   r   zdef statement not allowed herez!class definition not allowed hereincludez"include statement not allowed hereTz%Executable statement not allowed hererm   whiler   tryr   )rL  )rE  r  )rE  rV  r  r  r  r  r  r)   )r   r  r  rV  )rE  r  r  r  r  )rE  r  rV  r)   )rE  r  )r  r  )#r:   rB   r8   r   p_ctypedef_statementr  r  p_decoratorsr?   rC   r#  rD   p_cdef_statementr   CFuncDefNodeCVarDefNodeCClassDefNodeCStructOrUnionDefNodeCEnumDefNoder   r   r'   r   p_class_statementr  p_property_declp_ignorable_statementrc  rf  r   r  r  r   put_backr  )	rE   r2   rL  r:   r   r<   r   tup
ident_namer/   r/   r0   p_statement  s    



















$


r  c             C   sz   | j  }g }x8| jdkrDt| ||d}t|tjr4q|j| d}qW |sTtj|S t|dkrh|d S tj||dS d S )	NDEDENTr  )rL  Fr    r   )r7  )r  r  )	rM   rB   r  r   r   r!  rJ   r   r;  )rE   r2   rL  rN   r7  r>  r/   r/   r0   r  	  s    

r  c             C   s   t | |ddd S )NF)with_doc_onlyr    )p_suite_with_docstring)rE   r2   r/   r/   r0   rd  &	  s    rd  c             C   s   | j d d }| jdkrH| j  | j  |r4t| }t| |}| j  n@|jr\| jddd |j	dkrrt
| |}nt| }| jd
dd |st|\}}||fS )Nr\   r  z%'api' not allowed with this statementF)r   rE  rV  r  r)   zSyntax error in declarationsT)r  )rE  rV  r  r)   )rd   rB   rD   r  p_doc_stringr  r  r'   r   r8   r  r#  r   _extract_docstring)rE   r2   r  docr  r/   r/   r0   r  *	  s$    




r  c             C   s  g }g }d}xv| j |kr| j dks0| j dkr>| jddd d}| j dkr| j d dkr| j}| j  | j  t| rt| }n.t| |d	}	t| d
d}
t	j
|	j|	|
d}d}tj|j|d}|j||f d}npt| rt| }n.t| |d	}	t| d
d}
t	j
|	j|	|
d}d}|j| |d
7 }t|dkrF| jd|jd | j dkrz| j |krx|rx| jddj|  P | j  qW ||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   z**z$Argument expansion not allowed here.F)r   rA   r   )r>   r    )r   )r   r   T)r   z%Non-keyword arg following keyword arg)rN   rI   zUnmatched %sz or )rB   r   r   rC   rD   r   re   r   r   r   CComplexBaseTypeNoderN   r   r   rJ   r   rs  )rE   
end_sy_setr>   r   r   pos_idxparsed_typeidentr   r   r   keyword_nodewas_keywordr/   r/   r0   p_positional_and_keyword_argsA	  sP    





r  c             C   s*   | j dkrt| |dS t| |||dS d S )Nr   )r>   )nonemptyr>   )rB   p_c_complex_base_typep_c_simple_base_type)rE   	self_flagr  r>   r/   r/   r0   r   y	  s    
r   c             C   s.   | j dkr&| jtkr&| j}| j  |S dS d S )NrA   r9  )rB   rC   calling_convention_wordsrD   )rE   r   r/   r/   r0   p_calling_convention	  s
    r  	__stdcall__cdecl
__fastcallc             C   s   | j  }| j  t| |d}t| dd}tj|||d}| jdkr|g}xP| jdkr| j  | jdkrhP t| |d}t| dd}|jtj|||d qJW tj||d}| j	d | jdkrt
| rt| |}nt| ||}|S )	N)r>   T)r   )r   r   rI   r   )
componentsr   )rM   rD   r   r   r   r  rB   rJ   CTupleBaseTypeNoderd   is_memoryviewslice_accessp_memoryviewslice_accessp_buffer_or_template)rE   r>   rN   r   r   	type_noder  r/   r/   r0   r  	  s.    



r  c             C   s  d}d}d}d}g }| j  }	| jdks6t|	d| j  | jdkr| j  t| |||d}
t|
tjrztj	|	|
j
d|
_
|
S tj	|	|
dS t| r$d}| jdkr| jtkrt| j \}}| j}| j  n4t| \}}| jdkr| jtkr| j}| j  nd}| jdkr$| jd	kr$d}| j  n t| rl| j}| j  x| jd
krh|j| | j  t| }q>W n| j}| j  |r$| jdkr$| jdkr| j  | jdks| jdks| jdks| jdkr| jtkr| jdd n| jdd | jd| d }n| jdkr$| jd| d }tj|	||||||||d	}| jdkrnt| rbt| |}nt| ||}| jd
kr| j  t| }tj|	||d}|S )Nr   r    rA   z"Expected an identifier, found '%s'const)r  r  r>   )r   re  rg  r   r   r   **r   r   )rG   module_pathis_basic_c_typesignedrg  rX  is_self_argr>   )r   rG   )r   r  r   r   )rM   rB   r   rC   rD   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_namerJ   rH   r  r  CSimpleBaseTypeNoder  r  r  CNestedBaseTypeNode)rE   r  r  r>   is_basicr  rX  rg  r  rN   r   rG   r  r/   r/   r0   r  	  s    






$

r  c             C   sn   | j  }| j  t| d|\}}| jd | jdkr@t| ||}tj|dd |D d}tj	||||d}|S )Nr  r   c             S   s"   g | ]\}}t j|j||d qS ))rN   r  r   )r   r  rN   )r  r  r   r/   r/   r0   r  
  s   z(p_buffer_or_template.<locals>.<listcomp>)r  )r   r   r   )r  )
rM   rD   r  rd   rB   r  r   r
  r   r   )rE   r   r>   rN   r   r   r  r   r/   r/   r0   r  	  s    

r  c             C   s^   |r| r|S | r8|r8t | r*t| |S t| |d S n"| rZ| rZt | rVt| |S |S d S )N)r  r  r  )rE   r   r  r   r/   r/   r0   p_bracketed_base_type
  s    



r   c             C   s   | j | jfg}| j  d}| jdkr*d}n2| j dkr\|j| j | jf | j  | j dkr\d}x |d d d D ]}| j|  qlW |S )NFr\   Tr/  r    r   )rB   rC   rD   rJ   r  )rE   savedretvalsvr/   r/   r0   r  *
  s    


r  c             C   sh   | j  }| j  t| \}}x"|D ]}t|dk r"| jd q"W | jd t||}tj|||d}|S )Nr#   zDAn axis specification in memoryview declaration does not have a ':'.r  )r   axes)	rM   rD   r  r   r   rd   r  r   r   )rE   r   rN   r  rN  r)  r!  r   r/   r/   r0   r  ?
  s    


r  c             C   s   | j dko| jtkS )NrA   )rB   rC   r  )rE   r/   r/   r0   looking_at_nameO
  s    r  c             C   sP  | j tkrdS | jdkrHd}| j }g }| j  x,| jdkr\| j  |j| j  | jd q2W | j| j f}| jdkrzd}n| jdks| jdkr| j  | jdk}| j|  nP| jd	kr| j  | jdk}| j|  n(| jd
k r| j  | jdk}| j|  |j  x&|D ]}| jd| | jdd q
W | jd| | oF|d S dS d S )NFrA   r   Tr   z**r   r  r   r   r   )r   r  )rC   base_type_start_wordsrB   rD   rJ   rd   r  reverse)rE   is_typerG   dotted_pathr  pr/   r/   r0   r   R
  sB    







r   c             C   s   | j dko| jtkS )NrA   )rB   rC   r  )rE   r/   r/   r0   r  z
  s    r  c             C   s:   | j dkr2| j}| j  | j dk}| jd| |S dS d S )NrA   r   r   )rB   rC   rD   r  )rE   rG   r   r/   r/   r0   r  ~
  s    

r  c             C   s,   | j | jf}t| dk}|s(|\| _ | _|S )zSee if we're looking at a.b.c(r   )
start_line	start_colr   )rE   rM   r   r/   r/   r0   looking_at_call
  s
    r  voidcharre  rf  doublebint)
Py_UNICODEPy_UCS4	Py_hash_t
Py_ssize_tssize_tsize_t	ptrdiff_tPy_tss_tshortrj  r  rW  enumpackedc             C   st   d}d}xb| j dkrj| jtkrj| jdkr.d}n2| jdkr>d}n"| jdkrNd	}n| jdkr`|d7 }| j  q
W ||fS )
Nr    r   rA   rW  r  r#   r  rj  r   )rB   rC   sign_and_longness_wordsrD   )rE   r  rX  r/   r/   r0   r  
  s    



r  c             C   s,   t | d}|d k	r$t|}| j|_nd }|S )Nr4  )r|  r   rr  r  )rE   literalcnamer/   r/   r0   p_opt_cname
  s    

r   c          	   C   s  | j  }| jdkrx| j  | jdks,t| rVtj|| jjdd d}	t| |||	|}
qt	| |||||dd}
| j
d nt| ||||||}
| r|
jr| jdkrt| j  d|
j  xJ| jd
kr | j  }| jdkrt| |
}
n| j  t| |||
|}
d	}qW |
S )Nr   r   r9  )rG   r  r    )r   r  cmethod_flagr  calling_convention_allowedz&%s on something that is not a functionr   r   )r   r   )rM   rB   rD   r  r   CNameDeclaratorNoderT   r   p_c_func_declaratorr   rd   p_c_simple_declaratorcalling_conventionr   p_c_array_declarator)rE   r2   r   r  r!  
assignabler  r"  rN   r  r   r/   r/   r0   r   
  s0    




r   c             C   sB   | j  }| j  | jdkr$t| }nd }| jd tj|||dS )Nr  )r  	dimension)rM   rD   rB   r   rd   r   CArrayDeclaratorNode)rE   r  rN   dimr/   r/   r0   r'  
  s    


r'  c          
   C   sb   t | ||dd}t| }| jd t| }t| \}}	t| }
tj||||||	|pZ|jpZ|
|
dS )Nr   )r!  nonempty_declaratorsr   )r  r_   has_varargsexception_valueexception_checkr&   with_gil)	p_c_arg_listp_optional_ellipsisrd   p_nogilp_exception_value_clause
p_with_gilr   CFuncDeclaratorNoder&   )rE   rN   r2   r  r!  r_   ellipsisr&   exc_val	exc_checkr0  r/   r/   r0   r$  
  s    
r$  r   r   r   rQ   r   z++z--r   r   r   r   z<<z>>rI   z[]z()r  rd  c          	   C   s  | j  }t| }| jdkr| j  | jdkrb| j  }	| j  t| ||||||d}
tj|	|
d}nt| ||||||d}tj||d}nZ| jdkr| j  t| ||||||d}tj|tj||dd}n| jdkr
| j  t| ||||||d}tj	||d}nd }| jdkrr| j}|r4t
| j  d | j  t| }|d	kr| jd
kr|r| j  t| }n|rt
| j  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| j  |dkr| jd d}n`|dkr&| jd d}nF|d krN| j|krN|d9 }| j  n| jd
krl|| j7 }| j  |tkr| j
d| dd ||7 }n@|dkr| j}|tkr| j
d| dd |d | }| j  tj||||d}||_|S )!Nr   r  )r   r  r!  r(  r  )r  z**r   rA   zDeclarator should be emptyr~   r   zEmpty declaratorr9  z::externc             S   s   g | ]}|d krdqS )z+-*/<=>!%&|([^~,r    r/   )r  r3  r/   r/   r0   r  @  s    z)p_c_simple_declarator.<locals>.<listcomp>r   r   z()r   r  z[]r   r   r   r#   z,Overloading operator '%s' not yet supported.F)r    )rG   r  default)r   r   r   r   )rM   r  rB   rD   rC   r   r   CConstDeclaratorNodeCPtrDeclaratorNodeCReferenceDeclaratorNoder   r   re   r=   r9   rd   supported_overloaded_operatorsr#  r&  )rE   r2   r   r  r!  r(  r  rN   r&  	const_pos
const_baser  r   r	  rG   r  rO   r/   r/   r0   r%  	  s    





















r%  c             C   s(   | j dkr | jdkr | j  dS dS d S )NrA   r&   r    r   )rB   rC   rD   )rE   r/   r/   r0   r3  _  s    r3  c             C   s(   | j dkr | j  | jd dS dS d S )Nr   r  r    r   )rB   rD   expect_keyword)rE   r/   r/   r0   r5  f  s
    

r5  c             C   s   d }d}| j dkr| j  | j dkr2d}| j  n~| j dkrd}| j  | j dkrl| j}| j  t| |}q| j dkrtj| j dd}| j  n| j dkrd}| j  t| }||fS )	Nr   r|  r   r    r   rA   )r   r   )rB   rD   rC   rO  r   rH  rM   re   )rE   r8  r9  rG   r/   r/   r0   r4  n  s,    







r4  z**r   c       	   
   C   sP   g }|}xB| j tkrJ|jt| ||||||d | j dkr<P | j  d}q
W |S )N)r  kw_onlyr^   rI   r   )rB   c_arg_list_terminatorsrJ   p_c_arg_declrD   )	rE   r2   	in_pyfuncr!  r,  rD  r^   r_   r  r/   r/   r0   r1    s    

r1  c             C   s   | j dkrt|  dS dS d S )Nr   r    r   )rB   r'  )rE   r/   r/   r0   r2    s    
r2  c             C   sd  | j  }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 r| j}| j  | jdkr| jdkr| j  n
| j	d |st	|d	|  |dk}	|dk}|r| jd
kr| j  t
| }| jdkrJ| j  d|jkrB| jdkr tj|}
| j  n d|jkr6t
| }
n
t	|d nt
| }
tj|||||	|
||dS )Nr   )rG   r  r  r  rg  rX  r  r>   )r  rz   rt   rA   r;  zExpected 'None'z*'%s None' only allowed in Python functionsr\   r   r   r   r   r%   z;default values cannot be specified in pxd files, use ? or *)r   r   not_noneor_noner<  r  rD  )rz   rt   )r   r   )rM   r   r   r  r   r   rB   rD   rC   r   re   r8   r   r*  	modifiersCArgDeclNode)rE   r2   rG  r!  r  rD  r^   rN   rH  rI  r<  r  r   r   rP  r/   r/   r0   rF    sV    




rF  c             C   s(   | j dkr | jdkr | j  dS dS d S )NrA   r'   r    r   )rB   rC   rD   )rE   r/   r/   r0   p_api  s    rL  c             C   s  | j  }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| j  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r4| jdkr4t| ||S | jdkr| jtkr|jdkrbt|d |jr| jdkrt|d t| ||S | jdkr| jdkrt| ||S t| ||S d S )Nr*   publiczCannot combine 'api' with '%s'r:  r   r@  r    z$cdef blocks cannot be declared cpdefr\   rV  rE  r  z*Extension type definition not allowed herez(Extension types cannot be declared cpdefrA   r   z/C struct/union/enum definition not allowed herer  z'C struct/union cannot be declared cpdeffused)r*   rM  )rE  r  )rE  r  )rM   p_visibilityr9   r'   rL  r   rB   p_cdef_extern_blockrD   r3  r&   r<   p_cdef_blockr8   p_c_class_definitionrC   p_cpp_class_definitionstruct_enum_unionp_struct_enump_fused_definitionr  )rE   r2   rN   r/   r/   r0   r    sL    










r  c             C   s   t | |ddS )Nr    )r:   )rd  )rE   r2   r/   r/   r0   rQ    s    rQ  c             C   s   |j rt|d d }| jd | jdkr2| j  nt| dd }|ddd}| jd	krn| j  t| dd |_t| r|d|_	t
| |d
\}}tj|||||jdS )Nz+cdef extern blocks cannot be declared cpdefr   r   r4  r#   r    r:  )r:   r9   r=   T)include_fileverbatim_includer  r=   )r<   r   rd   rB   rD   ro  rC   r=   r3  r&   r  r   CDefExternNode)rE   rN   r2   rW  rX  r  r/   r/   r0   rP    s&    




rP  c             C   s   | j   | jdkrJ| j}| j   t| }|d krR|jd k	rR|jd | }nd }d }d }| jd g }| jdkr|t| || n4| j   | j  x| jd	krt| || qW | j  t	j
|||||j|j|j|j|jdkd	S )
NrA   z::r\   r  r  r  r  )rG   r  r#  r;   r9   create_wrapperr'   in_pxd)r  r  )rD   rB   rC   r   r=   rd   p_c_enum_liner  r  r   r  r;   r9   r<   r'   r8   )rE   rN   r2   rG   r  r#  r/   r/   r0   p_c_enum_definition   s0    


r]  c             C   s^   | j dkrHt| || x8| j dkrD| j  | j dkr6P t| || qW n| j  | jd d S )Nr  rI   r  r  zSyntax error in enum item list)r  r  )rB   p_c_enum_itemrD   r   )rE   r2   r#  r/   r/   r0   r\  =  s    

r\  c             C   sr   | j  }t| }t| }|d kr8|jd k	r8|jd | }d }| jdkrV| j  t| }|jtj	||||d d S )Nz::r   )rG   r  r   )
rM   rH   r   r=   rB   rD   re   rJ   r   CEnumDefItemNode)rE   r2   r#  rN   rG   r  r   r/   r/   r0   r^  I  s    

r^  c       	      C   s*  d}| j dkr8d}| j  | jdks.| j dkr8| jd | j }| j  t| }t| }|d krv|jd k	rv|jd | }d }| jdkr| j  | jd | j  g }t	 }xB| jd	kr| jd
kr|j
t| | j | q| j  | jd qW | j  n
| jd tj||||||j|j|j|jdk|d
S )NFr  TrA   rW  z::r\   r  r  r  zExpected a newlinez*Syntax error in struct or union definitionr  )	rG   r  rP  
attributesr;   r9   r'   r[  r  )rC   rD   rB   expectedrH   r   r=   rd   r  r(   rJ   r  rM   r   r  r   r  r;   r9   r'   r8   )	rE   rN   r2   r  rP  rG   r  r`  r  r/   r/   r0   p_c_struct_or_union_definitionV  s>    






rb  c             C   s   |j d	krt|d | j  t| }| jd | j  | j  g }x8| jdkrz| jdkrh|jt	|  n| j  | j  qDW | j
  |st|d tj|||dS )
z5
    c(type)def fused my_fused_type:
        ...
    rE  r  z&Fused type definition not allowed herer\   r  r  zNeed at least one type)rG   types)rE  r  )r8   r   rD   rH   rd   r   r  rB   rJ   r   r  r   FusedTypeNode)rE   rN   r2   rG   rc  r/   r/   r0   rV  z  s"    




rV  c             C   s&   | j dkrt| ||S t| ||S d S )Nr  )rC   r]  rb  )rE   rN   r2   r/   r/   r0   rU    s    
rU  c             C   sX   | j  }|}| jdkrT| jd	krT| j}|dkrL||krL| jd||f dd | j  |S )
NrA   r:  rM  readonlyr*   z,Conflicting visibility options '%s' and '%s'F)r   )r:  rM  re  )rM   rB   rC   r   rD   )rE   prev_visibilityrN   r9   r/   r/   r0   rO    s    rO  c             C   s4   | j dkr0| jdkr0| j}| j  |gt|  S g S )NrA   r%   )r%   )rB   rC   rD   p_c_modifiers)rE   modifierr/   r/   r0   rg    s
    rg  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| j  d}nd
}| jdkr| j	ddd | j  t
|  | jdk r|j dkr|j r| j	d t| tdd\}}	tj||j|||	|||j|j|d
}
n|r||_|g}xD| jdkrR| j  | jdkr2P t| ||ddd}|j| qW | 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 ) Nr  r  r    )r  r>   )rJ  )r!  r(  r  rA   r  	cpp_classr   z->z~Return type annotation is not allowed in cdef/cpdef signatures. Please define it before the function name, as in C signatures.F)r   r\   rE  r  z&C function definition not allowed herer  )r8   )	r9   r   r   r  r  rJ  r'   r<   is_const_methodrI   r  z&Syntax error in C variable declarationT)r  )r9   r   declaratorsr[  r  r'   rJ  r<   )r  r  )rE  r  r  r  ri  )r  r  )r  r  )r8   rg  r   r>   r   r<   rB   rC   rD   r   re   r  r(   r   r  r9   r'   rj  rJ   r  r   r  r  )rE   rN   r2   r!  rJ  r   r   rj  r  suiter   rk  doc_liner/   r/   r0   r    sn    








r  c             C   s   | j  }| j  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;   r9   rV  rA   rN  )r  )r  r  z"Syntax error in ctypedef statementT)r  r  )r   r   r9   r'   r[  )rM   rD   rO  r9   rL  r'   rB   rR  rC   rT  rU  rV  r   r   r   r   CTypeDefNoder8   )rE   r2   rN   r9   r'   r   r   r/   r/   r0   r    s*    
r  c             C   s   g }x| j dkr| j }| j  t| ddd }|jd}tj|| jj|d d}x,|dd  D ]}tj	|| jj||d}qbW | j d	krt
| |}|jtj||d
 | jd qW |S )Nr   r   )r1  r#   r   )rG   r    )r   r   r   )	decoratorz"Expected a newline after decorator)rB   rM   rD   r8  splitr   r_  rT   r   r   r   rJ   r   DecoratorNoder   )rE   r   rN   	decstringrK   ro  rG   r/   r/   r0   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.
    rA   zTCannot use cdef modifier '%s' in Python function signature. Use a decorator instead.F)r   )rB   r   r   rH   )rE   rG   r/   r/   r0   _reject_cdef_modifier_in_py  s    rs  c             C   s   | j  }|r| j  | j  t| t| }| jdd| jdkrB| jn| j  t| dd\}}}| jd t| | j d }| jdkr| j  t	| }t| | j t
| tdd\}	}
|r| j  tj||||||	|
|||d	
S )
Nr   z~Expected '(', found '%s'. Did you use cdef syntax in a Python declaration? Use decorators and Python type annotations instead.rA   r   )r]   z->r  )r8   )	rG   r_   r`   ra   r  r  r   r   return_type_annotation)rM   enter_asyncrD   rs  rH   rd   rB   rC   rc   re   r  r(   
exit_asyncr   DefNode)rE   r   r   rN   rG   r_   r`   ra   rt  r  r  r/   r/   r0   r   )  s0    


r   c             C   s   t | dd|d}d }d }| jdkr| j  | jdkr@t| |d}| jdkrl| j  |jt | ddd|d n| j|kr| jd | jd	kr| j  t| |d}| jdkr| j  |||fS )
Nr    )rG  r,  r^   r   rA   )r^   rI   )rG  r,  rD  r^   z-Syntax error in Python function argument listz**)r1  rB   rD   p_py_arg_declr	  r   )rE   r]   r^   r_   r`   ra   r/   r/   r0   rc   I  s(    







rc   c             C   sB   | j  }t| }d }|r2| jdkr2| j  t| }tj|||dS )Nr\   )rG   r  )rM   rH   rB   rD   re   r   PyArgDeclNode)rE   r^   rN   rG   r  r/   r/   r0   rx  _  s    rx  c       
   
   C   s   | j  }| j  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_   rV  )r8   r$   )rG   basesr   r  r  r   force_py3_semantics)rM   rD   r   rH   rr  r  rB   r   r  r   r   r  r(   r   PyClassDefNoderT   rY  )
rE   r   rN   
class_namer  r  r   r   r  r  r/   r/   r0   r  i  s$    
r  c             C   sD  | j   g }t| }x(| jdkr<| j   |j| t| }qW |rV|jdkrVt|d |r| jdkr| jdkr| j   t| }n|}d }d }d }d }	| jdkrt| dd\}
}|r| jd	 t||
|\}}|d krt	j
|g d
}| jdkr |jdkr|j rt| j d t| \}}}	| jdkrX|jdkr>d}nd}t| t|d\}}n| j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|||||||	|jdk||dS )Nr   r:  z6Qualified class name only allowed for 'extern' C classrA   r[  r   F)r   z$C classes cannot take keyword bases.)r_   r   rM  zBName options only allowed for 'public', 'api', or 'extern' C classr\   r  r  r  )r8   z"Syntax error in C class definitionz)Module name required for 'extern' C classz?Type object name specification not allowed for 'extern' C classz>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')r9   r;   r'   r3  r}  r4  rz  objstruct_nametypeobj_name
check_sizer[  r  r  )rM  r:  )rD   rH   rB   rJ   r9   r   rC   r   r  r   r   r'   rM   p_c_class_optionsr8   r  r(   r   r   r  r;   rs  )rE   rN   r2   r  r}  r4  r~  r  rz  r  r   r   rN  
body_levelr  r  r/   r/   r0   rR    s    








rR  c             C   s   d }d }d }| j d x| jdkr$P | jdkr@| j  t| }nL| jdkr\| j  t| }n0| jdkr| j  t| }|dkr| jd	|  | jd
krP | j  qW | j dd |||fS )Nr   rA   objectr  r  ignorewarnr   z/Expected one of ignore, warn or error, found %rrI   r  z)Expected 'object', 'type' or 'check_size')r  r  r   )rd   rB   rC   rD   rH   r   )rE   r~  r  r  r/   r/   r0   r    s.    







r  c             C   sB   | j  }| j  t| }t| tdddd\}}tj||||dS )Nr  )r8   T)r  )rG   r  r  )rM   rD   rH   r  r(   r   PropertyNode)rE   rN   rG   r  r  r/   r/   r0   r    s    r  c             C   s:   | j dkr6| j }t| }| jddd tj||dS dS )zO
    Parses any kind of ignorable statement that is allowed in .pxd files.
    r2  zSyntax error in stringT)r  )ri   N)rB   rM   r   r   r   r   )rE   rN   string_noder/   r/   r0   r    s    
r  c             C   sP   | j dkrH| j }t| \}}}| jddd |dkr:|S t|d |S d S d S )	Nr2  zSyntax error in doc stringT)r  r4  r9  z2Python 3 requires docstrings to be unicode strings)r4  r9  )rB   rM   rG  r   r   )rE   rN   rP  bytes_resultunicode_resultr/   r/   r0   r    s    

r  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).
    N)r7  r   z2Python 3 requires docstrings to be unicode strings)r   r   r   ri   is_string_literalr;  rN   r7  r   rJ  r   r   rL  r:  )r   doc_noder7  r  r/   r/   r0   r    s2    
r  c             C   s@   t | ||ddd}| jdkr<| jdt| jt| jf  |S )N)r8   r    )rL  r  z!Syntax error in statement [%s,%s])r  rB   r   rb  rC   )rE   r8   r2   r  r/   r/   r0   p_code+  s
    
r  z$^#\s*cython\s*:\s*((\w|[.])+\s*=.*)$c             C   s  i }x| j dkr| j }t| j}|r|jdj }ytj|dd}W n@ tk
r } z$| j	|j
d dd | j  wW Y d d }~X nX xX|D ]P}||krq|| || krt|d|f  q| j	d	||| || f |d
 qW d|kr| jj|d  |j| | j  qW |S )Ncommentliner    T)ignore_unknownr   F)r   zDuplicate directive found: %sz@Conflicting settings found for top-level directive %s: %r and %r)rN   rY  )rB   rM   !_match_compiler_directive_commentrC   r  r  r   parse_directive_list
ValueErrorr   r_   rD   r   rT   set_language_levelr,   )rE   r   rN   mdirectives_stringnew_directiveserG   r/   r/   r0   p_compiler_directive_comments7  s0    



r  c       
      C   s   | j  }t| }d| _| jjd krd| jjd |d jrddd l}|jd|d j t	t
jr\dndd t| }|rvd}nd}t| ||d	dd
}	| jdkr| jdt| jt| jf  t|||	||dS )NFr#   r   zoCython directive 'language_level' not set, using 2 for now (Py2). This will change in a later release! File: %sr    )
stacklevelr  rE  )r8   )rL  r  z!Syntax error in statement [%s,%s])r  r  full_module_namedirective_comments)rM   r  r  rT   rY  r  filenamewarningsr  FutureWarningcythoncompiledr  r  rB   r   rb  rC   r   )
rE   r   r  r2   rN   r  r  r  r8   r  r/   r/   r0   p_moduleX  s.    


r  c             C   s8   t | }| jdkr,| jd | jd d}nd}||fS )Nr   r   FT)rH   rB   rd   )rE   rG   requiredr/   r/   r0   p_template_definitionw  s    


r  c          
   C   s  | j   g }t| }t| }|d kr<|jd k	r<|jd | }| jdkrPt|d | jdkr| j   t| g}x$| jdkr| j   |jt|  qnW | jd dd |D }nd }d }| jd	kr| j   t	| |d
g}x(| jdkr| j   |jt	| |d
 qW | jd ng }| jdkr*t| j
 d t| }	| jdkr| j   | jd | j  g }
t|jd|	pn|jd}||_xB| jdkr| jdkr|
jt| | n| j   | jd q|W | j  nd }
| jd tj|||||j|jdk|
|dS )Nz::r   z*Qualified class name not allowed C++ classr   rI   r  c             S   s   g | ]\}}|qS r/   r/   )r  rG   r  r/   r/   r0   r    s    z*p_cpp_class_definition.<locals>.<listcomp>r   )r>   r   z&Name options not allowed for C++ classr\   r  ri  )r9   r8   r&   r  r  zExpected a newlinez$Syntax error in C++ class definitionr  )rG   r  base_classesr9   r[  r`  r>   )rD   rH   r   r=   rB   r   r  rJ   rd   r   rM   r3  r  r(   r9   r&   r>   p_cpp_class_attributer   r  r   CppClassNoder8   )rE   rN   r2   r  r}  r  r>   template_namesr  r&   r`  r  r/   r/   r0   rS    sh    







rS  c             C   s   d }| j dkrt| }| jdkr0t| | j |S | jdkrDt| |S | j dkr| jtkr| jdkrrt| | j |S t| | j |S n\t| | j |}|d k	rt	j
t	jt	jf}|jr|t	jt	jf7 }t||s| jd ||_|S d S )Nr   r   r  rA   r  z7Decorators can only be followed by functions or classes)rB   r  rC   rS  rM   r  rT  rU  r  r   r  r  r  r?   r  r  r   r   r   )rE   r2   r   r   r  r/   r/   r0   r    s(    






r  c       
      C   s  d| }|rl| j | |r*| j d|  t|}|tkr| j d|d |d f  x*tdt|D ]}t| || |d  qdW | j d|  d S t|tjry
|j	}W n t
k
r   |jj}Y nX | j d||jf  x8|jj D ]*\}}	|d	kr|d
krt| |	|d | qW d S |tkrl| j d x*tt|D ]}t| || |d  q<W | j d|  d S | j d||f  d S )Nz  z%s: z	(%s @ %s
r   r    r#   z%s)
z%s @ %s
tagrN   z[
z%s]
z%s%s
)writer  r  ranger   print_parse_treer   r   Noder  rH  rl  r5   rN   r+   r#  r   )
r7  r   r8   r  indtr  r  rG   r   r/   r/   r0   r    s:    



r  )r%   r&   r'   )r@   )T)T)NN)r4  )N)TF)N)N)r   )r   )F)TF)TF)F)r   )r   )r   )r   )F)N)r   r   N)N)N)r   r   )r   r   )r#   r   )r#   r   )r#   r   )r   r   )r#   r   )r    r   )r   r   r   r    )NF)r   r    )r    )N)rA  r   r  r  r  r  r  ior   r   r   unicodedatar   r	   r   r
   	functoolsr   r   Scanningr!   r   r"   r9  r   r   r   r   r   r   r   r   r   Errorsr   r   r   r   r   version_infor   
maxunicoder   r   r(   rH   rL   rP   r[   rj   rk   re   rf   rr   ru   rv   ry   r}   r   r   r   r   rp  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   rD  rO  r^  rG  r|  r  ro  r  r   r   r  r  r@  r  r  r  rA  rB  r  r  r   r  r?  r   r   r  r  r  r  r  r  r#  r%  r'  r)  r0  r?  rU  rY  rF  r8  rZ  r^  r   rc  ra  rb  rf  r   r  ro  rp  rv  rx  rm  rn  r  r  r  r  r   r  r  r  r  r  r  r  r  rd  r  r  r   r  r  r  r  r  r   r  r  r  r   r  r  r  r  r  r  r  r  rT  r  r   r   r'  r$  r@  r%  r3  r5  r4  rE  r1  r2  rF  rL  r  rQ  rP  r]  r\  r^  rb  rV  rU  rO  rg  r  r  r  rs  r   rc   rx  r  rR  r  r  r  r  r  r  r  r  r  r  r  r  rS  r  r  r/   r/   r/   r0   <module>   s  



	3*? 
),e.0z	n
	/
$Q+		"#f8	Q(
$	
!
$V  3)$"@
 
L	#
!
;