3
Y1                 @   s4   d Z ddlZdd ZG dd dZG dd dZdS )	zP
Scanning and Token classes that might be useful
in creating specific scanners.
    Nc             C   sr   g i | j g  }}}xX|D ]P}x|jD ]}|j| q&W x0t|jj D ]}||krH|j| d||< qHW qW |S )N   )	__class__	__bases__appendlist__dict__keys)instancenamelistZnamedictZ	classlistcbname r   Q/home/psgendb/BIRCHDEV/python/lib/python3.6/site-packages/spark_parser/scanner.py	_namelist   s    

r   c               @   sB   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dS )GenericTokenz1A sample Token class that can be used in scanningNc             C   s   || _ || _d S )N)kindattr)selfr   r   r   r   r   __init__   s    zGenericToken.__init__c             C   s0   t |tr"| j|jko | j|jkS | j|kS dS )z< '==', but it's okay if offsets and linestarts are differentN)
isinstancer   r   r   )r   or   r   r   __eq__   s    
zGenericToken.__eq__c             C   s$   | j rd| j| j f S d| j S d S )Nzkind: %s, value: %rzkind: %s)r   r   )r   r   r   r   __str__    s    zGenericToken.__str__c             C   s   | j p
| jS )N)r   r   )r   r   r   r   __repr__&   s    zGenericToken.__repr__c             C   s
   t | jS )N)hashr   )r   r   r   r   __hash__*   s    zGenericToken.__hash__c             C   s   t d S )N)
IndexError)r   ir   r   r   __getitem__.   s    zGenericToken.__getitem__)N)
__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   r   r      s   
r   c               @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )GenericScannera  A class which can be used subclass off of to make

    specific sets of scanners. Scanner methods that are subclassed off
    of this that begin with t_ will be introspected in their
    documentation string and uses as a regular expression in a token pattern.
    For example:

        def t_add_op(self, s):
        r'[+-]'
        t = GenericToken(kind='ADD_OP', attr=s)
        self.rv.append(t)
    c             C   sZ   | j  }d| _tj|tj| _i | _x0| jjj D ] \}}t| d| | j|d < q2W d S )Nr   t_r   )	reflectposrecompileVERBOSE
index2func
groupindexitemsgetattr)r   patternr   numberr   r   r   r   >   s    zGenericScanner.__init__c             C   s$   t | |j}d|dd  |f }|S )Nz
(?P<%s>%s)   )r.   r#   )r   r   docrvr   r   r   makeREG   s    zGenericScanner.makeREc             C   s\   g }x<t t| D ],}|d d dkr|dkr|j| j| qW |j| jd dj|S )Nr1   r%   	t_default|)r   r   r   r4   join)r   r3   r   r   r   r   r&   L   s    zGenericScanner.reflectc             C   s   t d|| jf  tdS )zTSimple-minded error handler. see py2_scan for another
        possibility.'
        z"Lexical error in %s at position %sN)printr'   
SystemExit)r   sr   r   r   errorT   s    zGenericScanner.errorc             C   s   d| _ t|}x|| j |k r| jj|| j }|d kr<| j| |j }x8tt|D ](}|| rR|| jkrR| j| ||  qRW |j | _ qW d S )Nr   )	r'   lenr(   matchr;   groupsranger+   end)r   r:   nmr>   r   r   r   r   tokenize[   s    
zGenericScanner.tokenizec             C   s   dS )z( \n )+Nr   )r   r:   r   r   r   r5   i   s    zGenericScanner.t_defaultN)
r    r!   r"   r#   r   r4   r&   r;   rC   r5   r   r   r   r   r$   1   s   	r$   )r#   r(   r   r   r$   r   r   r   r   <module>   s   