U
    .d                  
   @   s<  d Z d ZddlZddlZddlZddlZddlZddlZzejej	fZ
W n ek
rd   eefZ
Y nX edZG dd deZG dd deZG dd	 d	eZG d
d deZG dd dZdd Zdd Zdd Zdd Zdd Zdd ZG dd deZdddddeejddddf
ddZ d$d d!Z!d"d# Z"e"Z#dS )%z3.10    Nz^[a-zA-Z0-9_]+$c                   @   s   e Zd Zdd ZdS )LexErrorc                 C   s   |f| _ || _d S N)argstext)selfmessages r	   5/tmp/pip-unpacked-wheel-thxhbsgj/pycparser/ply/lex.py__init__:   s    zLexError.__init__N)__name__
__module____qualname__r   r	   r	   r	   r
   r   9   s   r   c                   @   s   e Zd Zdd Zdd ZdS )LexTokenc                 C   s   d| j | j| j| jf S )NzLexToken(%s,%r,%d,%d))typevaluelinenolexposr   r	   r	   r
   __str__A   s    zLexToken.__str__c                 C   s   t | S r   )strr   r	   r	   r
   __repr__D   s    zLexToken.__repr__N)r   r   r   r   r   r	   r	   r	   r
   r   @   s   r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd ZeZeZd	S )
	PlyLoggerc                 C   s
   || _ d S r   f)r   r   r	   r	   r
   r   L   s    zPlyLogger.__init__c                 O   s   | j || d  d S )N
r   writer   msgr   kwargsr	   r	   r
   criticalO   s    zPlyLogger.criticalc                 O   s   | j d||  d  d S )Nz	WARNING: r   r   r   r	   r	   r
   warningR   s    zPlyLogger.warningc                 O   s   | j d||  d  d S )NzERROR: r   r   r   r	   r	   r
   errorU   s    zPlyLogger.errorN)	r   r   r   r   r!   r"   r#   infodebugr	   r	   r	   r
   r   K   s   r   c                   @   s   e Zd Zdd Zdd ZdS )
NullLoggerc                 C   s   | S r   r	   )r   namer	   r	   r
   __getattribute__^   s    zNullLogger.__getattribute__c                 O   s   | S r   r	   )r   r   r    r	   r	   r
   __call__a   s    zNullLogger.__call__N)r   r   r   r(   r)   r	   r	   r	   r
   r&   ]   s   r&   c                   @   s|   e Zd Z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 Zdd Zdd Zdd ZeZdS )Lexerc                 C   s   d | _ d | _i | _i | _i | _d| _g | _d | _i | _i | _	i | _
d| _d | _d| _d| _d | _d | _d | _d| _d| _d | _d| _d| _d S )NINITIALr       F)lexre	lexretext
lexstaterelexstateretextlexstaterenameslexstatelexstatestacklexstateinfolexstateignorelexstateerrorflexstateeoff
lexreflagslexdatar   lexlen	lexerrorflexeoff	lextokens	lexignorelexliterals	lexmoduler   lexoptimizer   r	   r	   r
   r   t   s.    zLexer.__init__Nc              	   C   s   t  | }|ri }| j D ]t\}}g }|D ]L\}}g }	|D ]:}
|
rL|
d sX|	|
 q<|	t||
d j|
d f q<q,|||	f |||< q||_i |_| j D ]\}}t||j|j|< q||_|S Nr   r-   )copyr0   itemsappendgetattrr   r7   rA   )r   objectcZnewtabkeyZritemZnewreZcreZfindexZ	newfindexr   efr	   r	   r
   clone   s(    

"
zLexer.cloner,   c              	   C   s  t |tjrtd|dd }tj||d }t|d}|	d|t
f  |	dtt  |	dtt| j  |	d	t| j  |	d
t| j  |	dt| j  i }| j D ]P\}}g }	t|| j| | j| D ]"\\}
}}}|	|t||f q|	||< q|	dt|  |	dt| j  i }| j D ]\}}|rb|jnd ||< qN|	dt|  i }| j D ]\}}|r|jnd ||< q|	dt|  W 5 Q R X d S )Nz&Won't overwrite existing lextab module.z.pywzJ# %s.py. This file automatically created by PLY (version %s). Don't edit!
z_tabversion   = %s
z_lextokens    = set(%s)
z_lexreflags   = %s
z_lexliterals  = %s
z_lexstateinfo = %s
z_lexstatere   = %s
z_lexstateignore = %s
z_lexstateerrorf = %s
z_lexstateeoff = %s
)
isinstancetypes
ModuleTypeIOErrorsplitospathjoinopenr   __version__repr__tabversion__tupler>   r9   r@   r5   r0   rE   zipr1   r2   rF   _funcs_to_namesr6   r7   r   r8   )r   lextab	outputdirZbasetabmodulefilenametfZtabre	statenamelretitempatfuncZretextrenamesZtaberrrK   Ztabeofr	   r	   r
   writetab   s6    &
zLexer.writetabc                 C   sB  t |tjr|}ntd|  tj| }t|ddtkr@td|j	| _
|j| _|j| _| j
t| jB | _|j| _|j| _i | _i | _|j D ]P\}}g }g }|D ]&\}}	|t||jt|	|f q|| j|< || j|< qi | _|j D ]\}}
||
 | j|< qi | _|j  D ]\}}
||
 | j|< q| !d d S )N	import %sZ_tabversionz0.0zInconsistent PLY versionr+   )"rP   rQ   rR   execsysmodulesrG   r[   ImportErrorZ
_lextokensr>   Z_lexreflagsr9   Z_lexliteralsr@   setlextokens_allZ_lexstateinfor5   Z_lexstateignorer6   r0   r1   Z_lexstatererE   rF   recompile_names_to_funcsr7   Z_lexstateerrorfr8   Z_lexstateeoffbegin)r   Ztabfilefdictr_   rc   rd   re   Ztxtitemrf   	func_namerK   r	   r	   r
   readtab   s8    
 
zLexer.readtabc                 C   s8   |d d }t |tstd|| _d| _t|| _d S )Nr-   zExpected a stringr   )rP   StringTypes
ValueErrorr:   r   lenr;   )r   r   rI   r	   r	   r
   input   s    
zLexer.inputc                 C   sd   || j krtd| j | | _| j| | _| j|d| _| j|d | _	| j
|d | _|| _d S )NzUndefined stater,   )r0   ry   r.   r1   r/   r6   getr?   r7   r<   r8   r=   r3   r   stater	   r	   r
   rt     s    
zLexer.beginc                 C   s   | j | j | | d S r   )r4   rF   r3   rt   r}   r	   r	   r
   
push_state  s    zLexer.push_statec                 C   s   |  | j  d S r   )rt   r4   popr   r	   r	   r
   	pop_state  s    zLexer.pop_statec                 C   s   | j S r   )r3   r   r	   r	   r
   current_state!  s    zLexer.current_statec                 C   s   |  j |7  _ d S r   )r   )r   nr	   r	   r
   skip'  s    z
Lexer.skipc                 C   s~  | j }| j}| j}| j}||k r|| |kr8|d7 }q| jD ]\}}|||}|sXq>t }| |_| j	|_	||_ |j
}	||	 \}
|_|
s|jr| | _ |  S | } q| }| |_|| _|| _ |
|}|s| j }| j} q| js(|j| jkr(td|
jj|
jj|
j|jf ||d  |  S || | jkrtt }|| |_| j	|_	|j|_||_ |d | _ |S | jrt }| j|d  |_| j	|_	d|_| |_||_ || _ | |}|| j krtd||  ||d  | j }|sq|S || _ td|| |f ||d  q| jr\t }d|_d|_| j	|_	||_ | |_|| _ | |}|S |d | _ | jd krztdd S )	Nr-   z4%s:%d: Rule '%s' returned an unknown token type '%s'r#   z&Scanning error. Illegal character '%s'z"Illegal character '%s' at index %deofr,   z"No input string given with input())r   r;   r?   r:   r.   matchr   groupr   r   	lastindexr   endlexerZlexmatchrB   rp   r   __code__co_filenameco_firstlinenor   r@   r<   r=   RuntimeError)r   r   r;   r?   r:   r.   lexindexfuncmtokirg   Znewtokr	   r	   r
   token1  s    


  



 

zLexer.tokenc                 C   s   | S r   r	   r   r	   r	   r
   __iter__  s    zLexer.__iter__c                 C   s   |   }|d krt|S r   )r   StopIteration)r   tr	   r	   r
   next  s    z
Lexer.next)N)r,   )r   r   r   r   rL   ri   rw   r{   rt   r   r   r   r   r   r   r   __next__r	   r	   r	   r
   r*   s   s   

%(
nr*   c                 C   s   t | d| jS )Nregex)rG   __doc__)rg   r	   r	   r
   
_get_regex  s    r   c                 C   s0   t | }|j }|j|jkr,||j |S r   )rl   	_getframe	f_globalsrD   f_localsupdate)levelsr   ldictr	   r	   r
   get_caller_module_dict  s
    

r   c                 C   sF   g }t | |D ]2\}}|r6|d r6|||d f q|| q|S rC   )r]   rF   )Zfunclistnamelistresultr   r'   r	   r	   r
   r^     s    r^   c                 C   sD   g }| D ]6}|r4|d r4| ||d  |d f q| | q|S rC   )rF   )r   ru   r   r   r	   r	   r
   rs     s    rs   c                 C   sf  | sg S d | }zt||}d gt|j d  }|d d  }|j D ]z\}}	||d }
t|
t	j
t	jfkr|
|| f||	< |||	< qN|
d k	rN|||	< |ddkrd||	< qNd || f||	< qN||fg|g|gfW S  tk
r`   tt| d }|dkrd}t| d | |||\}}}t| |d  |||\}}}|| || || f Y S X d S )N|r-   ignore_r   )NN   )rW   rq   rr   max
groupindexvaluesrE   r|   r   rQ   FunctionType
MethodTypefind	Exceptionintrz   _form_master_re)Zrelistreflagsr   toknamesr   r.   r   Zlexindexnamesr   r   handler   llistrd   ZlnamesZrlistZrreZrnamesr	   r	   r
   r     s2    



r   c                 C   s   d}|  d}t|dd  dD ]\}}||kr |dkr  q>q |dkrXt|d| }nd}d|krlt|}d||d  }||fS )Nr-   _ANY)r+   )rT   	enumerater\   rW   )r   namesZnonstatepartsr   partstatesZ	tokennamer	   r	   r
   _statetoken  s    
r   c                   @   sf   e Z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 Zdd ZdS )LexerReflectNr   c                 C   sL   || _ d | _g | _|| _ddi| _t | _d| _|d krBtt	j
n|| _d S )Nr+   	inclusiveF)r   Z
error_functokensr   	stateinforo   rm   r#   r   rl   stderrlog)r   r   r   r   r	   r	   r
   r   /  s    
zLexerReflect.__init__c                 C   s$   |    |   |   |   d S r   )
get_tokensget_literals
get_states	get_rulesr   r	   r	   r
   get_all:  s    zLexerReflect.get_allc                 C   s   |    |   |   | jS r   )validate_tokensvalidate_literalsvalidate_rulesr#   r   r	   r	   r
   validate_allA  s    zLexerReflect.validate_allc                 C   sp   | j dd }|s(| jd d| _d S t|ttfsL| jd d| _d S |sf| jd d| _d S || _d S )Nr   zNo token list is definedTztokens must be a list or tupleztokens is empty)r   r|   r   r#   rP   listr\   r   )r   r   r	   r	   r
   r   H  s    zLexerReflect.get_tokensc                 C   sP   i }| j D ]@}t|s,| jd| d| _||krB| jd| d||< q
d S )NzBad token name '%s'TzToken '%s' multiply definedr-   )r   _is_identifierr   r   r#   r"   )r   Z	terminalsr   r	   r	   r
   r   \  s    

zLexerReflect.validate_tokensc                 C   s    | j dd| _| jsd| _d S )Nliteralsr,   )r   r|   r   r   r	   r	   r
   r   g  s    zLexerReflect.get_literalsc                 C   sj   z>| j D ]2}t|tr"t|dkr| jdt| d| _qW n& tk
rd   | jd d| _Y nX d S )Nr-   z.Invalid literal %s. Must be a single characterTzIInvalid literals specification. literals must be a sequence of characters)r   rP   rx   rz   r   r#   rZ   	TypeError)r   rI   r	   r	   r
   r   m  s    
zLexerReflect.validate_literalsc                 C   s   | j dd | _| jrt| jttfs:| jd d| _n| jD ]}t|trZt|dkrt| jdt	| d| _q@|\}}t|t
s| jdt	| d| _q@|dks|dks| jd	| d| _q@|| jkr| jd
| d| _q@|| j|< q@d S )Nr   z)states must be defined as a tuple or listTr   zMInvalid state specifier %s. Must be a tuple (statename,'exclusive|inclusive')zState name %s must be a stringr   	exclusivez:State type for state %s must be 'inclusive' or 'exclusive'zState '%s' already defined)r   r|   r   rP   r\   r   r   r#   rz   rZ   rx   r   )r   r   r'   Z	statetyper	   r	   r
   r   x  s0    


zLexerReflect.get_statesc           	      C   s,  dd | j D }i | _i | _i | _i | _i | _i | _| jD ]}g | j|< g | j|< q:t|dkrv| j	
d d| _
d S |D ]d}| j | }t|| j\}}|| j|< t|drD|dkr|D ]}|| j|< qnt|dkr|D ]}|| j|< qnV|d	kr"|jj}|jj}| j	
d
|||j d| _
n |D ]}| j| ||f q&qzt|tr|d	kr|D ]}|| j|< q^d|kr| j	d| n@|dkr| j	
d| d| _
n |D ]}| j| ||f qqz| j	
d| d| _
qz| j D ]}|jdd d q| j D ]}|jdd dd qd S )Nc                 S   s    g | ]}|d d dkr|qS )Nr   Zt_r	   ).0r   r	   r	   r
   
<listcomp>  s      z*LexerReflect.get_rules.<locals>.<listcomp>r   z+No rules of the form t_rulename are definedTr)   r#   r   ignorez,%s:%d: Rule '%s' must be defined as a string\z#%s contains a literal backslash '\''Rule '%s' must be defined as a functionz&%s not defined as a function or stringc                 S   s   | d j jS Nr-   )r   r   xr	   r	   r
   <lambda>      z(LexerReflect.get_rules.<locals>.<lambda>)rJ   c                 S   s   t | d S r   )rz   r   r	   r	   r
   r     r   )rJ   reverse)r   r   funcsymstrsymr   errorfeoffr   rz   r   r#   r   hasattrr   r   r   r   rF   rP   rx   r"   r   sort)	r   Ztsymbolsr   r   r   r   toknamelinefiler	   r	   r
   r     sb    








zLexerReflect.get_rulesc                 C   sz  | j D ]T}| j| D ]l\}}|jj}|jj}t|}| j| | j	| }t
|tjrbd}nd}|jj}	|	|kr| jd|||j d| _q|	|k r| jd|||j d| _qt|s| jd|||j d| _qzDtd|t|f | j}
|
dr| jd	|||j d| _W q tjk
r } zB| jd
|||j| dt|krl| jd|||j d| _W 5 d }~X Y qX q| j| D ]\}}| j	| }|dkr| jd| d| _q|| jkr|ddk r| jd|| d| _qz:td||f | j}
|
dr2| jd| d| _W nT tjk
r } z2| jd|| d|krr| jd| d| _W 5 d }~X Y nX q| j| s| j| s| jd| d| _| j|d }|r|}|jj}|jj}t|}| j| t
|tjr
d}nd}|jj}	|	|kr:| jd|||j d| _|	|k r| jd|||j d| _q| jD ]}| | qdd S )Nr   r-   z'%s:%d: Rule '%s' has too many argumentsTz%%s:%d: Rule '%s' requires an argumentz2%s:%d: No regular expression defined for rule '%s'
(?P<%s>%s)r,   z<%s:%d: Regular expression for rule '%s' matches empty stringz3%s:%d: Invalid regular expression for rule '%s'. %s#z6%s:%d. Make sure '#' in rule '%s' is escaped with '\#'r#   r   r   r   z-Rule '%s' defined for an unspecified token %sz5Regular expression for rule '%s' matches empty stringz,Invalid regular expression for rule '%s'. %sz/Make sure '#' in rule '%s' is escaped with '\#'zNo rules defined for state '%s')r   r   r   r   r   inspect	getmodulerm   addr   rP   rQ   r   co_argcountr   r#   r   r   rq   rr   r   r   r   r   r   r   r|   validate_module)r   r~   fnamer   r   r   moduler   ZreqargsnargsrI   er'   rZefuncr	   r	   r
   r     s    









zLexerReflect.validate_rulesc                 C   s   zt |\}}W n tk
r(   Y d S X td}td}i }|d7 }|D ]n}||}|sj||}|r|d}	||	}
|
s|||	< n$t |}| j	
d|||	|
 d| _
|d7 }qNd S )Nz\s*def\s+(t_[a-zA-Z_0-9]*)\(z\s*(t_[a-zA-Z_0-9]*)\s*=r-   z7%s:%d: Rule %s redefined. Previously defined on line %dT)r   getsourcelinesrS   rq   rr   r   r   r|   getsourcefiler   r#   )r   r   linesZlinenZfreZsreZ	counthashr   r   r'   prevra   r	   r	   r
   r   @  s*    







zLexerReflect.validate_module)Nr   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r	   r	   r
   r   .  s   
Bgr   Fr_   c
           %   
      sr  |d krd}d }
ddi}t  }||_|	d kr6ttj}	|rL|d krLttj}|rT|  r fddt D }t|}
d|
krtj|
d  j|
d< nt	d}
|

d	}|rt|trd
|kr|d
 | }t|
|	|d}|  |s| rtd|r8|r8z"|||
 |ja|ja|a|W S  tk
r6   Y nX |rh|d|j |d|j |d|j t |_|jD ]}|j| qvt|jttfrt|jd   |j|_!n|j|_!|jt|j!B |_"|j}i }|D ]}g }|j#| D ]J\}}|j$j%}|j$j&}|'d|t(|f  |r|d|t(|| q|j)| D ]2\}}|'d||f  |rH|d||| qH|||< q|r|d |D ]h}t*|| ||
|j+\}}}||j,|< ||j-|< ||j.|< |rt/|D ]\}}|d||| qq|0 D ]`\}}|dkr|dkr|j,| 1|j,d  |j-| 1|j-d  |j.| 1|j.d  q||_2|j,d |_3|j-d |_4||_5|j6|_7|j7
dd|_8|j9|_:|j9
dd |_;|j;s|	<d |j=|_>|j=
dd |_?|0 D ]\} }|dkrB| |j9kr |	<d|  | |j6kr|j8r|	<d|  nJ|dkr| |j9krl|j9
dd |j9| < | |j6kr|j6
dd|j6| < q|ja|ja|a|rn|rn|d kr&t|t@jAr|j}!nNd
|kr|
d }!n:|Bd
}"d
 |"d d }#tCd|#  tDtj|# dd}!tEjFG|!}z|H|| W n6 tIk
rl }$ z|	<d||$f  W 5 d }$~$X Y nX |S )Nr_   r+   r   c                    s   g | ]}|t  |fqS r	   )rG   )r   kr   r	   r
   r   z  s     zlex.<locals>.<listcomp>__file__r   r   __package__rM   )r   r   zCan't build lexerzlex: tokens   = %rzlex: literals = %rzlex: states   = %rr   r   z(lex: Adding rule %s -> '%s' (state '%s')z#lex: ==== MASTER REGEXS FOLLOW ====z"lex: state '%s' : regex[%d] = '%s'r,   zNo t_error rule is definedr   z1No error rule is defined for exclusive state '%s'z2No ignore rule is defined for exclusive state '%s'rN   rj   z#Couldn't write lextab module %r. %s)Jr*   rB   r   rl   r   dirdictrm   r   r   r|   rP   r   r   r   r   SyntaxErrorrw   r   r{   r   rn   r$   r   r   r   ro   r>   r   r   r\   r   rW   r@   rp   r   r   r   r   rF   r   r   r   r   r0   r1   r2   r   rE   extendr5   r.   r/   r9   r   r6   r?   r   r7   r<   r"   r   r8   r=   rQ   rR   rT   rk   rG   rU   rV   dirnameri   rS   )%r   rH   r%   optimizer_   r   Znowarnr`   ZdebuglogZerrorlogr   r   ZlexobjZ_itemspkgZlinfor   Zregexsr~   Z
regex_listr   r   r   r   r'   r   r.   Zre_textZre_namesr   r   styper   srcfiler   pkgnamer   r	   r   r
   lex_  s    














$r  c                 C   s   |sVz&t jd }t|}| }|  W n* tk
rT   t jd t j }Y nX | rb| j	}nt	}|| | rz| j
}nt
}| }|sqt jd|j|j|j|jf  q~d S )Nr-   z/Reading from standard input (type EOF to end):
z(%s,%r,%d,%d)
)rl   argvrX   readclose
IndexErrorstdoutr   stdinr{   r   r   r   r   r   )r   datara   r   _input_tokenr   r	   r	   r
   runmain  s(    
r  c                    s    fdd}|S )Nc                    s    t  drt | _n | _| S )Nr)   )r   r   r   r   r   r	   r
   	set_regexB  s    
zTOKEN.<locals>.set_regexr	   )r   r  r	   r  r
   TOKENA  s    r  )NN)$rY   r[   rq   rl   rQ   rD   rU   r   Z
StringTypeZUnicodeTyperx   AttributeErrorr   bytesrr   r   r   r   rH   r   r   r&   r*   r   r   r^   rs   r   r   r   r   VERBOSEr  r  r  Tokenr	   r	   r	   r
   <module>"   sN   
  F
(  3
    
 A
"
