B
    d
                @   sP
  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*dZ+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-d. Z6d/d0 Z7d1d2 Z8d3d4 Z9d5d6 Z:d7d8 Z;d9d: Z<d;d< Z=ee>e>d=d>d?d@dAdBdCdDdEdFg
Z?dGdH Z@dIdJ ZAdKdL ZBdMdN ZCdOdP ZDdQdR ZEdSdT ZFdUdV ZGdWdX ZHdYdZ ZId[d\ ZJd]d^ ZKd_d` ZLdadb ZMdcdd ZNdedf ZOddgdhZPdidj ZQdkdl ZRdmdn ZSdodp ZTdqdr ZUdsdt ZVdudv ZWdwdx ZXddydzZYd{d| ZZd}d~ Z[dd Z\dd Z]dd Z^dddZ_dd Z`dddZadd Zbdd dD \ZcZddd Zedd Zfdd Zgdd Zhdd Zidd Zjdd Zkdd Zldd ZmdddZndddZodd Zpdd Zqdd Zrdd Zsee>e>ddddddgZtdd Zudd Zvdd Zwdd Zxdd Zydd ZzdddZ{ddĄ Z|ddƄ Z}ddȄ Z~ddʄ Zdd̄ Zddd΄Zee>e>dddgZddӄ ZddՄ Zddׄ Zddل Zee>e>dddgZdd݄ Zdd߄ Zdd Zdd ZdddZdddZdd Zdd Zee>e>d=dAd>d@gZdd Zdd ZdddZdd Zdd Zdd Zdd ZdddZdd Zddd 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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e>e>d0d1d2d3d4d5gZeed6d6d7d7d7d6d7d8d9Zee>e>d:d;d<d=gZee>eeB e>eB Zee>e>ddѐd>d?gZd@dA ZdBdC Ze, d d d d d d fdDdEZdFdG ZdHdI Zee>e>dJdKdLdMdNdOdPdQdRdSdTdUdVdWd?dCd@d>dAd=dXdYdZdd[gZd\d] Zd^d_ Zd`da Zdbdc Zee>e>dLdddeddgZe, d d d d dfdfdgZÐdhdi ZĐdƐ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 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ee	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 | d S )N)__dict__update)selfkwds r/   d/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/Cython/Compiler/Parsing.py__init__7   s    zCtx.__init__c             K   s&   t  }|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}|   |S | | 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 dkr0P |   qW |S )NrA   ,)rB   appendrC   rD   )rE   namesr/   r/   r0   p_ident_listJ   s    
rL   c             C   s   |   }| 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||||}|dkr
tj| jjkrVd|_q
d |_q
W |S )N/T)	rB   rP   r   
binop_noder   divisioncontextfuture_directivesZtruedivision)rE   opsZ
p_sub_exprn1rO   rN   n2r/   r/   r0   p_binop_expr`   s    
rY   Tc             C   sp   |   }|   | jdkr(g }d  }}nt| ddd\}}}| d |rTt| }nt| }tj|||||dS )N:F)
terminator	annotated)argsstar_argstarstar_argZresult_expr)	rM   rD   rB   p_varargslistexpectp_testp_test_nocondr   Z
LambdaNode)rE   allow_conditionalrN   r]   r^   r_   exprr/   r/   r0   	p_lambdefo   s    



rf   c             C   s   t | ddS )NF)rd   )rf   )rE   r/   r/   r0   p_lambdef_nocond   s    rg   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)	rB   rf   rM   	p_or_testrD   ra   rb   r   ZCondExprNode)rE   rN   re   rk   r)   r/   r/   r0   rb      s    


rb   c             C   s   | j dkrt| S t| S d S )Nrh   )rB   rg   rl   )rE   r/   r/   r0   rc      s    
rc   c             C   s   t | dtS )N)or)p_rassoc_binop_expr
p_and_test)rE   r/   r/   r0   rl      s    rl   c             C   sH   || }| j |krD|  }| j }|   t| ||}t||||}|S )N)rB   rM   rD   rn   r   rR   )rE   rV   Z	p_subexprrW   rN   rO   rX   r/   r/   r0   rn      s    
rn   c             C   s   t | dtS )N)and)rn   
p_not_test)rE   r/   r/   r0   ro      s    ro   c             C   s8   | j dkr,|  }|   tj|t| dS t| S d S )Nnot)operand)rB   rM   rD   r   ZNotNoderq   p_comparison)rE   rN   r/   r/   r0   rq      s
    
rq   c             C   sT   t | }| jtkrP|  }t| }t | }tj||||d}| jtkrPt| |_|S )N)operatorZoperand1operand2)	p_starred_exprrB   comparison_opsrM   p_cmp_opr   ZPrimaryCmpNodep_cascaded_cmpcascade)rE   rW   rN   rO   rX   r/   r/   r0   rt      s    


rt   c             C   s   | j dkrt| S t| S d S )N*)rB   rw   rb   )rE   r/   r/   r0   p_test_or_starred_expr   s    
r}   c             C   s@   |   }| jdkr d}|   nd}t| }|r<t||}|S )Nr|   TF)rM   rB   rD   
p_bit_exprr   ZStarredUnpackingNode)rE   rN   Zstarredre   r/   r/   r0   rw      s    

rw   c             C   s@   |   }t| }t| }tj|||d}| jtkr<t| |_|S )N)ru   rv   )	rM   ry   rw   r   ZCascadedCmpNoderB   rx   rz   r{   )rE   rN   rO   rX   resultr/   r/   r0   rz      s    


rz   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 )Nrr   inZnot_inisis_notz<>z!=)rB   rD   ra   )rE   rO   r/   r/   r0   ry      s    



ry   <>z==z>=z<=z<>z!=r   r   rr   c             C   s   t | dtS )N)|)rY   
p_xor_expr)rE   r/   r/   r0   r~     s    r~   c             C   s   t | dtS )N)^)rY   
p_and_expr)rE   r/   r/   r0   r   	  s    r   c             C   s   t | dtS )N)&)rY   p_shift_expr)rE   r/   r/   r0   r     s    r   c             C   s   t | dtS )N)z<<z>>)rY   p_arith_expr)rE   r/   r/   r0   r     s    r   c             C   s   t | dtS )N)+-)rY   p_term)rE   r/   r/   r0   r     s    r   c             C   s   t | dtS )N)r|   @rQ   %z//)rY   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 }|  }|   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   )rs   r   rA   Zsizeof)rB   rM   rD   r   Z	unop_noder   in_python_fileZAmpersandNode
p_typecastrC   p_sizeofp_power)rE   rB   rO   rN   argr/   r/   r0   r   &  s"    r   c       	      C   s   |   }|   t| }t|tj}t|tj}t|tj}|s\|s\|s\|jd kr\| 	d t
| dd}| jdkr|   d}nd}| d t| }|rtj|||dS tj|||||dS )	NzUnknown typer    )empty?r   r   )base_type_noders   )	base_type
declaratorrs   	typecheck)rM   rD   p_c_base_type
isinstancer   MemoryViewSliceTypeNodeTemplatedTypeNodeCConstTypeNoderG   r   p_c_declaratorrB   ra   r   r   ZCythonArrayNodeZTypecastNode)	rE   rN   r   Zis_memsliceZis_templateZis_constr   r   rs   r/   r/   r0   r   9  s0    



r   c             C   sl   |   }|   | d t| r:t| }tj||d}n$t| }t| dd}tj	|||d}| d |S )N()rs   r    )r   )r   r   ))
rM   rD   ra   looking_at_exprrb   r   ZSizeofVarNoder   r   ZSizeofTypeNode)rE   rN   rs   noder   r   r/   r/   r0   r   V  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)rN   fatal)r   )
rM   rD   rB   statement_terminatorsrb   
p_testlistr   r   ZYieldFromExprNodeYieldExprNode)rE   rN   Zis_yield_fromr   r/   r/   r0   p_yield_expressionj  s    

r   c             C   s   t | }tj|j|dS )N)re   )r   r   ExprStatNoderN   )rE   Z
yield_exprr/   r/   r0   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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"|  d dkr"t| S d }| jdkr@|  }|   t| }x| jdkr`t| |}qJW |rttj	||d}| jdkr|  }|   t
| }t|d||}|S )Nnewr   rA   await)r   [.)r   z**)rC   peek
p_new_exprrB   rM   rD   p_atom	p_trailerr   ZAwaitExprNoder   rR   )rE   Z	await_posrW   rN   rX   r/   r/   r0   r     s"    

r   c             C   s,   |   }|   t| }t| tj||dS )N)cppclass)rM   rD   r   p_callr   ZNewExprNode)rE   rN   r   r/   r/   r0   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)rM   rB   r   p_indexrD   rH   r   AttributeNode)rE   Znode1rN   rG   r/   r/   r0   r     s    



r   c       
      C   s  |   }|   g }g }d}d}x0| jdkrR| jdkrl|rP| 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rHP |   q$W | jdkr|s|st|dkrt|d dkrt| |d d gg}| d |pg g|fS )NFr   r|   z%Non-keyword arg following keyword arg)rN   Tz**=z!Expected an identifier before '=')valuerI   )r   asyncr    r   )rM   rD   rB   r   rJ   rb   is_namerN   rT   intern_ustringrG   r   IdentifierStringNodelenp_genexpra   )
rE   allow_genexprN   positional_argskeyword_argsZstarstar_seenZ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|\}	}
|tj|	j|	|
d q>|j	r|
|j q>|r|tj|d j|dd g }|| q>W |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 ))r]   )r   )r   listr   	TupleNodeZ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_dictZ	subtuples	arg_tuplekwargs
dict_itemsitemr   r   r/   )rN   r0   p_call_build_packed_args  s4    



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   )functionr]   )r   r   r   )	rM   r   r   r   r   r   ZSimpleCallNoder   ZGeneralCallNode)rE   r   rN   r   r   r   r   r/   r/   r0   r   ,  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stop)r]   )r   index])
rM   rD   p_subscript_listr   r   SliceIndexNodemake_slice_nodesr   	IndexNodera   )
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dkr2P |t |  qW ||fS )NTrI   Fr   )p_subscriptrB   rD   rJ   )rE   r   itemsr/   r/   r0   r   Q  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)rZ   rZ   )rZ   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   rb   )rE   Z
follow_setr/   r/   r0   r   n  s    
r   c             C   s"   |  d |  d |  d d S )Nr   )ra   )rE   r/   r/   r0   expect_ellipsisv  s    

r   c             C   sF   g }x<|D ]4}t |dkr*||d  q
|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 | }|st | }|s*t | }t j| |||dS )N)r   r   r   )r   NoneNodeZ	SliceNode)rN   r   r   r   r/   r/   r0   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FLOAT)r   ZIMAGr   BEGIN_STRINGcu)r   bytes_valuebf)values )r   unicode_valuezinvalid string kind '%s'rA   NoneTrueTFalseFZNULLz!Expected an identifier or literal)rM   rB   rD   r   r   r   p_testlist_compra   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   ZNullNodep_name)	rE   rN   rB   r   r   kindr	  r  rG   r/   r/   r0   r     sr    
















r   c             C   s   |   }| 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 )Nr  r   ZUuLlZLlLUTZLLr$   z4illegal integer literal syntax in Python source fileF)is_c_literalr   unsignedlongness)	rM   rC   rD   rT   language_levelr   r   r   IntNode)rE   rN   r   r&  r'  r%  r/   r/   r0   r    s2    

r  c             C   sH   |   }| js:|| jkr:| j|}t||}|d k	r:|S tj||dS )N)rG   )rM   compile_time_exprcompile_time_envZlookup_herewrap_compile_time_constantr   NameNode)rE   rG   rN   r   r   r/   r/   r0   r!    s    
r!  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 )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]   r#  z4Invalid type for compile-time constant: %r (type %s))reprr   r   Ellipsisr  r   boolr   intr)  floatr  complexr  imagrealrR   r   r  r   r   r   r  r   r   r   longrstripr   	__class__r5   )rN   r   repr   Zbvaluer]   r/   )rN   r0   r,    sD    








r,  c             C   s  |   }t| \}}}|dks(| jdkr2|||fS |g|g|g  }}}d  }}x| jdkr|   }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||	 ||
 || qRW |dks|dkr d |kr tt|| j	}|d	krBt
dd
d |D }|dkrg }xFt||D ]8\}}t|trz||7 }n|tj|t
|d q\W |||fS )Nr  r  zCCannot concatenate char literal with another string or char literalr  r  r  zFCannot mix string literals of different types, expected %s'', got %s'')r
  r  r  )r  r  c             S   s   g | ]}|d k	r|qS )Nr/   )r   r  r/   r/   r0   r   F  s    z(p_cat_string_literal.<locals>.<listcomp>)r   )rM   p_string_literalrB   r   setrJ   r   r   Z
join_bytessource_encodingr   joinzipr   r   r   r  )rE   rN   r"  r	  r  ZbstringsZustringsZ	positionsZ	next_kindZnext_bytes_valueZnext_unicode_valuer  r/   r/   r0   r  &  s@    

$




r  r  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 )Nr  r  r  zf-string not allowed herer
  z#internal parser configuration error)rB   rM   r<  r   )rE   Zrequired_typerN   r"  r	  r  r/   r/   r0   p_opt_string_literalR  s    
rA  c             C   s   x| D ]}|dkrdS qW dS )N   TFr/   )stringr  r/   r/   r0   check_for_non_ascii_charactersa  s    
rD  c             C   sT  |   }| 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}	x |   | j}
| j}|
dkr|	| |r|st|rd}n|
dkrT|rD|s|d	ks|d dkrD|	| |rR|sRt|rRd}nt||	||  nR|
dkrj|	d n<|
dkrxP n.|
dkr| jd|d n| d|
| jf  qW |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rBt| ||d|kd!}|   |||fS )"Nr$   Fr   r    r#   z"'z!Duplicate string prefix characterr
  r  z*String prefixes b and u cannot be combinedr  z*String prefixes b and f cannot be combinedz*String prefixes u and f cannot be combinedrr  z+Invalid string prefix for character literalTr  Zub)r  r  ZCHARSESCAPEZUuNEWLINE
Z
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)rM   rT   r(  r   rC   r9  lowerr=  r   r   unicode_literalsrU   r   ZStrLiteralBuilderr>  UnicodeLiteralBuilderZBytesLiteralBuilderrD   rB   rJ   rD  _append_escape_sequenceZgetcharZ
getstrings
p_f_string)rE   Zkind_overriderN   Zis_python3_sourceZ has_non_ascii_literal_charactersZstring_start_posZkind_stringrJ  r"  charsrB   Zsystrr  r	  r/   r/   r0   r<  h  s    
 






$





$






r<  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 }y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abfnrtvrH  x   r#      zInvalid hex escape '%s'F)r   ZNUu)r  r  r  r   Nr$   z!Unknown Unicode character name %sr  r   Csi   i   
   i   )   rX  i zInvalid unicode escape '%s')Zappend_charvalr3  rJ   r   Zchar_from_escape_sequencer   r   r	   ordKeyErrorr0  lstrip	TypeErrorr   r
   Zappend_uescape)r"  builderZescape_sequencerE   r  ZchrvalZucharr/   r/   r0   rN    sJ    
"$*


rN  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   rJ  r/   r/   r0   r     s   r   )TFc             C   s   | d | d | d | d fS )Nr   r    r#   r/   )rN   rC  ir/   r/   r0   _f_string_error_pos  s    rc  c             C   sp  g }d}t |}t }|r tnt}x$||k rJ|}	|||}
|
d krZt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(W |jrl|
tj|| d |S )Nr   zInvalid escape sequence\r    r  r  z{{)r   }z}}z#f-string: single '}' is not allowed)r   r   rM  r   r   r   rc  endgrouprN  rJ   rP  r   r  Z	getstringp_f_string_expr)rE   r  rN   rJ  r  Z
next_startsizer^  Z
_parse_seqrf  ra  partr  Z	expr_noder/   r/   r0   rO    sD    



rO  c             C   s  |}t |}d  } }}	d }
d}d}|}d}d}x||kr>P || }||kr|dkrr|slt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rB|dkrB|d8 }nl|dkr`tt|||d nN|dkr|dkr|dkr|d |k r||d  dkr|d7 }q4|}P |d7 }q4W ||| dddd}|d |d |d | d f}| stt|||d |dkrJ|d7 }|d |kr2n|| }|d7 }|| }|dkr:d}d}d}|d }x||krvP || }|s|s|dkr|d7 }n$|dkr|dkr|d8 }n|}P |d	kr |s|d |k r||d  |kr||d  |kr| }|d7 }n|s | }|d7 }qjW ||| }
|dkrhtt|||d|r`d| nd  td| }t||d | | j|d}t|}|d k	rt	j
|st|d|  |
rt	j|t| |
||d}	|d t	j
||||	dfS ) Ni   @r   Frd  z$backslashes not allowed in f-stringsTr#   r    z'"z{[(z}])#zformat string cannot include #z!:}!r   z
rH  z(empty expression not allowed in f-stringrZ   r  re  z'missing '}' in format string expressionz, found '%s'r  z(%s))Zparent_scannerr>  Zinitial_posz!invalid conversion character '%s')r  )r   conversion_charformat_spec)r   r   rc  replacestripr   r!   r>  r   r   ZFormattedValueNodeZfind_conversion_funcr  rO  )rE   r  rN   Zstarting_indexrJ  rb  ri  rn  Zterminal_charro  Zformat_spec_strZNO_CHARZnested_depth
quote_charZin_triple_quotesZbackslash_reportedr  Zexpr_strZexpr_posZ	in_stringZstart_format_specbufscannerre   r/   r/   r0   rh  D  s    ,

2




*









8


rh  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   r   z2iterable unpacking cannot be used in comprehension)re   r$   )looprJ   typeZhas_local_scoperI   )rM   rD   rB   ra   r   ListNoder}   
is_starredr   ComprehensionAppendNode
p_comp_forComprehensionNoder   Z	list_typerT   r(  p_test_or_starred_expr_list)rE   rN   re   rJ   ru  exprsr/   r/   r0   r    s*    








r  c             C   s0   | j dkrt| |S | j dkr(t| |S |S d S )N)r   r   ri   )rB   rz  	p_comp_if)rE   bodyr/   r/   r0   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   )	rM   rB   rD   ra   p_for_boundsr,   r  r   ForStatNode)rE   r  rN   r   kwr/   r/   r0   rz    s    

rz  c             C   s<   |   }|   t| }tj|tj||t| |dgd dS )N)	conditionr  )
if_clausesr  )rM   rD   rc   r   
IfStatNodeIfClauseNoder  )rE   r  rN   rk   r/   r/   r0   r~    s    r~  c             C   s  |   }|   | jdkr0|   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| 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}|r2|d | n||g d}| jdkrf|   | jdkrhP q@P q@W | jdkrtt|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| |	}
| 
d tj||
|	|dS t|dkr\t|d ts\| d n
| 
d tj|g dS | 
d |dkr:g }g }xT|D ]L}t|tr|| n.|r|tj|d j|d g }|| qW |r|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rd|| n.|r|tj|d j|d g }|| qHW |r|tj|d j|d t|dkr|d jr|d S tj||ddS d S )Nre  )r   r   F)r|   z**r|   r    r#   z%unexpected %sitem found in %s literalr=  dictzexpected expression, found '*'rZ   )r   r   r   TrI   )r   r   )Zkey_exprZ
value_expr)re   )ru  rJ   rv  z2iterable unpacking cannot be used in comprehension)r]   )r]   rv  )r   r   ) rM   rD   rB   r   r   r   r   rw   rJ   rb   ra   r   rN   r   r   AssertionErrorrv  r   	dict_typeZDictComprehensionAppendNoder   r   set_typery  rz  r{  r   ZSetNodeZis_set_literalZMergedSequenceNoder   r   )rE   rN   partsZtarget_typeZlast_was_simple_itemr   r   r   Zcomprehension_typerJ   ru  r   Z	set_itemsrj  r   r/   r/   r0   r    s    






0







r  c             C   s|   |   }|   t| g}x$| jdkr>|   |t|  qW | d t|dkr`|d }ntj||d}tj	||dS )NrI   r  r    r   )r]   )r   )
rM   rD   rb   rB   rJ   ra   r   r   r   ZBackquoteNode)rE   rN   r]   r   r/   r/   r0   r  z  s    


r  c             C   sH   |d k	r|gpg }x0| j tkrB|t|  | j dkr8P |   qW |S )NrI   )rB   expr_terminatorsrJ   rb   rD   )rE   re   r}  r/   r/   r0   p_simple_expr_list  s    
r  c             C   sH   |d k	r|gpg }x0| j tkrB|t|  | j dkr8P |   qW |S )NrI   )rB   r  rJ   r}   rD   )rE   re   r}  r/   r/   r0   r|    s    
r|  c             C   sB   |   }t| }| jdkr:|   t| |}tj||dS |S d S )NrI   )r]   )rM   rb   rB   rD   r  r   r   )rE   rN   re   r}  r/   r/   r0   r     s    

r   c             C   sB   |   }t| }| jdkr:|   t| |}tj||dS |S d S )NrI   )r]   )rM   r}   rB   rD   r|  r   r   )rE   rN   re   r}  r/   r/   r0   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 )NrI   )r]   )r   r   )rM   r}   rB   rD   r|  r   r   r   )rE   rN   re   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   )re   )ru  )rz  r   r   rN   r   r   ZGeneratorExpressionNode)rE   re   ru  r/   r/   r0   r     s    r   r   r   re  rZ   r   rG  c             C   s&   |   }|   t| }tj||dS )N)rK   )rM   rD   rL   r   Z
GlobalNode)rE   rN   rK   r/   r/   r0   p_global_statement  s    r  c             C   s&   |   }|   t| }tj||dS )N)rK   )rM   rD   rL   r   Z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|   t| |_| jdkrV|jrV| j	d|j
d |g}x<| jdkr|   | jdkrt| }nt | }|| q^W t|dkrtt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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 )NrZ   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   )ru   lhsrhs)re   r#   )r  r  )Zlhs_listr  ) r  rB   r   Zis_subscriptZis_attributerD   rb   
annotationrx  r   rN   r   rJ   r   r   ra  r   r   r   r   r   r   r   r   r   r-  r   r   ZInPlaceAssignmentNoder   SingleAssignmentNodeZCascadedAssignmentNode)rE   re   Z	expr_listr  ru   r  r/   r/   r0   p_expression_or_assignment  sH    




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|  x4| jdkr|   | jdkrd}P |t|  qnW tj||d}tj|||| dS )Nr   z>>rI   )rG  rI  r    )r]   )r   streamZappend_newline)	rM   rD   rB   rb   rJ   r   r   r   ZPrintStatNode)rE   rN   Zends_with_commar  r]   r   r/   r/   r0   p_print_statement  s.    



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 %dF)rN   r   r   z@tuple variant of exec does not support additional 'in' arguments)r   rI   )r]   )rM   rD   r~   r   r   r   r]   r   r   rB   rJ   rb   r   ZExecStatNode)rE   rN   codeZtuple_variantr]   r/   r/   r0   p_exec_statement-  s,    


r  c             C   s&   |   }|   t| }tj||dS )N)r]   )rM   rD   r  r   ZDelStatNode)rE   rN   r]   r/   r/   r0   p_del_statementH  s    r  c             C   s.   |   }| d |r$| jddd t|S )NpasszExpected a newlineT)ignore_semicolon)rM   ra   expect_newliner   PassStatNode)rE   with_newlinerN   r/   r/   r0   p_pass_statementP  s
    
r  c             C   s   |   }|   t|S )N)rM   rD   r   ZBreakStatNode)rE   rN   r/   r/   r0   p_break_statementW  s    r  c             C   s   |   }|   t|S )N)rM   rD   r   ZContinueStatNode)rE   rN   r/   r/   r0   p_continue_statement]  s    r  c             C   s6   |   }|   | jtkr$t| }nd }tj||dS )N)r   )rM   rD   rB   r   r   r   ZReturnStatNode)rE   rN   r   r/   r/   r0   p_return_statementc  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 )NrI   r   )exc_type	exc_valueexc_tbcause)rM   rD   rB   r   rb   r   ZRaiseStatNodeZReraiseStatNode)rE   rN   r  r  r  r  r/   r/   r0   p_raise_statementm  s0    




r  c          
   C   s  |   }| j}|   t| ddg}x(| jdkrL|   |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ddgd	}
nd }
t	j|tj||p|d
tj|tj||d|rdnd |
dd}	||	 qfW t	j||dS )Nr    )
as_allowedrI   cimport)module_nameas_nameis_absoluter   r|   )r   )r]   )rG   r   )r  r8   	name_list)r  r  )stats)rM   rB   rD   p_dotted_namerJ   r   r   rT   rU   r   ZCImportStatNoder   rw  r   r   r  r-  
ImportNodeStatListNode)rE   rN   r"  r   r  r  target_namedotted_namer  statr  r/   r/   r0   p_import_statement  s<    

r  c          	   C   s  |   }|   | jdkr@d}x$| jdkr<|d7 }|   q W nd }|d k	rn| jdkrn|   | 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 d fg}
|   n$| jdkrd}	|   t
| |g}
x>| jdkrZ|   |	rF| jdkrFP |
t
| | qW |	rl| d |dkr|s| 	d n|r| 	d nvxt|
D ]l\}}}}|dkr| 	d| P ytt|}W n( tk
r   | 	d| | P Y nX | jj| qW t|S |d	kr6tj||||
dS g }g }xH|
D ]@\}}}}|tj||d ||tj||px|df qDW tj|
d d |d}tj|tj|tj||d||d|dS d S )Nr   r   r    )importr  r  F)r  zExpected 'import' or 'cimport'r  r|   r   TrI   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_names)r   )rG   )r]   )r  r8   r  )moduler   )rM   rD   rB   rT   r   r   r   rU   r  r   p_imported_namerJ   ra   getattrAttributeErroraddr   r  ZFromCImportStatNoder   r   r-  rw  ZFromImportStatNoder  )rE   first_statementrN   r8   Zdotted_name_posr  _r"  
is_cimportZis_parenthesizedr  Zname_posrG   r  	directiveZimported_name_stringsr   Zimport_listr/   r/   r0   p_from_import_statement  s    









 r  classstructunionc             C   sT   |   }d }|r8| jtkr8| j}t|d| d |   t| }t| }||||fS )NzXthe "from module cimport %s name" syntax is deprecated and will be removed in Cython 3.0r#   )rM   rC   imported_name_kindsr   rD   rH   	p_as_name)rE   r  rN   r"  rG   r  r/   r/   r0   r    s    
r  c             C   sf   |   }t| }d }|g}x$| jdkr>|   |t|  qW |rLt| }||| jd||fS )Nr   )	rM   rH   rB   rD   rJ   r  rT   r   r?  )rE   r  rN   r  r  rK   r/   r/   r0   r    s    r  c             C   s,   | j dkr$| jdkr$|   t| S d S d S )NrA   as)rB   rC   rD   rH   )rE   r/   r/   r0   r    s    r  c             C   sH   |   }|   t| }| jdkr4|   t| }nd }tj|||dS )NrI   )condr   )rM   rD   rb   rB   r   ZAssertStatNode)rE   rN   r  r   r/   r/   r0   p_assert_statement#  s    

r  ;rI  c             C   sX   |   }|   t| g}x$| jdkr>|   |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_statement2  s    
r  c             C   s(   |   }t| }t| }tj|||dS )N)r  r  )rM   rb   p_suiter   r  )rE   rN   rk   r  r/   r/   r0   r  >  s
    r  c             C   s"   | j dkr|   t| S d S d S )Nrj   )rB   rD   r  )rE   r/   r/   r0   r  E  s    
r  c             C   s:   |   }|   t| }t| }t| }tj||||dS )N)r  r  r  )rM   rD   rb   r  r  r   ZWhileStatNode)rE   rN   rk   r  r  r/   r/   r0   p_while_statementL  s    r  Fc             C   sL   |   }|   t| d|d}t| }t| }|j|||d tj|f|S )NT)r  r   )r  r  r   )rM   rD   r  r  r  r,   r   r  )rE   r   rN   r  r  r  r/   r/   r0   r   X  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   )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)r  bound1Z	relation1Z	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   ra   )rE   r  r   r  r  r  Zrel1Z	name2_posZname2Zrel2_posZrel2r  r   r/   r/   r0   r  c  sH    





r  c             C   s*   | j tkr| j }|   |S | d d S )Nz#Expected one of '<', '<=', '>' '>=')rB   inequality_relationsrD   r   )rE   rO   r/   r/   r0   r    s
    
r  c             C   s0   | j dkr(| jdkr(|   t| }|S d S d S )NrA   Zby)rB   rC   rD   r~   )rE   r   r/   r/   r0   r    s
    r  c             C   sp   |   }t| }| jdkrh|   |g}x0| j|krX|t|  | jdkrNP |   q*W tj||dS |S d S )NrI   )r]   )rM   rw   rB   rD   rJ   r   r   )rE   r[   rN   re   r}  r/   r/   r0   p_target  s    

r  c             C   s
   t | dS )Nr   )r  )rE   r/   r/   r0   r    s    r  c             C   s6   |   }|rt| }nt| }|r(tjntj||dS )N)sequence)rM   r   rl   r   ZAsyncIteratorNodeZIteratorNode)rE   r  r   rN   re   r/   r/   r0   r    s
    
r  c             C   s   |   }|   t| }g }d }| jdkrx| jdkrF|t|  q,W | jdkrb|   t| }tj||||d}| jdkr|S | jdkr|   t| }tj|||dS | 	d d S )N)exceptrj   r  rj   )r  except_clausesr  finally)r  finally_clausezExpected 'except' or 'finally')
rM   rD   r  rB   rJ   p_except_clauser   ZTryExceptStatNodeZTryFinallyStatNoder   )rE   rN   r  r  r  r  r/   r/   r0   p_try_statement  s,    




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 )
NFrZ   rI   rA   r  r#   )rG   T)patternr  r  is_except_as)rM   rD   rB   rb   r   r   r   r]   rC   rT   r(  rH   r-  r  r   ZExceptClauseNode)rE   rN   r  r  r  pos2rG   r  r/   r/   r0   r    s0    

r  c       
   	   C   s   |   }|   t| dd }| d | jr|}| j||}|r| j| t	
|.}t|}t||| |j| jd}t||}	W d Q R X |	S d S n
t|S d S )Nr  r#   z!Syntax error in include statement)r>  parse_comments)rM   rD   r<  r  compile_time_evalrT   Zfind_include_fileZincluded_filesrJ   r   Zopen_source_filer   r!   encodingr  p_statement_listr   r  )
rE   r2   rN   Zunicode_include_file_nameZinclude_file_nameZinclude_file_pathr  Zsource_descs2treer/   r/   r0   p_include_statement  s     
r  c             C   s.   |    | jdkr"| js"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sr| jdkrr| jdkrr|r0| d | j}|   | jdkrZ|   t| }nt| }tj	|||dS t
| }d }| jdkr| jdkr|   t| }| jdkr|   t| |d}nt| }tj|||||dS )	NrA   )r&   gilzwith gil/nogil cannot be asyncrI   )stater  r  )r   )managerr  r  r   )rM   r   rB   rC   r   rD   r   r  r   ZGILStatNoderb   rw   ZWithStatNode)rE   r   rN   r  r  r  r  r/   r/   r0   r     s*    



r   c             C   s   |   }g }|   | d || j |   x*| jdkr\|   || j |   q4W | d | jdkr|   | d |   t }||_	t
| ||}|   |S t|d d S )Nr   rI   r   rZ   z-Syntax error in template function declaration)rM   rD   ra   rJ   rC   rB   r  expect_indentr(   r>   p_c_func_or_var_declarationexpect_dedentr   )rE   rN   r>   body_ctxZ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raise)r  r  r   )r  r  assertr  )rB   r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  )rE   r  r   r/   r/   r0   p_simple_statementG  s<    






















r  c             C   s   t | |d}|j}g }t|tjs,|| xJ| jdkrv|   | jdkrLP t | |d}t|tjrfq.|| d}q.W |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 )N)r  r  )rG  rI  Fr    r   )r  cdefz@The 'cdef' keyword is only allowed in Cython files (pyx/pxi/pxd)z%Syntax error in simple statement list)r  rN   r   r   r  rJ   rB   rD   r   r  r   re   r   rG   r   r  )rE   r2   r  r  rN   r  r/   r/   r0   p_simple_statement_listi  s2    





r  c             C   s   | j }d| _ t| }|| _ |S )Nr    )r*  r   )rE   oldre   r/   r/   r0   p_compile_time_expr  s
    r	  c             C   sd   |   }| j}|   t| }| d t| }| jrL||}||| | j	ddd t
|S )Nr   zExpected a newlineT)r  )rM   r+  rD   rH   ra   r	  r  compile_time_valuedeclarer  r   r  )rE   rN   denvrG   re   r   r/   r/   r0   p_DEF_statement  s    

r  c       	      C   s   |   }| j}|}| j}d }xL|   t| }|o>t||| _t| |}| jrZ|}d}| jdkrP qW | jdkr|   || _t| |}|r|}|st	
|}|| _|S )Nr   ZELIFELSE)rM   r  r+  rD   r	  r2  r
  r  rB   r   r  )	rE   r2   rN   Z
saved_evalZcurrent_evalr  r   re   r  r/   r/   r0   p_IF_statement  s2    




r  c       	      C   s  |j }d }| jdkr2|jdkr(| d t| |S | jdkrDt| S | jdkrXt| |S | jdkr|jdkrv| 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rd}|   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rp|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rB|jdkr8| d! t| |S |jd"krn| jd
krn| j	d#krnt| 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rt| S | jd*krt| S | jd+kr"t| S | jdkrB|   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IFr   )r  r  c_classr   propertyr  c_class_pxdr)   zdecorator not allowed here)r   r  cpdefr  r   rA   r   z7Decorators can only be followed by functions or classesr  r    )r  r   r  r  )r  r  r   r  r  zcdef statement not allowed here)r<   z%'api' not allowed with this statementF)r   r   r   r  zdef statement not allowed herer  )r  r   r  r)   z!class definition not allowed hereincludez"include statement not allowed herer  r  T)r  r  z%Executable statement not allowed hereri   whiler   tryr   )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_statementr  r  r   r  r  r   put_backr  )	rE   r2   r  r:   r   r<   r   tupZ
ident_namer/   r/   r0   p_statement  s    




















$


r&  c             C   sz   |   }g }x8| jdkrDt| ||d}t|tjr4q|| d}qW |sTt|S t|dkrh|d S tj||dS d S )N)DEDENTrI  )r  Fr    r   )r  )	rM   rB   r&  r   r   r  rJ   r   r  )rE   r2   r  rN   r  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   r  4	  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 )
NrZ   rG  z%'api' not allowed with this statementF)r   )r  r  r   r)   zSyntax error in declarationsT)r  )ra   rB   rD   r  p_doc_stringr  r  r'   r   r8   r  r  r  _extract_docstring)rE   r2   r(  docr  r/   r/   r0   r)  8	  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|  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rF| jd|jd | j dkrz| j |krx|rx| dd|  P |   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   rb   r   r   r   CComplexBaseTypeNoderN   r   r   rJ   r   r?  )rE   Z
end_sy_setr>   r   r   Zpos_idxZparsed_typeidentr   r   r   Zkeyword_nodeZwas_keywordr/   r/   r0   p_positional_and_keyword_argsO	  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_flagr0  r>   r/   r/   r0   r   	  s    
r   c             C   s.   | j dkr&| jtkr&| j}|   |S dS d S )NrA   r  )rB   rC   calling_convention_wordsrD   )rE   r   r/   r/   r0   p_calling_convention	  s
    r5  Z	__stdcallZ__cdeclZ
__fastcallc             C   s   |   }|   t| |d}t| dd}tj|||d}| jdkr|g}xP| jdkr|   | jdkrhP t| |d}t| dd}|tj|||d qJW tj||d}| 	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   ZCTupleBaseTypeNodera   is_memoryviewslice_accessp_memoryviewslice_accessp_buffer_or_template)rE   r>   rN   r   r   	type_noder6  r/   r/   r0   r1  	  s.    



r1  c             C   s  d}d}d}d}g }|   }	| jdks6t|	d| j  | jdkr|   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}|   n4t| \}}| jdkr| jtkr| j}|   nd}| jdkr$| jd	kr$d}|   n t| rl| j}|   x| jd
krh|| |   t| }q>W n| j}|   |r$| jdkr$| jdkr|   | jdks| jdks| jdks| jdkr| jtkr| dd n| dd | d| d }n| jdkr$| d| d }tj|	||||||||d	}| jdkrnt| rbt| |}nt| ||}| jd
kr|   t| }tj|	||d}|S )Nr   r    rA   z"Expected an identifier, found '%s'const)r3  r0  r>   )r   r3  r5  r   r   r|   z**r   )r|   z**r   r   )rG   module_pathis_basic_c_typesignedr5  r'  is_self_argr>   r   )r   rG   )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   r4  r$  CSimpleBaseTypeNoder7  r8  r9  ZCNestedBaseTypeNode)rE   r3  r0  r>   Zis_basicr>  r'  r5  r<  rN   r   rG   r:  r/   r/   r0   r2  	  s    






$

r2  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 ))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   )
rM   rD   r/  ra   rB   r9  r   r   r   r   )rE   r   r>   rN   r   r   r   r   r/   r/   r0   r9  

  s    

r9  c             C   sV   |r|s|S |s4|r4t | r&t| |S t| |d S n|sR|sRt | rNt| |S |S d S )N)r7  r8  r9  )rE   r   r0  r   r/   r/   r0   p_bracketed_base_type#
  s    

rF  c             C   s   | j | jfg}|   d}| jdkr*d}n2| j dkr\|| j | jf |   | j dkr\d}x |d d d D ]}| j|  qlW |S )NFrZ   Tr  r   )rB   rC   rD   rJ   r$  )rE   savedretvalsvr/   r/   r0   r7  8
  s    


r7  c             C   sh   |   }|   t| \}}x"|D ]}t|dk r"| d q"W | d t||}tj|||d}|S )Nr#   zDAn axis specification in memoryview declaration does not have a ':'.r   )r   Zaxes)	rM   rD   r   r   r   ra   r   r   r   )rE   r   rN   r   r  r   r   r   r/   r/   r0   r8  M
  s    


r8  c             C   s   | j dko| jtkS )NrA   )rB   rC   r4  )rE   r/   r/   r0   looking_at_name]
  s    rJ  c             C   sZ  | j tkrdS | jdkrRd}| j }g }|   x,| jdkr\|   || j  | d q2W | j| j f}| jdkrzd}n| jdks| jdkr|   | jdk}| j|  nZ| jdkr|   | jdk}| j|  n2| jd	kr|   | jd
kpt|  }| j|  |  x&|D ]}| d| | dd qW | d| | oP|d S dS d S )NFrA   r   Tr|   z**)r   r   r   r   r   r   )	rC   base_type_start_wordsrB   rD   rJ   ra   r$  r   reverse)rE   is_typerG   dotted_pathrG  pr/   r/   r0   r   `
  sB    






r   c             C   s   | j dko| jtkS )NrA   )rB   rC   rK  )rE   r/   r/   r0   r@  
  s    r@  c             C   s:   | j dkr2| j}|   | j dk}| d| |S dS d S )NrA   r   r   )rB   rC   rD   r$  )rE   rG   r   r/   r/   r0   rD  
  s    

rD  c             C   s,   | j | jf}t| dk}|s(|\| _ | _|S )zSee if we're looking at a.b.c(r   )
start_lineZ	start_colr   )rE   rM   r   r/   r/   r0   looking_at_call
  s
    rQ  voidcharr3  r4  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shortr8  r>  r&  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 }|   q
W ||fS )
Nr    r   rA   r&  r>  r#   rV  r   r8  )rB   rC   sign_and_longness_wordsrD   )rE   r>  r'  r/   r/   r0   rB  
  s    



rB  c             C   s,   t | d}|d k	r$t|}| j|_nd }|S )Nr  )rA  r   r>  r  )rE   literalcnamer/   r/   r0   p_opt_cname
  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  xH| jdkr|   }| jd	krt| |
}
n|   t| |||
|}
d
}qW |
S )Nr   r   r  )rG   r[  r    )r   rM  cmethod_flagr0  calling_convention_allowedz&%s on something that is not a function)r   r   r   r   )rM   rB   rD   rJ  r   CNameDeclaratorNoderT   r   p_c_func_declaratorr   ra   p_c_simple_declaratorcalling_conventionr   p_c_array_declarator)rE   r2   r   rM  r]  
assignabler0  r^  rN   r   r   r/   r/   r0   r   
  s0    




r   c             C   sB   |   }|   | jdkr$t| }nd }| d tj|||dS )Nr   )r   	dimension)rM   rD   rB   r   ra   r   ZCArrayDeclaratorNode)rE   r   rN   dimr/   r/   r0   rc  
  s    


rc  c          
   C   sn   t | ||dd}t| }| d t| }t| \}}	|p@t| }t| }
tj||||||	|pf|jpf|
|
dS )Nr   )r]  nonempty_declaratorsr   )r   r]   Zhas_varargsZexception_valueZexception_checkr&   with_gil)	p_c_arg_listp_optional_ellipsisra   p_nogilp_exception_value_clause
p_with_gilr   ZCFuncDeclaratorNoder&   )rE   rN   r2   r   r]  r]   ellipsisr&   exc_val	exc_checkrh  r/   r/   r0   r`    s    
r`  r   r   r|   rQ   r   z++z--r   r   r   r   z<<z>>rI   z[]z()rl  r2  c          	   C   s  |   }t| }| jdkr|   | jdkrb|   }	|   t| ||||||d}
tj|	|
d}nt| ||||||d}tj||d}nZ| jdkr|   t| ||||||d}tj|tj||dd}n| jdkr
|   t| ||||||d}tj	||d}nd }| jdkrr| j}|r4t
|   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rN| j|krN|d9 }|   n| jd
krl|| 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   rM  r]  rd  r0  )r   z**r   rA   zDeclarator should be emptyru   r   zEmpty declaratorr  z::externc             S   s   g | ]}|d krdqS )z+-*/<=>!%&|([^~,r    r/   )r   r  r/   r/   r0   r   P  s    z)p_c_simple_declarator.<locals>.<listcomp>r   r   z()r   r   z[])r   r   r   r   r#   z,Overloading operator '%s' not yet supported.F)r    )rG   r[  default)rM   r5  rB   rD   rC   r   r   ZCConstDeclaratorNodeZCPtrDeclaratorNodeZCReferenceDeclaratorNoder   r\  rb   r=   r9   ra   supported_overloaded_operatorsr_  rb  )rE   r2   r   rM  r]  rd  r0  rN   rb  Z	const_posZ
const_baser   r   r  rG   r[  rO   r/   r/   r0   ra    s    





















ra  c             C   s(   | j dkr | jdkr |   dS dS d S )NrA   r&   r    r   )rB   rC   rD   )rE   r/   r/   r0   rk  o  s    rk  c             C   s(   | j dkr |   | d dS dS d S )Nr   r  r    r   )rB   rD   Zexpect_keyword)rE   r/   r/   r0   rm  v  s
    

rm  c             C   s  d }d}| j dkr*| jdkr*|   d}n| j dkr|   | j dkrVd}|   n| j dkrd}|  d	 }|   | j dkr| j}|d
kr|  d	 |d krt|  d qt| |}|   n$| j dkrtj|  dd}|   n | j dkrd}|   t| }||fS )Nr   rA   ZnoexceptFr  r|   r    r   r#   r&   zf'except +nogil' defines an exception handling function. Use 'except + nogil' for the 'nogil' modifier.)r   r   )	rB   rC   rD   rM   r   r!  r   r  rb   )rE   ro  rp  Zplus_char_posrG   r/   r/   r0   rl  ~  s<    







rl  z**r   c       	      C   sP   g }|}xB| j tkrJ|t| ||||||d | j dkr<P |   d}q
W |S )N)r0  kw_onlyr\   rI   r   )rB   c_arg_list_terminatorsrJ   p_c_arg_declrD   )	rE   r2   	in_pyfuncr]  rg  ru  r\   r]   r?  r/   r/   r0   ri    s    

ri  c             C   s   | j dkrt|  dS dS d S )Nr   r    r   )rB   r   )rE   r/   r/   r0   rj    s    
rj  c             C   sb  |   }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rH|   d|jkr@| jdkrt|}
|   n d|jkr4t
| }
n
t	|d nt
| }
tj|||||	|
||dS )Nr   )rG   r<  r=  r>  r5  r'  r?  r>   )r0  )rr   rm   rA   r  zExpected 'None'z*'%s None' only allowed in Python functionsrm   rr   rZ   r   r   )r|   r   r%   z;default values cannot be specified in pxd files, use ? or *)r   r   not_noneor_noners  r  ru  )rM   r   r   rE  r   r   rB   rD   rC   r   rb   r8   r   r   	modifiersZCArgDeclNode)rE   r2   rx  r]  r0  ru  r\   rN   ry  rz  rs  r  r   r   r"  r/   r/   r0   rw    sV    




rw  c             C   s(   | j dkr | jdkr |   dS dS d S )NrA   r'   r    r   )rB   rC   rD   )rE   r/   r/   r0   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'rq  r   r  r    z$cdef blocks cannot be declared cpdefrZ   r  )r  r  z*Extension type definition not allowed herez(Extension types cannot be declared cpdefrA   r   z/C struct/union/enum definition not allowed hererW  z'C struct/union cannot be declared cpdeffused)rM   p_visibilityr9   r'   r|  r   rB   p_cdef_extern_blockrD   rk  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:   )r  )rE   r2   r/   r/   r0   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|   r  r#   r    rq  )r:   r9   r=   T)include_fileverbatim_includer  r=   )r<   r   ra   rB   rD   r<  rC   r=   rk  r&   r)  r   ZCDefExternNode)rE   rN   r2   r  r  r  r/   r/   r0   r  "  s&    




r  c             C   s   |    | jdkrJ| j}|    t| }|d krR|jd k	rR|jd | }nd }d }d }| d g }| jdkr|t| || n4|    |   x| jdkrt| || qW |   t	j
|||||j|j|j|j|jdkd	S )NrA   z::rZ   rG  )r'  rI  r  )rG   r[  r   r;   r9   Zcreate_wrapperr'   in_pxd)rD   rB   rC   r\  r=   ra   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 dkr6P t| || qW n|   | d d S )Nr  rI   )rG  rI  zSyntax error in enum item list)rB   p_c_enum_itemrD   r  )rE   r2   r   r/   r/   r0   r  X  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 )Nz::r   )rG   r[  r   )
rM   rH   r\  r=   rB   rD   rb   rJ   r   ZCEnumDefItemNode)rE   r2   r   rN   rG   r[  r   r/   r/   r0   r  d  s    

r  c       	      C   s*  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|   | d |   g }t	 }xB| jd	kr| jd
kr|
t| |  | q|   | d qW |   n
| d tj||||||j|j|j|jdk|d
S )NFrX  TrA   r  z::rZ   rG  r'  r  zExpected a newlinez*Syntax error in struct or union definitionr  )	rG   r[  r"  
attributesr;   r9   r'   r  rX  )rC   rD   rB   expectedrH   r\  r=   ra   r  r(   rJ   r  rM   r  r  r   r  r;   r9   r'   r8   )	rE   rN   r2   rX  r"  rG   r[  r  r  r/   r/   r0   p_c_struct_or_union_definitionq  s>    






r  c             C   s   |j dkrt|d |   t| }| d |   |   g }x8| jdkrz| jdkrh|t	|  n|   |   qDW | 
  |st|d tj|||dS )z5
    c(type)def fused my_fused_type:
        ...
    )r  r  z&Fused type definition not allowed hererZ   r'  r  zNeed at least one type)rG   types)r8   r   rD   rH   ra   r  r  rB   rJ   r   r  r   ZFusedTypeNode)rE   rN   r2   rG   r  r/   r/   r0   r    s"    




r  c             C   s&   | j dkrt| ||S t| ||S d S )NrW  )rC   r  r  )rE   rN   r2   r/   r/   r0   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 )NrA   )rq  r}  readonlyr*   z,Conflicting visibility options '%s' and '%s'F)r   )rM   rB   rC   r   rD   )rE   Zprev_visibilityrN   r9   r/   r/   r0   r    s    r  c             C   s4   | j dkr0| jdkr0| j}|   |gt|  S g S )NrA   )r%   )rB   rC   rD   p_c_modifiers)rE   modifierr/   r/   r0   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}xD| jdkrN|   | jdkr.P t| ||ddd}|| 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 )N)r  r  r    )r0  r>   )r{  )r]  rd  r0  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   rZ   )r  r  r  r  r  z&C function definition not allowed herer   )r8   )	r9   r   r   r  r,  r{  r'   r<   is_const_methodrI   rG  z&Syntax error in C variable declarationT)r  )r  r  )r9   r   declaratorsr  r,  r'   r{  r<   )r8   r  r   r>   r   r<   rB   rC   rD   r   rb   r)  r(   r   r  r9   r'   r  rJ   rP  r  r*  r  )rE   rN   r2   r]  r{  r   r   r  r,  Zsuiter   r  Zdoc_liner/   r/   r0   r    sn    









r  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;   r9   r  rA   r~  )r0  )rM  r0  z"Syntax error in ctypedef statementT)r  r  )r   r   r9   r'   r  )rM   rD   r  r9   r|  r'   rB   r  rC   r  r  r  r   r   r  r   ZCTypeDefNoder8   )rE   r2   rN   r9   r'   r   r   r/   r/   r0   r    s*    
r  c             C   s   g }x| j dkr|  }|   t| ddd }|d}tj|| j|d d}x,|dd  D ]}tj	|| j||d}qbW | j d	krt
| |}|tj||d
 | d qW |S )Nr   r   )r  r#   r   )rG   r    )r   r   r   )	decoratorz"Expected a newline after decorator)rB   rM   rD   r  splitr   r-  rT   r   r   r   rJ   r   ZDecoratorNoder  )rE   r   rN   Z	decstringrK   r  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    r  c             C   s   |   }|r|   |   t| t| }| dd| jdkrB| 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   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^   r_   r,  r  r   r   return_type_annotation)rM   Zenter_asyncrD   r  rH   ra   rB   rC   r`   rb   r)  r(   Z
exit_asyncr   ZDefNode)rE   r   r   rN   rG   r]   r^   r_   r  r,  r  r/   r/   r0   r   D  s0    


r   c          	   C   s   t | dd|d}d }d }| jdkr|   | jdkr@t| |d}| jdkrl|   |t | ddd|d n| j|kr| d | jd	kr|   t| |d}| jdkr|   |||fS )
Nr    )rx  rg  r\   r|   rA   )r\   rI   )rx  rg  ru  r\   z-Syntax error in Python function argument listz**)ri  rB   rD   p_py_arg_declr   r   )rE   r[   r\   r]   r^   r_   r/   r/   r0   r`   d  s(    







r`   c             C   sB   |   }t| }d }|r2| jdkr2|   t| }tj|||dS )NrZ   )rG   r  )rM   rH   rB   rD   rb   r   ZPyArgDeclNode)rE   r\   rN   rG   r  r/   r/   r0   r  z  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]   r  )r8   r$   )rG   basesr   r,  r  r   Zforce_py3_semantics)rM   rD   r   rH   r>  r  rB   r   r   r   r   r)  r(   r   ZPyClassDefNoderT   r(  )
rE   r   rN   
class_namer   r   r   r   r,  r  r/   r/   r0   r!    s$    
r!  c             C   sB  |    g }t| }x(| jdkr<|    || t| }qW |rV|jdkrVt|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rV|jdkr<d}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   rq  z6Qualified class name only allowed for 'extern' C classrA   r  r   F)r   z$C classes cannot take keyword bases.)r]   r   )r}  rq  zBName options only allowed for 'public', 'api', or 'extern' C classrZ   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 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')r9   r;   r'   r  r  r  r  objstruct_nametypeobj_name
check_sizer  r,  r  )rD   rH   rB   rJ   r9   r   rC   r   r   r   r   r'   rM   p_c_class_optionsr8   r)  r(   r  r   r  r;   r?  )rE   rN   r2   r<  r  r  r  r  r  r  r   r   r  Z
body_levelr,  r  r/   r/   r0   r    s    








r  c             C   s   d }d }d }|  d x| jdkr$P | jdkr@|   t| }nL| jdkr\|   t| }n0| jdkr|   t| }|dkr| d|  | jdkrP |   qW |  d	d
 |||fS )Nr   rA   objectrv  r  )ignorewarnr   z/Expected one of ignore, warn or error, found %rrI   r   z)Expected 'object', 'type' or 'check_size')ra   rB   rC   rD   rH   r   )rE   r  r  r  r/   r/   r0   r    s.    







r  c             C   sB   |   }|   t| }t| tdddd\}}tj||||dS )Nr  )r8   T)r(  )rG   r,  r  )rM   rD   rH   r)  r(   r   ZPropertyNode)rE   rN   rG   r,  r  r/   r/   r0   r"    s    r"  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.
    r  zSyntax error in stringT)r  )re   N)rB   rM   r   r  r   r   )rE   rN   Zstring_noder/   r/   r0   r#  
  s    
r#  c             C   sP   | j dkrH|  }t| \}}}| jddd |dkr:|S t|d |S d S d S )Nr  zSyntax error in doc stringT)r  )r  r  z2Python 3 requires docstrings to be unicode strings)rB   rM   r  r  r   )rE   rN   r"  Zbytes_resultZ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)r  r   z2Python 3 requires docstrings to be unicode strings)r   r   r   re   Zis_string_literalr  rN   r  r   r  r   r   r  r  )r   Zdoc_noder  r,  r/   r/   r0   r+  #  s2    
r+  c             C   s@   t | ||ddd}| jdkr<| dt| jt| jf  |S )N)r8   r    )r  rI  z!Syntax error in statement [%s,%s])r  rB   r   r0  rC   )rE   r8   r2   r  r/   r/   r0   p_codeF  s
    
r  z$^#\s*cython\s*:\s*((\w|[.])+\s*=.*)$c          
   C   s  i }x| j dkr|  }t| j}|r|d }ytj|dd}W n@ tk
r } z"| j	|j
d dd |   wW d d }~X Y nX xX|D ]P}||krq|| || krt|d|f  q| j	d	||| || f |d
 qW d|kr| j|d  || |   qW |S )NZcommentliner    T)Zignore_unknownr   F)r   zDuplicate directive found: %sz@Conflicting settings found for top-level directive %s: %r and %r)rN   r(  )rB   rM   !_match_compiler_directive_commentrC   rg  rq  r   Zparse_directive_list
ValueErrorr   r]   rD   r   rT   set_language_levelr,   )rE   r   rN   mZdirectives_stringZnew_directiveserG   r/   r/   r0   p_compiler_directive_commentsR  s0    



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 t| }|rvd}nd}t| ||d	dd
}	| jdkr| 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  r  )r8   )r  rI  z!Syntax error in statement [%s,%s])r,  r  full_module_namedirective_comments)rM   r  r  rT   r(  r  filenamewarningsr  FutureWarningcythoncompiledr*  r  rB   r   r0  rC   r   )
rE   r   r  r2   rN   r  r  r,  r8   r  r/   r/   r0   p_modules  s.    


r  c             C   s8   t | }| jdkr,| d | d d}nd}||fS )Nr   r|   FT)rH   rB   ra   )rE   rG   requiredr/   r/   r0   p_template_definition  s    


r  c          
   C   s  |    g }t| }t| }|d kr<|jd k	r<|jd | }| jdkrPt|d | jdkr|    t| g}x$| jdkr|    |t|  qnW | d dd |D }nd }d }| jd	kr|    t	| |d
g}x(| jdkr|    |t	| |d
 qW | d ng }| jdkr*t| 
 d t| }	| jdkr|    | d |   g }
t|jd|	pn|jd}||_xB| jdkr| jdkr|
t| | n|    | d q|W |   nd }
| 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++ classrZ   rG  r  )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   ra   r   rM   rk  r  r(   r9   r&   r>   p_cpp_class_attributer  r  r   ZCppClassNoder8   )rE   rN   r2   r<  r  r[  r>   Ztemplate_namesr  r&   r  r  r/   r/   r0   r    sh    







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   r  rA   rW  z7Decorators can only be followed by functions or classes)rB   r  rC   r  rM   r  r  r  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|  | |r*|  d|  t|}|tkr|  d|d |d f  x*tdt|D ]}t| || |d  qdW |  d|  d S t|tjry
|j	}W n t
k
r   |jj}Y nX |  d||jf  x8|j D ]*\}}	|d	kr|d
krt| |	|d | qW d S |tkrl|  d x*tt|D ]}t| || |d  q<W |  d|  d S |  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
)writerv  r   ranger   print_parse_treer   r   Noder  r  r:  r5   rN   r+   r   r   )
r  r   r8   r   indtrb  r  rG   r   r/   r/   r0   r    s:    



r  )r@   )T)T)NN)r  )N)N)N)r   )r   )F)TF)TF)F)r   )r   )r   )r   )F)N)r   r   N)N)N)r   r   r   r    )NF)r   r    )r    )N)r  r   r  r  r  rU  r   ior   r   r   unicodedatar   r	   r   r
   	functoolsr   r   ZScanningr!   r   r"   r  r   r   r   r   r   r   r   r   r   ZErrorsr   r   r   r   r   version_infor   
maxunicoder   r   r(   rH   rL   rP   rY   rf   rg   rb   rc   rl   rn   ro   rq   rt   r}   rw   rz   ry   r=  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  rA  rD  r<  rN  r   r   rc  rO  rh  r  r  rz  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  r  r   r  r  r  r	  r  r  r&  r  r  r)  r/  r   r5  r4  r1  r2  r9  rF  r7  r8  rJ  r   r@  rD  rQ  rC  r  rA  rY  rK  r  rB  r\  r   rc  r`  rt  ra  rk  rm  rl  rv  ri  rj  rw  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_  ra  r  r  r  r  r  r  r  r/   r/   r/   r0   <module>   s  



	3*? 
),f./ 	n
	/
$Q+		"#f8	Q(
$	
!
$V$  3)$"@
 
L	#
!
;