
    hv(                        d Z ddlZddlmZ ddlmZmZmZmZ ddl	m
Z
mZmZmZmZmZmZmZmZ ddlZddlmZ  ed          Ze G d d	ee                               Z G d
 dej                  Ze G d d                      Ze G d d                      Zdej        j        defdZ G d d          Z e eej!        j                 z  eej!        j"                 z  Z#d Z$ G d d          Z%dS )zSThis module takes a stream of URCL tokens and parses it into a concrete syntax tree    N)	dataclass)UnionGenericTypeVarSelf)	MnemonicLabelRelativeAddress	CharacterPortGeneralRegisterDefinedImmediateBasePointerStackPointer)	TracebackTc                   :    e Zd ZU eed<   eed<   eed<   defdZdS )Terminalvalueline_numbercolumn_numberreturnc                 *    t          | j                  S N)strr   selfs    6/home/seanl/mnt/public/Repos/urclelf/./urcl/urclcst.py__str__zTerminal.__str__   s    4:    N)__name__
__module____qualname__r   __annotations__intr   r    r    r   r   r      sR         HHH      r    r   c                       e Zd Z ej                    Z ej                    Z ej                    Z ej                    Z ej                    Z	 ej                    Z
 ej                    ZdS )OperandTypeN)r!   r"   r#   enumautoINTEGERLABELGENERAL_REGISTER	CHARACTERPORTRELATIVE_ADDERESSARRAYr&   r    r   r(   r(      sk        dikkGDIKKE ty{{	I49;;D!	DIKKEEEr    r(   c                   t    e Zd ZU eeeeeee	e
eez  ez  ee         z  f         ed<   eed<   eed<   defdZdS )OperandCSTNoder   r   r   r   c                     t          | j        t                    rd| j         dS t          | j        t                    r(dd                    d | j        D                        dS t          | j                  S )N"[ c                 ,    g | ]}t          |          S r&   r   ).0r   s     r   
<listcomp>z*OperandCSTNode.__str__.<locals>.<listcomp>)   s     D D DU D D Dr    ])
isinstancer   r   listjoinr   s    r   r   zOperandCSTNode.__str__$   sy    dj#&& 	%$tz$$$$dj$'' 	#Hsxx D D D D DEEHHHHtz??"r    N)r!   r"   r#   r   r	   r   r%   r
   r   r   r   r   r   r   r>   r   r$   r   r&   r    r   r3   r3      s         oy$P`behsbs  wC  cC  FJ  KO  FP  cP  P  Q  Q  Q  Q# # # # # # #r    r3   c                   F    e Zd ZU eez  dz  ed<   eed<   ed             ZdS )OperandParseResultNdatatokens_consumedc                 "    t          d d          S )Nr   )rA   )clss    r   misszOperandParseResult.miss2   s    !$***r    )	r!   r"   r#   r3   r   r$   r%   classmethodrF   r&   r    r   rA   rA   -   sQ         
3

%%%%+ + [+ + +r    rA   tokensr   c           	         d}| j         |         }|j        t          j        j        j        k    rHt          t          t          t          |j
                            |j        |j                  d          S t          |j
        t                    r.t          t          |j
        |j        |j                  d          S |j        t          j        j        j        k    rat          |j
        t                     st          d|j
         dd          S t          t          |j
        |j        |j                  d          S |j        t          j        j        j        k    rnt          |j
        t                     st          d|j
         dd          S t          t          t%          |j
                  |j        |j                  d          S |j        t          j        j        j        k    rut          |j
        t                    r|j
        st          d|j
         dd          S t          t          t)          |j
                  |j        |j                  d          S |j        t          j        j        j        k    rht          |j
        t                    r|j
        st          d|j
         dd          S t          t          |j
        |j        |j                  d          S |j        t          j        j        j        k    rt          |j
        t                    r|j
        st          d|j
         dd          S |j
                                        d	k    r5t          t          t1                      |j        |j                  d          S |j
                                        d
k    r5t          t          t3                      |j        |j                  d          S t                                          S |j        t          j        j        j        k    rt          |j
        t                    r|j
        st          d|j
         dd          S t9          j        |j
                  }|r)t          t          ||j        |j                  d          S t          d|j
         dd          S |j        t          j        j        j        k    rt          |j
        t                    r:	 t?          |j
                                                   }n# tB          $ r d }Y nw xY wd }|st          d|j
         dd          S t          t          ||j        |j                  d          S |j        t          j        j        j"        k    rd}|tG          |           k     rJ| j         |         }|j        t          j        j        j$        k    rn-|dz  }|dz  }|tG          |           k     Jt          dd          S t          t          || j         d         j        | j         d         j                  |dz             S t                                          S )Nr      zInvalid integer: ''zInvalid relative jump: 'zInvalid character: 'zInvalid string: 'zInvalid identifier: 'bpspzInvalid Port: 'zUnknown Port: 'zInvalid defined immediate: 'zArray literal was not closed)%rH   typeurcllex	TokenTyper,   rA   r3   r	   r   r   r   r   r=   r   r+   r%   RELATIVE_JUMPr
   r.   r   STRING
IDENTIFIERlowerr   r   rF   r/   r   
from_valueMACROr   upper
ValueErrorLEFT_BRACKETlenRIGHT_BRACKET)rH   indextokenportdefined_immediatepps         r   parse_operandrb   6   s   EM% EzTX'---!.s5;7G7G1H1H%J[]b]p"q"qstuuu	EK	1	1 B!.e>OQVQd"e"eghiii	tx)1	1	1%+s++ 	N%&I5;&I&I&I1MMM!.e>OQVQd"e"eghiii	tx)7	7	7%+s++ 	T%&O&O&O&OQRSSS!.1M1MuO`bgbu"v"vxyzzz	tx)3	3	3%+s++ 	P5; 	P%&KU[&K&K&KQOOO!.5;1G1GIZ\a\o"p"prsttt	tx)0	0	0%+s++ 	M5; 	M%&H%+&H&H&H!LLL!.e>OQVQd"e"eghiii	tx)4	4	4%+s++ 	Q5; 	Q%&Lek&L&L&LaPPP;$&&%n[]]EDUW\Wj&k&kmnooo[  D((%n\^^UEVX]Xk&l&lnoppp%**,,,	tx).	.	.%+s++ 	K5; 	K%&F&F&F&FJJJu{++ 	K%nT5;LeNa&b&bdefff%&F&F&F&FJJJ	tx)/	/	/ek3'' 	%)$4U[5F5F5H5H$I$I!! ) ) )$(!!!) !%  	X%&SU[&S&S&SUVWWW!.1BEDUW\Wj"k"kmnooo	tx)6	6	6c&kk!!M%(EzTX/===!GBQJE c&kk!! &&DaHHH!.V]15E5QSYS`abScSq"r"rty|}t}~~~""$$$s   -&T T#"T#c                   ~    e Zd Zddedee         dededdf
dZed	e	j
        j        deez  fd
            ZdefdZdS )InstructionCSTNoder   mnemonicoperandsr   r   r   Nc                 >    || _         || _        || _        || _        d S r   )re   rf   r   r   )r   re   rf   r   r   s        r   __init__zInstructionCSTNode.__init__   s&      &*r    rH   c                    |st          j        d          S |j        d         j        s6t          j        d|j        d         j        |j        d         j                  S 	 t          t          |j        d         j                                                            }nZ# t          $ rM t          j        d|j        d         j         d|j        d         j        |j        d         j                  cY S w xY wg }d}|t          |          k     r.t          t          j                            |j        |d                              }t          |j        t"                    r%|                    |j                   ||j        z  }nt          |j        t                    rRt          j        |j        |j        |         j        |j        |         j                  }|                    d           |S t          j        d|j        |         j        |j        |         j                  S |t          |          k     .t+          |||j        d         j        |j        d         j                  S )NzInstruction must not be empty.r   z Instruction must have a mnemoriczUnknown mnemonic 'rK   rJ   zInvalid operand)r   newrH   r   r   r   r   r   rU   rY   r[   rb   rO   rP   TokenStreamr=   rB   r3   appendrC   	elaboraterd   )rE   rH   re   rf   r]   resulterrors          r   parsezInstructionCSTNode.parse   s\     	C=!ABBB}Q% 	C=!CV]STEUEacicpqrcs  dB  C  C  C	OFM!$4$: ; ; A A C CDDHH 	O 	O 	O=!OfmA6F6L!O!O!OQWQ^_`QaQmouo|}~o  pN  O  O  O  O  O	O *,c&kk!!"48#7#7eff8M#N#NOOF&+~66 ~,,,//FK-- ~!fk6=3G3SU[UbchUiUwxx 1222 }%6e8L8XZ`ZghmZnZ|}}} c&kk!! "(HfmA6F6RTZTabcTdTrssss    >B AC65C6c                 l    d                     d | j        D                       }| j        j         d| S )Nr7   c                 ,    g | ]}t          |          S r&   r9   )r:   operands     r   r;   z.InstructionCSTNode.__str__.<locals>.<listcomp>   s    GGGgS\\GGGr    )r?   rf   re   r   )r   rf   s     r   r   zInstructionCSTNode.__str__   s=    88GGGGGHH-%22222r    )r   r   )r!   r"   r#   r   r>   r3   r%   rh   rG   rO   rP   rk   r   r   rp   r   r   r&   r    r   rd   rd      s        + + +T.5I +WZ +lo +vz + + + + t48/ tD94D t t t [t63 3 3 3 3 3 3r    rd   c                      d S r   r&   r&   r    r   
parse_lineru      s    Cr    c                   \    e Zd ZddZedej        j        dee	z  fd            Z
defdZdS )CSTr   Nc                     g | _         d S r   )linesr   s    r   rh   zCST.__init__   s    !#


r    sourcec                 (	   t                      }i }|                                D ]k}|j        }|s|d         j        t          j        j        j        k    r|d         j        s.t          j
        d|d         j        |d         j                  c S t          |          dk    rOt          j
        d|d         j        j         d|d         j         |d         j        |d         j                  c S |j                            t!          t          j                            t'          |d         j                            |d         j        |d         j                             F|d         j        t          j        j        j        k    rt+          |d         j        t&                    s.t          j
        d|d         j        |d         j                  c S |d         j                                        dk    rNt          j
        d|d         j                                         |d         j        |d         j                  c S t          |          d	k     r.t          j
        d
|d         j        |d         j                  c S |d         j        t          j        j        j        k    rAt          j
        d|d         j        j         |d         j        |d         j                  c S |                    t'          |d         j                  |dd          i           g }|D ]}|j        t          j        j        j        k    r|                    t'          |j                            }|rO|D ]K}	|                    t          j                            |	j        |j        |j        |	j                             L|                    |           |                    |           t6                              t          j                            |                    }
t+          |
t6                    s1|
                    d|d         j        |d         j                   |
c S |j                            |
           m|S )Nr   zLabel must not be emptyrJ   zUnexpected z after label .z+Malformed macro token has non-str value (?)DEFINEz9Top-level macro token must have value of @DEFINE, found @   zDMacro definition is to short, use the syntax @DEFINE WORD DEFINITIONzExpected identifier, found    zInvalid instruction)rw   split_linesrH   rN   rO   rP   rQ   r,   r   r   rj   r   r   r[   ry   rl   r   typesr	   r   rW   r=   rX   rT   updategetTokenrd   rp   rk   rm   )rE   rz   cstmacroslinerH   result_tokensr^   macro_valuemacro_tokeninstructions              r   from_tokenszCST.from_tokens   s    ee24&&(( +	* +	*D[F ay~!3!999ay u$=)CVAYEZ\bcd\e\stttttv;;??$=)lvay~7K)l)l[abc[d[j)l)lntuvnw  oD  FL  MN  FO  F]  ^  ^  ^  ^  ^	  $**:*:3vay;O;O*P*PRXYZR[Rgiopqir  jA  "B  "B  C  C  C48#5#;;;!&)/377 I$=)WY_`aYbYnpvwxpy  qH  I  I  I  I  I!9?((**h66$=)~eklmenetezeze|e|)~)~  AG  HI  AJ  AV  X^  _`  Xa  Xo  p  p  p  p  pv;;>>$=)prxyzr{  sH  JP  QR  JS  Ja  b  b  b  b  b!9>TX%7%BBB$=)]vay~G[)])]_efg_h_tv|}~v  wN  O  O  O  O  Os6!9?33VABBZ@AAA 79# 	4 	4EzTX%7%BBB&,jjU[1A1A&B&B& 8/: R R - 4 4TX^^KDTV[Vgini|  J  P  6Q  6Q  !R  !R  !R  !RR *007777%,,U3333,22483G3G3V3VWWKk+=>> #%%&;VAY=RTZ[\T]Tklll""""I[))))
r    c                 J    d                     d | j        D                       S )N
c                 ,    g | ]}t          |          S r&   r9   )r:   r   s     r   r;   zCST.__str__.<locals>.<listcomp>   s    ;;;#d));;;r    )r?   ry   r   s    r   r   zCST.__str__   s%    yy;;
;;;<<<r    )r   N)r!   r"   r#   rh   rG   rO   rP   rk   r   r   r   r   r   r&   r    r   rw   rw      s|        $ $ $ $ 0!5 0$:J 0 0 0 [0d= = = = = = =r    rw   )&__doc__r)   dataclassesr   typingr   r   r   r   
urcl.typesr   r	   r
   r   r   r   r   r   r   urcl.lexrO   ro   r   r   r   Enumr(   r3   rA   rP   rk   rb   rd   r   HeaderLineru   rw   r&   r    r   <module>r      s   U U  ! ! ! ! ! ! 0 0 0 0 0 0 0 0 0 0 0 0 G  G  G  G  G  G  G  G  G  G  G  G  G  G  G  G  G  G  G  G  G  G       GCLL
    wqz       $)    # # # # # # # # + + + + + + + +L%$(. L%3E L% L% L% L%\(3 (3 (3 (3 (3 (3 (3 (3T HTZ%566$*BS9TT  := := := := := := := := := :=r    