
    h/                        U d Z ddlZddlmZ ddlmZmZ ddlZddlZ	ddl
Z
ej        ej        z   dz   Zej        dz   Zeej        z   Z G d dej                  Zeeee	j        j        df         Ze G d	 d
                      Ze G d d                      Ze G d d                      ZdedefdZdedefdZdedefdZdedefdZdedefdZdedefdZdedefdZ dedefdZ!dedefdZ"dedefdZ#dedefdZ$dedefdZ%dedefdZ&dedefdZ'dedefdZ(dedefd Z)dedefd!Z*eeeeee!e#e"ee e$e%e'e(e)e*e&gZ+e,eegef                  e-d"<    G d# d$          Z.defd%Z/dS )&z@This module takes URCL source code and performs lexical analysis    N)	dataclass)UnionCallablez.__c                   F    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ZdZdZdZdS )	TokenTypeintegerlabelzgeneral register	character
identifier
whitespacezrelative jumpmacroportzheader inequality[],stringN)__name__
__module____qualname__INTEGERLABELGENERAL_REGISTER	CHARACTER
IDENTIFIER
WHITESPACERELATIVE_JUMPMACROPORTHEADER_INEQUALITYLEFT_BRACKETRIGHT_BRACKETCOMMASTRING     2/home/seanl/mnt/public/Repos/urclelf/./urcl/lex.pyr   r      sV        GE)IJJ#MED+LMEFFFr&   r   c                   D    e Zd ZU eed<   eed<   eed<   eed<   defdZdS )Tokentypeline_numbercolumn_numbervaluereturnc                 z    d| j         j         d| j         d| j         }| j        |d| j         dz  }n|dz  }|S )N< :z - >)r*   namer+   r,   r-   )selfresults     r'   __str__zToken.__str__)   sY    MTY^MMd&6MM9KMM:!)DJ))))FFcMFr&   N)	r   r   r   r   __annotations__int
TokenValuestrr7   r%   r&   r'   r)   r)   "   s^         
OOO      r&   r)   c                   P    e Zd ZU ee         ed<   d ZdefdZd Zd Z	de
fdZd	S )
TokenStreamtokensc                    d}g }g }| j         D ]Q}|j        |k    r|                    |           #|r"|                    t          |                     |j        }|g}R|r"|                    t          |                     |S N   )r>   r+   appendr=   )r5   current_line_numberlinescurrent_linetokens        r'   split_lineszTokenStream.split_lines8   s    #%$&[ 	' 	'E $777##E**** <LL\!:!:;;;&+&7# %w 	4LL\22333r&   rF   c                 :    | j                             |           d S N)r>   rB   )r5   rF   s     r'   rB   zTokenStream.appendJ   s    5!!!!!r&   c                 4    | j                                         S rI   )r>   __iter__r5   s    r'   rK   zTokenStream.__iter__M   s    {##%%%r&   c                 *    t          | j                  S rI   )lenr>   rL   s    r'   __len__zTokenStream.__len__P   s    4;r&   r.   c                     g }|                                  D ]9}|                    d                    d |j        D                                  :d                    |          S )Nr1   c                 ,    g | ]}t          |          S r%   )r;   ).0rF   s     r'   
<listcomp>z'TokenStream.__str__.<locals>.<listcomp>W   s    "G"G"G%3u::"G"G"Gr&   
)rG   rB   joinr>   )r5   rD   lines      r'   r7   zTokenStream.__str__S   sh    $$&& 	J 	JDLL"G"G4;"G"G"GHHIIIIyyr&   N)r   r   r   listr)   r8   rG   rB   rK   rO   r;   r7   r%   r&   r'   r=   r=   3   s          K  $"E " " " "& & &                  r&   r=   c                   j    e Zd ZU eez  dz  ed<   eed<   ed             Zede	de
defd            ZdS )TokenParseResultNdatachars_consumedc                 "    t          d d          S )Nr   )rY   )clss    r'   misszTokenParseResult.miss`   s    a(((r&   r*   r-   c                 B    t          t          |dd|          |          S r@   )rY   r)   )r]   r*   r-   r[   s       r'   successzTokenParseResult.successd   s     dAq% 8 8.IIIr&   )r   r   r   r)   r;   r8   r9   classmethodr^   r   r:   r`   r%   r&   r'   rY   rY   [   s         
#+
) ) [) J9 JZ J J J J [J J Jr&   rY   sourcer.   c                 4   |                      d          st                                          S d}|t          |           k     r(| |         t          vrn|dz  }|t          |           k     (t                              t          j        | d|         |          S )N.rA   )
startswithrY   r^   rN   LEGAL_LABEL_CHARACTERSr`   r   r   rb   indexs     r'   extract_label_tokenri   j       S!!A*:*?*?*A*A#AE
#f++

%= 666
 #f++


 ##IOVAeG_eLLLr&   c                 J   | st                                           S d}|t          |           k     r3| |                                         sn|dz  }|t          |           k     3|r&t                               t
          j        d |          S t                                           S Nr   rA   )rY   r^   rN   isspacer`   r   r   rg   s     r'   extract_space_tokenrn   v   s    1*//111E
#f++

e}$$&& 	
 #f++

  K''	(<dEJJJ  """r&   c                 @   |                      d          st                                          S d}|t          |           k     r6| d |                             d          rn|dz  }|t          |           k     6t                              t          j        d |          S )Nz/*   z*/rA   )re   rY   r^   rN   endswithr`   r   r   rg   s     r'   extract_multiline_comment_tokenrr      s    T""B+;+@+@+B+B$BE
#f++

&5&>""4(( 	
 #f++


 ##I$8$FFFr&   c                 (   |                      d          st                                          S d}|t          |           k     r*| |         dk    r|dz  }n|dz  }|t          |           k     *t                              t
          j        d |          S )Nz//rp   rT   rA   )re   rY   r^   rN   r`   r   r   rg   s     r'   extract_line_comment_tokenrt      s    T""B+;+@+@+B+B$BE
#f++

%=D  QJE
	 #f++

 ##I$8$FFFr&   c                    |                      d          st                                          S d}|t          |           k     r3| |                                         rn|dz  }|t          |           k     3	 t          | d|         d          }n,# t          $ r t          d| d|          dd          cY S w xY wt                              t          j	        ||          S )N~rA   r   basezMalformed relative jump '')
re   rY   r^   rN   rm   r9   
ValueErrorr`   r   r   rb   rh   token_values      r'   extract_relative_jump_tokenr}      s    S!!A*:*?*?*A*A#AE
#f++

%=  "" 	
 #f++


S&5/222 S S S NF1U7O N N NPQRRRRRS ##I$;[%PPPs   8B &B;:B;c                 .   | d                                          dvrt                                          S d}|t          |           k     r#| |         dvrn|dz  }|t          |           k     #|dk    rt                                          S 	 t          j                            t          | d|         d                    }n,# t          $ r t          d| d|          dd          cY S w xY wt          	                    t          j        ||          S )Nr   )r$rA   
0123456789rw   zMalformed register 'ry   lowerrY   r^   rN   urcltypesGeneralRegisterr9   rz   r`   r   r   r{   s      r'   extract_register_tokenr      s&   ay
**3C3H3H3J3J,JE
#f++

%=,,
 #f++


 zz$$&&&Nj00VAeG_11M1M1MNN N N N Ivag I I I1MMMMMN ##I$>USSS   6C &C.-C.c                 .   | d                                          dvrt                                          S d}|t          |           k     r#| |         dvrn|dz  }|t          |           k     #|dk    rt                                          S 	 t          j                            t          | d|         d                    }n,# t          $ r t          d| d|          dd          cY S w xY wt          	                    t          j        ||          S )Nr   )m#rA   r   rw   zMalformed memory address 'ry   r   r{   s      r'   extract_memory_address_tokenr      s'   ay
**3C3H3H3J3J,JE
#f++

%=,,
 #f++


 zz$$&&&Tj00VAeG_11M1M1MNN T T T OVAeG_ O O OQRSSSSST ##I$>USSSr   c                 X   | st                                           S d}d}| |         dk    r|dz  }| ||dz                                            dv r
|dz  }|dz  }|t          |           k     r5| |                                         |vrn|dz  }|t          |           k     5|st                                           S 	 t	          | d |         d          }n,# t
          $ r t          d	| d |          d
d          cY S w xY wt                               t          j        ||          S )Nr   r   -rA   rp   )0x0b0oabcdefrw   zMalformed integer 'ry   )	rY   r^   r   rN   r9   rz   r`   r   r   )rb   permitted_number_charsrh   r|   s       r'   extract_integer_tokenr      sf   1*//111)Ee}
eE!Gm""$$(:::(*

#f++

%=  (>>>
 #f++


  '$$&&&L&%.q111 L L L GfVeVn G G GKKKKKL ##I$5{EJJJs    C &DDc                 
   |                      d          st                                          S d}|t          |           k     rP| |         dk    r|dz  }n>|t          |           dz
  k    rt          dd          S |dz  }|t          |           k     P| d|dz
           }|                    dd                              dd                              d	d
          }t                              t          j        ||          S )N"rA   zString was never closedr   \nrT   \t	\r)re   rY   r^   rN   replacer`   r   r$   rb   rh   string_values      r'   extract_string_tokenr      s   S!!A*:*?*?*A*A#AE
#f++

%=CQJECKK!O###$=qAAA
 #f++

 !E!G)$L''t44<<UDIIQQRWY]^^L##I$4lEJJJr&   c                 r   |                      d          st                                          S d}|t          |           k     rP| |         dk    r|dz  }n>|t          |           dz
  k    rt          dd          S |dz  }|t          |           k     P| d|dz
           }|                    dd                              dd                              d	d
          }t          |          dk    r!t          dt          |           dd          S t                              t          j        ||          S )Nry   rA   z"Character literal was never closedr   r   rT   r   r   r   r   zCharacter literal is of length z (expected 1))re   rY   r^   rN   r   r`   r   r   r   s      r'   extract_character_tokenr      s9   S!!A*:*?*?*A*A#AE
#f++

%=CQJECKK!O###$H!LLL
 #f++

 !E!G)$L''t44<<UDIIQQRWY]^^L
<A b#lBSBS b b bdefff##I$7uMMMr&   c                 (   | d         t           vrt                                          S d}|t          |           k     r(| |         t          vrn|dz  }|t          |           k     (t                              t          j        | d |         |          S rl   )!LEGAL_IDENTIFIER_FIRST_CHARACTERSrY   r^   rN   (LEGAL_IDENTIFIER_CONTINUATION_CHARACTERSr`   r   r   rg   s     r'   extract_identifier_tokenr     s    ay999BRBWBWBYBY;YE
#f++

%= HHH
 #f++


 ##I$8&%.%PPPr&   c                 4   |                      d          st                                          S d}|t          |           k     r(| |         t          vrn|dz  }|t          |           k     (t                              t          j        | d|         |          S )N@rA   )re   rY   r^   rN   rf   r`   r   r   rg   s     r'   extract_macro_tokenr     rj   r&   c                 4   |                      d          st                                          S d}|t          |           k     r(| |         t          vrn|dz  }|t          |           k     (t                              t          j        | d|         |          S )N%rA   )re   rY   r^   rN   rf   r`   r   r   rg   s     r'   extract_port_tokenr   !  s    S!!A*:*?*?*A*A#AE
#f++

%= 666
 #f++


 ##INF1U7OUKKKr&   c                     dD ]G}|                      |          r0t                              t          j        | d d         d          c S Ht                                          S )N)z==z<=z>=rp   )re   rY   r`   r   r    r^   )rb   
inequalitys     r'   extract_header_inequality_tokenr   ,  sq    ( X X
Z(( 	X#++I,GPRQRPRUVWWWWW	X   """r&   c                     |                      d          r&t                              t          j        d d          S t                                          S )Nr   rA   )re   rY   r`   r   r!   r^   rb   s    r'   extract_left_bracket_tokenr   4  sF     I''	(>aHHH  """r&   c                     |                      d          r&t                              t          j        d d          S t                                          S )Nr   rA   )re   rY   r`   r   r"   r^   r   s    r'   extract_right_bracket_tokenr   ;  sF     J''	(?qIII  """r&   c                     |                      d          r&t                              t          j        d d          S t                                          S )Nr   rA   )re   rY   r`   r   r#   r^   r   s    r'   extract_comma_tokenr   B  sE     B''	qAAA  """r&   TOKEN_EXTRACTION_FUNCTIONSc                   N    e Zd ZdeddfdZd Zdeej        z  fdZ	d
de
fd	ZdS )Lexerrb   r.   Nc                 >    d| _         d| _        d| _        || _        d S rl   )rh   r+   r,   rb   )r5   rb   s     r'   __init__zLexer.__init__a  s$    
r&   c                 *    | j         | j        d          S rI   rg   rL   s    r'   remaining_sourcezLexer.remaining_sourceh  s    {4:;;''r&   c           	         t          g           }| j        t          | j                  k     rZt          D ]} ||                                           }|j        s't          |j        t                    r2t          j
                            |j        | j        | j                  c S |j        j        t          j        k    rC|                    t%          |j        j        | j        | j        |j        j                             |                     |j                    nIt          j
                            d|                                 d d          d| j        | j                  S | j        t          | j                  k     Z|S )NzUnexpected characters: '   z...')r=   rh   rN   rb   r   r   rZ   
isinstancer;   error	Tracebacknewr+   r,   r*   r   r   rB   r)   r-   advancer[   )r5   r>   token_extraction_functionr6   s       r'   lexz	Lexer.lexk  sn   Rj3t{++++-G O O)2243H3H3J3JKK{ fk3// b ?..v{D<LdN`aaaaa;#y';;;MM%(8$:JDL^`f`k`q"r"rsssV2333**+gdF[F[F]F]^`_`^`Fa+g+g+gimiy{  |N  O  O  O j3t{++++ r&   rA   amountc                    |dk     rd S t          |          D ]o}| j        t          | j                  k    r d S | xj        dz  c_        | j        | j                 dk    r| xj        dz  c_        d| _        | xj        dz  c_        pd S )NrA   rT   )rangerh   rN   rb   r,   r+   )r5   r   r   s      r'   r   zLexer.advance~  s    A::Fv 	 	AzS----!#{4:&$..  A%  %&"JJ!OJJJ	 	r&   )rA   )r   r   r   r;   r   r   r=   r   r   r   r9   r   r%   r&   r'   r   r   _  s        s t    ( ( ([5?2    & S      r&   r   c                 D    t          |                                           S rI   )r   r   r   s    r'   tokenizer     s    ==r&   )0__doc__enumdataclassesr   typingr   r   r   
urcl.typesr   r   ascii_lettersdigitsrf   r   r   Enumr   r;   r9   r   r   r:   r)   r=   rY   ri   rn   rr   rt   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   rW   r8   r   r   r%   r&   r'   <module>r      s   B B B  ! ! ! ! ! ! " " " " " " " "      -=D $*$83$> !+Lv}+\ (    	   $ 3TZ7=>

         %  %  %  %  %  %  %  % N 
J 
J 
J 
J 
J 
J 
J 
J	M 	M(8 	M 	M 	M 	M# #(8 # # # #	GC 	G4D 	G 	G 	G 	G
Gs 
G/? 
G 
G 
G 
GQ Q0@ Q Q Q Q T3 T+; T T T T$T T1A T T T T$K# K*: K K K K0K K)9 K K K K NC N,< N N N N$	QS 	Q-= 	Q 	Q 	Q 	Q	M 	M(8 	M 	M 	M 	M	Ls 	L'7 	L 	L 	L 	L#C #4D # # # ##s #/? # # # ## #0@ # # # ## #(8 # # # # # ##G D3%1A*A!BC   ,* * * * * * * *XS      r&   