B
    \                @   sD
  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 ZldddZmdddZndd Zodd Zpdd Zqdd Zree>e>ddddddgZsdd Ztdd Zudd Zvdd Zwdd Zxdd ZydddZzdd 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dddZdd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>d.d/d0d1d2d3gZeed4d4d5d5d5d4d5d6d7Zee>e>d8d9d:d;gZee>eeB e>eB Zee>e>ddϐd<d=gZd>d? Zd@dA Ze, d d d d d d fdBdCZdDdE ZdFdG Zee>e>dHdIdJdKdLdMdNdOdPdQdRdSdTdUd?dCd@d>dAd=dVdWdXddYgZdZd[ Zd\d] Zd^d_ Zd`da Zee>e>dJdbdcddgZe, d d d d dfdddeZdfdg ZÐdĐ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 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/   6lib/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   Zdivisioncontextfuture_directivesZtruedivision)rE   opsZ
p_sub_exprn1rO   rN   n2r/   r/   r0   p_binop_expr`   s    
rX   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    



re   c             C   s   t | ddS )NF)rc   )re   )rE   r/   r/   r0   p_lambdef_nocond   s    rf   c             C   sh   | j dkrt| S |  }t| }| j dkr`|   t| }| d t| }tj||||dS |S d S )Nlambdaifelse)testZtrue_valZ	false_val)	rB   re   rM   	p_or_testrD   r`   ra   r   ZCondExprNode)rE   rN   rd   rj   r)   r/   r/   r0   ra      s    


ra   c             C   s   | j dkrt| S t| S d S )Nrg   )rB   rf   rk   )rE   r/   r/   r0   rb      s    
rb   c             C   s   t | dtS )N)or)p_rassoc_binop_expr
p_and_test)rE   r/   r/   r0   rk      s    rk   c             C   sH   || }| j |krD|  }| j }|   t| ||}t||||}|S )N)rB   rM   rD   rm   r   rR   )rE   rU   Z	p_subexprrV   rN   rO   rW   r/   r/   r0   rm      s    
rm   c             C   s   t | dtS )N)and)rm   
p_not_test)rE   r/   r/   r0   rn      s    rn   c             C   s8   | j dkr,|  }|   tj|t| dS t| S d S )Nnot)operand)rB   rM   rD   r   ZNotNoderp   p_comparison)rE   rN   r/   r/   r0   rp      s
    
rp   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   rV   rN   rO   rW   r/   r/   r0   rs      s    


rs   c             C   s   | j dkrt| S t| S d S )N*)rB   rv   ra   )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starredrd   r/   r/   r0   rv      s    

rv   c             C   s@   |   }t| }t| }tj|||d}| jtkr<t| |_|S )N)rt   ru   )	rM   rx   rv   r   ZCascadedCmpNoderB   rw   ry   rz   )rE   rN   rO   rW   resultr/   r/   r0   ry      s    


ry   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 )Nrq   inZnot_inisis_notz<>z!=)rB   rD   r`   )rE   rO   r/   r/   r0   rx      s    



rx   <>z==z>=z<=z<>z!=r   r   rq   c             C   s   t | dtS )N)|)rX   
p_xor_expr)rE   r/   r/   r0   r}     s    r}   c             C   s   t | dtS )N)^)rX   
p_and_expr)rE   r/   r/   r0   r   	  s    r   c             C   s   t | dtS )N)&)rX   p_shift_expr)rE   r/   r/   r0   r     s    r   c             C   s   t | dtS )N)z<<z>>)rX   p_arith_expr)rE   r/   r/   r0   r     s    r   c             C   s   t | dtS )N)+-)rX   p_term)rE   r/   r/   r0   r     s    r   c             C   s   t | dtS )N)r{   @rQ   %z//)rX   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   )rr   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_noderr   )	base_type
declaratorrr   	typecheck)rM   rD   p_c_base_type
isinstancer   MemoryViewSliceTypeNodeTemplatedTypeNodeCConstTypeNoderG   r   p_c_declaratorrB   r`   r   r   ZCythonArrayNodeZTypecastNode)	rE   rN   r   Zis_memsliceZis_templateZis_constr   r   rr   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()rr   r    )r   )r   r   ))
rM   rD   r`   looking_at_exprra   r   ZSizeofVarNoder   r   ZSizeofTypeNode)rE   rN   rr   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_terminatorsra   
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)rd   )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_posrV   rN   rW   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   ra   is_namerN   rS   intern_ustringrG   r   IdentifierStringNodelenp_genexpr`   )
rE   allow_genexprN   positional_argskeyword_argsZstarstar_seenZlast_was_tuple_unpackr   Z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   	IndexNoder`   )
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)rY   rY   )rY   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   ra   )rE   Z
follow_setr/   r/   r0   r   n  s    
r   c             C   s"   |  d |  d |  d d S )Nr   )r`   )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   INTZ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_compr`   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   rS   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   Z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   r8  r   )rE   Zrequired_typerN   r  r  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/   )stringr  r/   r/   r0   check_for_non_ascii_charactersa  s    
r@  c             C   s   |   }| jjdk}d}| jd }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}d}nP|d k	rL|dkrL|}|dkr`t }n$|dkrxt| j}nt| j}x |   | j}	| j}
|	dkr||
 |r|st|
rd}n|	dkr0|r |s|dks|
d dkr ||
 |r.|s.t|
r.d}nt|||
|  nR|	dkrF|d n<|	dkrTP n.|	dkrn| jd|d n| d|	| jf  qW |dkrd }| }t|dkrt|d|  n4| \}}|r|r|dkr| jd|d d }|d	krt| ||d|kd}|   |||fS ) Nr$   Fz"'r    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CHARSZ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   rS   r%  rC   r6  lowerr   r9  r   r   Zunicode_literalsrT   r   ZStrLiteralBuilderr:  UnicodeLiteralBuilderZBytesLiteralBuilderrD   rB   rJ   r@  _append_escape_sequenceZgetcharZ
getstrings
p_f_string)rE   Zkind_overriderN   Zis_python3_sourceZ has_non_ascii_literal_charactersZkind_stringrE  r  charsrB   Zsystrr  r  r/   r/   r0   r8  h  s    





$





$






r8  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    Z01234567   z'"\ZabfnrtvrC  x   r#      zInvalid hex escape '%s'F)r   ZNUu)r  r  r
  r   Nr$   z!Unknown Unicode character name %sr  r   ZCsi   i   
   i   )   rP  i zInvalid unicode escape '%s')Zappend_charvalr0  rJ   r   Zchar_from_escape_sequencer   r   r	   ordKeyErrorr-  lstrip	TypeErrorr   r
   Zappend_uescape)r  builderZescape_sequencerE   r  ZchrvalZucharr/   r/   r0   rH    sJ    
"$*


rH  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   rE  r/   r/   r0   r     s   r   )TFc             C   s  g }d}t |}t }t|}|r(tnt}	x0||k r^|}
|d |
 |d< |	||}|d krntt|d | }|	 }|d }|dkr|st |dkrt
d|||  n
|| q0|dkr|dkr|d nD|jr|tj|| d	 t }t| ||||\}}|| q0|d
krR|dkr>|d
 n| jdt|d q0|| q0W |jr|tj|| d	 |S )Nr   r#   zInvalid escape sequence\r    r  r   z{{)r   }z}}z#f-string: single '}' is not allowed)rN   )r   r   rG  r   r   r   r   r   endgrouprH  rJ   rJ  r   r  Z	getstringp_f_string_expr)rE   r  rN   rE  r	  Z
next_startsizerV  	error_posZ
_parse_seqr\  rY  partr  Z	expr_noder/   r/   r0   rI    sF    



rI  c             C   s  |}t |}d  } }}	d }
d}d}|}d}x||krB| 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| 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 ||| dddd}|d |d |d | d f}| st|d |dkrR|d7 }|d |kr:t|d n|| }|d7 }|| }|dkrNd}d}d}|d }x||kr| jd|d || }|s|s|dkr|d7 }n$|dkr|dkr|d8 }n|}P |d	kr4|s(|d |k r(||d  |kr(||d  |kr(| }|d7 }n|s4| }|d7 }qrW ||| }
|dkrf| 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   Fz'missing '}' in format string expressionrZ  r    r#   z$backslashes not allowed in f-stringsz'"Tz{[(z}])#zformat string cannot include #z!:}!r   z
rC  z(empty expression not allowed in f-stringz(invalid conversion char at end of stringrY   zmissing '}' in format specifier)rN   r   r[  z4missing '}' in format string expression', found '%s'z(%s))Zparent_scannerr:  Zinitial_posz!invalid conversion character '%s')r	  )r   conversion_charformat_spec)r   r   replacestripr   r!   r:  r   r   ZFormattedValueNodeZfind_conversion_funcr  rI  )rE   r  rN   Zstarting_indexrE  ir_  re  Zterminal_charrf  Zformat_spec_strZNO_CHARZnested_depthZ
quote_charZin_triple_quotesr  r`  Zexpr_strZexpr_posZ	in_stringZstart_format_specZbufscannerrd   r/   r/   r0   r^  ?  s    
,

2




*










8


r^  c             C   s   |   }|   | jdkr2| d tj|g dS t| }| jdkr|jrT| d tj	||d}t
| |}| d tj|||tj| jjdkdS | jdkr|   t| |}n|g}| d tj||dS )	Nr   )r\   )r   r   z2iterable unpacking cannot be used in comprehension)rd   r$   )looprJ   typeZhas_local_scoperI   )rM   rD   rB   r`   r   ListNoder|   
is_starredr   ComprehensionAppendNode
p_comp_forComprehensionNoder   Z	list_typerS   r%  p_test_or_starred_expr_list)rE   rN   rd   rJ   rk  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   rh   )rB   rp  	p_comp_if)rE   bodyr/   r/   r0   p_comp_iter  s
    



rv  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_clauseru  r   )	rM   rB   rD   r`   p_for_boundsr,   rv  r   ForStatNode)rE   ru  rN   r   kwr/   r/   r0   rp    s    

rp  c             C   s<   |   }|   t| }tj|tj||t| |dgd dS )N)	conditionru  )
if_clausesrx  )rM   rD   rb   r   
IfStatNodeIfClauseNoderv  )rE   ru  rN   rj   r/   r/   r0   rt    s    rt  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 )Nr[  )r   r   F)r{   z**r{   r    r#   z%unexpected %sitem found in %s literalr9  dictzexpected expression, found '*'rY   )r   r   r   TrI   )r   r   )Zkey_exprZ
value_expr)rd   )rk  rJ   rl  z2iterable unpacking cannot be used in comprehension)r\   )r\   rl  )r   r   ) rM   rD   rB   r   r   r   r   rv   rJ   ra   r`   r   rN   r   r   AssertionErrorrl  r   Z	dict_typeZDictComprehensionAppendNoder   r   Zset_typero  rp  rq  r   ZSetNodeZis_set_literalZMergedSequenceNoder   r   )rE   rN   partsZtarget_typeZlast_was_simple_itemr   r   r   Zcomprehension_typerJ   rk  r   Z	set_itemsra  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   ra   rB   rJ   r`   r   r   r   ZBackquoteNode)rE   rN   r\   r   r/   r/   r0   r  m  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   ra   rD   )rE   rd   rs  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   rd   rs  r/   r/   r0   rr    s    
rr  c             C   sB   |   }t| }| jdkr:|   t| |}tj||dS |S d S )NrI   )r\   )rM   ra   rB   rD   r  r   r   )rE   rN   rd   rs  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   rr  r   r   )rE   rN   rd   rs  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   rr  r   r   r   )rE   rN   rd   rs  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   )rd   )rk  )rp  r   r   rN   r   r   ZGeneratorExpressionNode)rE   rd   rk  r/   r/   r0   r     s    r   r   r   r[  rY   r   rB  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 )NrY   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   )rt   lhsrhs)rd   r#   )r  r  )Zlhs_listr  ) r  rB   r   Zis_subscriptZis_attributerD   ra   
annotationrn  r   rN   r   rJ   r   r   rY  r   r   r   r   r   r   r   r   r   r*  r   r   ZInPlaceAssignmentNoder   SingleAssignmentNodeZCascadedAssignmentNode)rE   rd   Z	expr_listr  rt   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   )rB  rD  r    )r\   )r   streamZappend_newline)	rM   rD   rB   ra   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   ra   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_statement;  s    r  c             C   s.   |   }| d |r$| jddd t|S )NpasszExpected a newlineT)ignore_semicolon)rM   r`   expect_newliner   PassStatNode)rE   with_newlinerN   r/   r/   r0   p_pass_statementC  s
    
r  c             C   s   |   }|   t|S )N)rM   rD   r   ZBreakStatNode)rE   rN   r/   r/   r0   p_break_statementJ  s    r  c             C   s   |   }|   t|S )N)rM   rD   r   ZContinueStatNode)rE   rN   r/   r/   r0   p_continue_statementP  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_statementV  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   ra   r   ZRaiseStatNodeZReraiseStatNode)rE   rN   r  r  r  r  r/   r/   r0   p_raise_statement`  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   rS   rT   r   ZCImportStatNoder   rm  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   rS   r   r   r   rT   r  r   p_imported_namerJ   r`   getattrAttributeErroraddr   r  ZFromCImportStatNoder   r   r*  rm  ZFromImportStatNoder  )rE   first_statementrN   r8   Zdotted_name_posr  _r  
is_cimportZis_parenthesizedr  Zname_posrG   r  Z	directiveZimported_name_stringsr   Zimport_listr/   r/   r0   p_from_import_statement  s    









 r  classstructunionc             C   sD   |   }d }|r(| jtkr(| j}|   t| }t| }||||fS )N)rM   rC   imported_name_kindsrD   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  rS   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   ra   rB   r   ZAssertStatNode)rE   rN   r  r   r/   r/   r0   p_assert_statement  s    

r  ;rD  c             C   sX   |   }|   t| g}x$| jdkr>|   |t|  qW t| }tj|||dS )Nelif)r}  rx  )rM   rD   p_if_clauserB   rJ   p_else_clauser   r~  )rE   rN   r}  rx  r/   r/   r0   p_if_statement#  s    
r  c             C   s(   |   }t| }t| }tj|||dS )N)r|  ru  )rM   ra   p_suiter   r  )rE   rN   rj   ru  r/   r/   r0   r  /  s
    r  c             C   s"   | j dkr|   t| S d S d S )Nri   )rB   rD   r  )rE   r/   r/   r0   r  6  s    
r  c             C   s:   |   }|   t| }t| }t| }tj||||dS )N)r|  ru  rx  )rM   rD   ra   r  r  r   ZWhileStatNode)rE   rN   rj   ru  rx  r/   r/   r0   p_while_statement=  s    r  Fc             C   sL   |   }|   t| d|d}t| }t| }|j|||d tj|f|S )NT)rw  r   )ru  rx  r   )rM   rD   ry  r  r  r,   r   rz  )rE   r   rN   r{  ru  rx  r/   r/   r0   r   I  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   r`   )rE   rw  r   r  r  r  Zrel1Z	name2_posZname2Zrel2_posZrel2r  r   r/   r/   r0   ry  T  sH    





ry  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   rv   rB   rD   rJ   r   r   )rE   rZ   rN   rd   rs  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)Zsequence)rM   r   rk   r   ZAsyncIteratorNodeZIteratorNode)rE   rw  r   rN   rd   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)exceptri   r  ri   )ru  except_clausesrx  finally)ru  finally_clausezExpected 'except' or 'finally')
rM   rD   r  rB   rJ   p_except_clauser   ZTryExceptStatNodeZTryFinallyStatNoder   )rE   rN   ru  r  rx  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 )
NFrY   rI   rA   r  r#   )rG   T)patternr  ru  is_except_as)rM   rD   rB   ra   r   r   r   r\   rC   rS   r%  rH   r*  r  r   ZExceptClauseNode)rE   rN   r  r  r  Zpos2rG   ru  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   r8  r  compile_time_evalrS   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s2Z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   )stateru  r  )r   )managerr  ru  r   )rM   r   rB   rC   r   rD   r   r  r   ZGILStatNodera   rv   ZWithStatNode)rE   r   rN   r  ru  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   rY   z-Syntax error in template function declaration)rM   rD   r`   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_statement8  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  )rB  rD  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   rd   r   rG   r   r  )rE   r2   r  r  rN   r  r/   r/   r0   p_simple_statement_listZ  s2    





r  c             C   s   | j }d| _ t| }|| _ |S )Nr    )r'  r   )rE   oldrd   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   r`   r  r  compile_time_valuedeclarer  r   r  )rE   rN   denvrG   rd   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  r/  r  r  rB   r   r  )	rE   r2   rN   Z
saved_evalZcurrent_evalr  r~   rd   ru  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  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 hereZincludez"include statement not allowed herer  r  T)r  r  z%Executable statement not allowed hererh   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)DEDENTrD  )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  %	  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 )
NrY   rB  z%'api' not allowed with this statementF)r   )r  r  r   r)   zSyntax error in declarationsT)r  )r`   rB   rD   r  p_doc_stringr  r  r'   r   r8   r  r  r  _extract_docstring)rE   r2   r  docru  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|  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   ra   r   r   r   CComplexBaseTypeNoderN   r   r   rJ   r   r;  )rE   Z
end_sy_setr>   r   r   Zpos_idxZparsed_typeZidentr   r   r   Zkeyword_nodeZwas_keywordr/   r/   r0   p_positional_and_keyword_args@	  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   x	  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
    r#  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CTupleBaseTypeNoder`   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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)r!  r  r>   )r   r0  r2  r   r   r{   z**r   )r{   z**r   r   )rG   module_pathis_basic_c_typesignedr2  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   r"  r  CSimpleBaseTypeNoder%  r&  r'  ZCNestedBaseTypeNode)rE   r!  r  r>   Zis_basicr,  r$  r2  r*  rN   r   rG   r(  r/   r/   r0   r   	  s    






$

r   c             C   sn   |   }|   t| d|\}}| d | jdkr@t| ||}tj|dd |D d}tj	||||d}|S )N)r   r   r   c             S   s"   g | ]\}}t j|j||d qS ))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  r`   rB   r'  r   r   r   r   )rE   r   r>   rN   r   r   r   r~   r/   r/   r0   r'  	  s    

r'  c             C   sV   |r|s|S |s4|r4t | r&t| |S t| |d S n|sR|sRt | rNt| |S |S d S )N)r%  r&  r'  )rE   r   r  r   r/   r/   r0   p_bracketed_base_type
  s    

r4  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 )NFrY   Tr  r   )rB   rC   rD   rJ   r  )rE   savedZretvalZsvr/   r/   r0   r%  )
  s    


r%  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   r`   r   r   r   )rE   r   rN   r   r  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_nameN
  s    r6  c             C   sN  | j tkrdS | jdkrFd}| 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|  nN| jdkr|   | jdk}| j|  n&| jd	kr|   | jd
k}| j|  |  x&|D ]}| d| | dd qW | d| | oD|d S dS d S )NFrA   r   Tr{   z**)r   r   r   r   r   r   )rC   base_type_start_wordsrB   rD   rJ   r`   r  reverse)rE   is_typerG   Zdotted_pathr5  pr/   r/   r0   r   Q
  sB    








r   c             C   s   | j dko| jtkS )NrA   )rB   rC   r7  )rE   r/   r/   r0   r.  y
  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   r2  }
  s    

r2  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
    r<  Zvoidcharr0  r1  Z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shortr5  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#   r?  r   r5  )rB   rC   sign_and_longness_wordsrD   )rE   r,  r$  r/   r/   r0   r0  
  s    



r0  c             C   s,   t | d}|d k	r$t|}| j|_nd }|S )Nr  )r=  r   r:  r  )rE   literalcnamer/   r/   r0   p_opt_cname
  s    

rE  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   rD  r    )r   r9  cmethod_flagr  calling_convention_allowedz&%s on something that is not a function)r   r   r   r   )rM   rB   rD   r6  r   CNameDeclaratorNoderS   r   p_c_func_declaratorr   r`   p_c_simple_declaratorcalling_conventionr   p_c_array_declarator)rE   r2   r   r9  rF  
assignabler  rG  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   Z	dimension)rM   rD   rB   r   r`   r   ZCArrayDeclaratorNode)rE   r   rN   Zdimr/   r/   r0   rL  
  s    


rL  c          
   C   sb   t | ||dd}t| }| d t| }t| \}}	t| }
tj||||||	|pZ|jpZ|
|
dS )Nr   )rF  nonempty_declaratorsr   )r   r\   Zhas_varargsZexception_valueZexception_checkr&   with_gil)	p_c_arg_listp_optional_ellipsisr`   p_nogilp_exception_value_clause
p_with_gilr   ZCFuncDeclaratorNoder&   )rE   rN   r2   r   rF  r\   Zellipsisr&   exc_val	exc_checkrO  r/   r/   r0   rI  
  s    
rI  r   r   r{   rQ   r   z++z--r   r   r   r   z<<z>>rI   z[]z()rc  r/  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   r9  rF  rM  r  )r   z**r   rA   zDeclarator should be emptyrt   r   zEmpty declaratorr
  z::externc             S   s   g | ]}|d krdqS )z+-*/<=>!%&|([^~,r    r/   )r   r  r/   r/   r0   r   ?  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   rD  default)rM   r#  rB   rD   rC   r   r   ZCConstDeclaratorNodeZCPtrDeclaratorNodeZCReferenceDeclaratorNoder   rE  ra   r=   r9   r`   supported_overloaded_operatorsrH  rK  )rE   r2   r   r9  rF  rM  r  rN   rK  Z	const_posZ
const_baser   r~   r  rG   rD  rO   r/   r/   r0   rJ    s    





















rJ  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   rR  ^  s    rR  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   rT  e  s
    

rT  c             C   s   d }d}| j dkr|   | j dkr2d}|   n~| j dkrd}|   | j dkrl| j}|   t| |}q| j dkrtj|  dd}|   n| j dkrd}|   t| }||fS )	Nr   r  r{   r    r   rA   )r   r   )rB   rD   rC   r  r   r  rM   ra   )rE   rU  rV  rG   r/   r/   r0   rS  m  s,    







rS  z**r   c       	      C   sP   g }|}xB| j tkrJ|t| ||||||d | j dkr<P |   d}q
W |S )N)r  kw_onlyr[   rI   r   )rB   c_arg_list_terminatorsrJ   p_c_arg_declrD   )	rE   r2   	in_pyfuncrF  rN  r[  r[   r\   r-  r/   r/   r0   rP    s    

rP  c             C   s   | j dkrt|  dS dS d S )Nr   r    r   )rB   r   )rE   r/   r/   r0   rQ    s    
rQ  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,  r2  r$  r-  r>   )r  )rq   rl   rA   r  zExpected 'None'z*'%s None' only allowed in Python functionsrl   rq   rY   r   r   )r{   r   r%   z;default values cannot be specified in pxd files, use ? or *)r   r   not_noneor_nonerY  r  r[  )rM   r   r   r3  r   r   rB   rD   rC   r   ra   r8   r   r   	modifiersZCArgDeclNode)rE   r2   r^  rF  r  r[  r[   rN   r_  r`  rY  r  r   r   r  r/   r/   r0   r]    sV    




r]  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    rb  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'rW  r   r  r    z$cdef blocks cannot be declared cpdefrY   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 herer@  z'C struct/union cannot be declared cpdeffused)rM   p_visibilityr9   r'   rb  r   rB   p_cdef_extern_blockrD   rR  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   rg    s    rg  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    rW  )r:   r9   r=   T)include_fileverbatim_includeru  r=   )r<   r   r`   rB   rD   r8  rC   r=   rR  r&   r  r   ZCDefExternNode)rE   rN   r2   rm  rn  ru  r/   r/   r0   rf    s&    




rf  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::rY   rB  )r  rD  r  )rG   rD  r   r;   r9   Zcreate_wrapperr'   in_pxd)rD   rB   rC   rE  r=   r`   p_c_enum_liner  r  r   r  r;   r9   r<   r'   r8   )rE   rN   r2   rG   rD  r   r/   r/   r0   p_c_enum_definition  s0    


rq  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   )rB  rD  zSyntax error in enum item list)rB   p_c_enum_itemrD   r  )rE   r2   r   r/   r/   r0   rp  <  s    

rp  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   rD  r   )
rM   rH   rE  r=   rB   rD   ra   rJ   r   ZCEnumDefItemNode)rE   r2   r   rN   rG   rD  r   r/   r/   r0   rr  H  s    

rr  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 )NFrA  TrA   r  z::rY   rB  r  r  zExpected a newlinez*Syntax error in struct or union definitionr  )	rG   rD  r  
attributesr;   r9   r'   ro  rA  )rC   rD   rB   ZexpectedrH   rE  r=   r`   r  r(   rJ   r  rM   r  r  r   r  r;   r9   r'   r8   )	rE   rN   r2   rA  r  rG   rD  rs  r  r/   r/   r0   p_c_struct_or_union_definitionU  s>    






rt  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 hererY   r  r  zNeed at least one type)rG   types)r8   r   rD   rH   r`   r  r  rB   rJ   r   r  r   ZFusedTypeNode)rE   rN   r2   rG   ru  r/   r/   r0   rl  y  s"    




rl  c             C   s&   | j dkrt| ||S t| ||S d S )Nr@  )rC   rq  rt  )rE   rN   r2   r/   r/   r0   rk    s    
rk  c             C   sX   |   }|}| jdkrT| jdkrT| j}|dkrL||krL| jd||f dd |   |S )NrA   )rW  rc  readonlyr*   z,Conflicting visibility options '%s' and '%s'F)r   )rM   rB   rC   r   rD   )rE   Zprev_visibilityrN   r9   r/   r/   r0   re    s    re  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   Zmodifierr/   r/   r0   rw    s
    rw  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    )r  r>   )ra  )rF  rM  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   rY   )r  r  r  r  rx  z&C function definition not allowed herer   )r8   )	r9   r   r   ru  r  ra  r'   r<   is_const_methodrI   rB  z&Syntax error in C variable declarationT)r  )r  r  )r9   r   declaratorsro  r  r'   ra  r<   )r8   rw  r   r>   r   r<   rB   rC   rD   r   ra   r  r(   r   r  r9   r'   ry  rJ   r;  r  r  r  )rE   rN   r2   rF  ra  r   r   ry  r  Zsuiter~   rz  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   rd  )r  )r9  r  z"Syntax error in ctypedef statementT)r  r  )r   r   r9   r'   ro  )rM   rD   re  r9   rb  r'   rB   rh  rC   rj  rk  rl  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*  rS   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   )rZ   z->r   )r8   )	rG   r\   r]   r^   r  ru  r   r   return_type_annotation)rM   Zenter_asyncrD   r}  rH   r`   rB   rC   r_   ra   r  r(   Z
exit_asyncr   ZDefNode)rE   r   r   rN   rG   r\   r]   r^   r~  r  ru  r/   r/   r0   r   (  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    )r^  rN  r[   r{   rA   )r[   rI   )r^  rN  r[  r[   z-Syntax error in Python function argument listz**)rP  rB   rD   p_py_arg_declr   r   )rE   rZ   r[   r\   r]   r^   r/   r/   r0   r_   H  s(    







r_   c             C   sB   |   }t| }d }|r2| jdkr2|   t| }tj|||dS )NrY   )rG   r  )rM   rH   rB   rD   ra   r   ZPyArgDeclNode)rE   r[   rN   rG   r  r/   r/   r0   r  ^  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  ru  r   Zforce_py3_semantics)rM   rD   r   rH   r:  r  rB   r   r   r   r   r  r(   r   ZPyClassDefNoderS   r%  )
rE   r   rN   
class_namer   r   r   r   r  ru  r/   r/   r0   r  h  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   rW  z6Qualified class name only allowed for 'extern' C classrA   r  r   F)r   z$C classes cannot take keyword bases.)r\   r   )rc  rW  zBName options only allowed for 'public', 'api', or 'extern' C classrY   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 classrc  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_sizero  r  ru  )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  ru  r/   r/   r0   rh    s    








rh  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   objectrl  r  )ignorewarnr   z/Expected one of ignore, warn or error, found %rrI   r   z)Expected 'object', 'type' or 'check_size')r`   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  ru  )rM   rD   rH   r  r(   r   ZPropertyNode)rE   rN   rG   r  ru  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  )rd   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   rd   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  rD  z!Syntax error in statement [%s,%s])r  rB   r   r-  rC   )rE   r8   r2   ru  r/   r/   r0   p_code*  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   r]  rh  r   Zparse_directive_list
ValueErrorr   r\   rD   r   rS   set_language_levelr,   )rE   r~   rN   mZdirectives_stringZnew_directiveserG   r/   r/   r0   p_compiler_directive_comments6  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  rD  z!Syntax error in statement [%s,%s])r  ru  full_module_namedirective_comments)rM   r  r  rS   r%  r  filenamewarningsr  FutureWarningcythonZcompiledr  r  rB   r   r-  rC   r   )
rE   r   r  r2   rN   r  r  r  r8   ru  r/   r/   r0   p_moduleW  s.    


r  c             C   s8   t | }| jdkr,| d | d d}nd}||fS )Nr   r{   FT)rH   rB   r`   )rE   rG   requiredr/   r/   r0   p_template_definitionv  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++ classrY   rB  rx  )r9   r8   r&   r  r  zExpected a newlinez$Syntax error in C++ class definitionr  )rG   rD  base_classesr9   ro  rs  r>   )rD   rH   rE  r=   rB   r   r  rJ   r`   r   rM   rR  r  r(   r9   r&   r>   p_cpp_class_attributer  r  r   ZCppClassNoder8   )rE   rN   r2   r*  r  rD  r>   Ztemplate_namesr  r&   rs  r  r/   r/   r0   ri    sh    







ri  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   r@  z7Decorators can only be followed by functions or classes)rB   r	  rC   ri  rM   r  rj  rk  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
)writerl  r   ranger   print_parse_treer   r   ZNoder  r  r7  r5   rN   r+   r   r   )
r  r   r8   r   Zindtri  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  r>  r   ior   r   r   Z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   rX   re   rf   ra   rb   rk   rm   rn   rp   rs   r|   rv   ry   rx   r9  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  r  r)  r  r=  r@  r8  rH  r   r   rI  r^  r  rv  rp  rt  r  r  r  rr  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   ry  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'  r4  r%  r&  r6  r   r.  r2  r<  r1  r  r/  rB  r7  rj  r0  rE  r   rL  rI  rZ  rJ  rR  rT  rS  r\  rP  rQ  r]  rb  r
  rg  rf  rq  rp  rr  rt  rl  rk  re  rw  r  r  r	  r}  r   r_   r  r  rh  r  r  r  r  r  r  rW  rY  r  r  r  r  ri  r  r  r/   r/   r/   r0   <module>   s  



	3*? 
),d.0z	n
	/
$Q+		"#f8	Q(
$	
!
$V  3)$"@
 
L	#
!
;