
    hv(                        S r SSKrSSKJr  SSKJrJrJrJr  SSK	J
r
JrJrJrJrJrJrJrJr  SSKrSSKJr  \" S5      r\ " S S	\\   5      5       r " S
 S\R2                  5      r\ " S S5      5       r\ " S S5      5       rS\R:                  R<                  S\4S jr " S S5      r \ \\RB                  R                     -  \\RB                  RD                     -  r#S r$ " S S5      r%g)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                   B    \ rS rSr% \\S'   \\S'   \\S'   S\4S jrSr	g)	Terminal   valueline_numbercolumn_numberreturnc                 ,    [        U R                  5      $ N)strr   selfs    +/mnt/public/Repos/urclelf/./urcl/urclcst.py__str__Terminal.__str__   s    4::     N)
__name__
__module____qualname____firstlineno__r   __annotations__intr   r    __static_attributes__r#   r"   r   r   r      s    H r"   r   c                      \ rS rSr\R
                  " 5       r\R
                  " 5       r\R
                  " 5       r\R
                  " 5       r	\R
                  " 5       r
\R
                  " 5       r\R
                  " 5       rSrg)OperandType   r#   N)r$   r%   r&   r'   enumautoINTEGERLABELGENERAL_REGISTER	CHARACTERPORTRELATIVE_ADDERESSARRAYr*   r#   r"   r   r,   r,      sQ    iikGIIKEyy{		I99;D		IIKEr"   r,   c                   p    \ rS rSr% \\\\\\	\
\\\-  \-  \\   -  4   \S'   \\S'   \\S'   S\4S jrSrg)	OperandCSTNode   r   r   r   r   c           	      D   [        U R                  [        5      (       a  SU R                   S3$ [        U R                  [        5      (       a9  SSR	                  U R                   Vs/ s H  n[        U5      PM     sn5       S3$ [        U R                  5      $ s  snf )N"[ ])
isinstancer   r   listjoin)r   r   s     r   r    OperandCSTNode.__str__$   s{    djj#&&tzzl!$$djj$''sxx DU DEFaHHtzz?" !Es   )B
r#   N)r$   r%   r&   r'   r   r	   r   r)   r
   r   r   r   r   r   r   r@   r   r(   r    r*   r#   r"   r   r8   r8      sq    oy$P`behsbs  wC  cC  FJ  KO  FP  cP  P  Q  Q# #r"   r8   c                   F    \ rS rSr% \\-  S-  \S'   \\S'   \S 5       r	Sr
g)OperandParseResult-   Ndatatokens_consumedc                     [        S S5      $ )Nr   )rD   )clss    r   missOperandParseResult.miss2   s    !$**r"   r#   )r$   r%   r&   r'   r8   r   r(   r)   classmethodrJ   r*   r#   r"   r   rD   rD   -   s*    
3

%%+ +r"   rD   tokensr   c           	         SnU R                   U   nUR                  [        R                  R                  R
                  :X  aG  [        [        [        [        UR                  5      5      UR                  UR                  5      S5      $ [        UR                  [        5      (       a5  [        [        UR                  UR                  UR                  5      S5      $ UR                  [        R                  R                  R                  :X  an  [        UR                  [         5      (       d  [        SUR                   S3S5      $ [        [        UR                  UR                  UR                  5      S5      $ UR                  [        R                  R                  R"                  :X  aw  [        UR                  [         5      (       d  [        SUR                   S3S5      $ [        [        [%        UR                  5      UR                  UR                  5      S5      $ UR                  [        R                  R                  R&                  :X  a  [        UR                  [        5      (       a  UR                  (       d  [        SUR                   S3S5      $ [        [        [)        UR                  5      UR                  UR                  5      S5      $ UR                  [        R                  R                  R*                  :X  a  [        UR                  [        5      (       a  UR                  (       d  [        SUR                   S3S5      $ [        [        UR                  UR                  UR                  5      S5      $ UR                  [        R                  R                  R,                  :X  Ga   [        UR                  [        5      (       a  UR                  (       d  [        SUR                   S3S5      $ UR                  R/                  5       S	:X  a3  [        [        [1        5       UR                  UR                  5      S5      $ UR                  R/                  5       S
:X  a3  [        [        [3        5       UR                  UR                  5      S5      $ [        R5                  5       $ UR                  [        R                  R                  R6                  :X  a  [        UR                  [        5      (       a  UR                  (       d  [        SUR                   S3S5      $ [8        R:                  " UR                  5      nU(       a*  [        [        X2R                  UR                  5      S5      $ [        SUR                   S3S5      $ UR                  [        R                  R                  R<                  :X  a  [        UR                  [        5      (       a%   [?        UR                  RA                  5       5      nOS nU(       d  [        SUR                   S3S5      $ [        [        XBR                  UR                  5      S5      $ UR                  [        R                  R                  RD                  :X  a  SnU[G        U 5      :  a]  U R                   U   nUR                  [        R                  R                  RH                  :X  a  O'US-  nUS-  nU[G        U 5      :  a  M]  [        SS5      $ [        [        XPR                   S   R                  U R                   S   R                  5      US-   5      $ [        R5                  5       $ ! [B         a    S n GNaf = f)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)%rM   typeurcllex	TokenTyper1   rD   r8   r	   r   r   r   r   r?   r   r0   r)   RELATIVE_JUMPr
   r3   r   STRING
IDENTIFIERlowerr   r   rJ   r4   r   
from_valueMACROr   upper
ValueErrorLEFT_BRACKETlenRIGHT_BRACKET)rM   indextokenportdefined_immediatepps         r   parse_operandrg   6   se   EMM% EzzTXX''---!.s5;;7G1H%J[J[]b]p]p"qstuu	EKK	1	1!.e>O>OQVQdQd"eghii	txx))11	1%++s++%(:5;;-q&I1MM!.e>O>OQVQdQd"eghii	txx))77	7%++s++%(@Q&OQRSS!.1MuO`O`bgbubu"vxyzz	txx))33	3%++s++5;;%(<U[[M&KQOO!.5;;1GIZIZ\a\o\o"prstt	txx))00	0%++s++5;;%(9%++a&H!LL!.e>O>OQVQdQd"eghii	txx))44	4%++s++5;;%(=ekk]!&LaPP;;$&%n[]EDUDUW\WjWj&kmnoo[[ D(%n\^UEVEVX]XkXk&lnopp%**,,	txx))..	.%++s++5;;%}A&FJJu{{+%nT;L;LeNaNa&bdeff%}A&FJJ	txx))//	/ekk3'')$4U[[5F5F5H$I! !% %(DU[[MQR&SUVWW!.1BDUDUW\WjWj"kmnoo	txx))66	6c&k!MM%(EzzTXX//===!GBQJE c&k! &&DaHH!.]]15E5Q5QSYS`S`abScSqSq"rty|}t}~~""$$-  )$(!)s   ?#]7 7^^c                       \ rS rSrSS\S\\   S\S\SS4
S jjr\	S	\
R                  R                  S\\-  4S
 j5       rS\4S jrSrg)InstructionCSTNode   mnemonicoperandsr   r   r   Nc                 4    Xl         X l        X0l        X@l        g r   )rk   rl   r   r   )r   rk   rl   r   r   s        r   __init__InstructionCSTNode.__init__   s      &*r"   rM   c                    U(       d  [         R                  " S5      $ UR                  S   R                  (       dF  [         R                  " SUR                  S   R                  UR                  S   R
                  5      $  [        [        UR                  S   R                  5      R                  5       5      n/ nSnU[        U5      :  GaX  [        [        R                  R                  UR                  US  5      5      n[        UR                   ["        5      (       a*  UR%                  UR                   5        XER&                  -  nO[        UR                   [        5      (       ac  [         R                  " UR                   UR                  U   R                  UR                  U   R
                  5      nUR)                  S5        U$ [         R                  " SUR                  U   R                  UR                  U   R
                  5      $ U[        U5      :  a  GMX  [+        X#UR                  S   R                  UR                  S   R
                  5      $ ! [         ad    [         R                  " SUR                  S   R                   S3UR                  S   R                  UR                  S   R
                  5      s $ f = f)NzInstruction must not be empty.r   z Instruction must have a mnemoriczUnknown mnemonic 'rP   rO   zInvalid operand)r   newrM   r   r   r   r   r   rZ   r^   r`   rg   rT   rU   TokenStreamr?   rF   r8   appendrG   	elaborateri   )rI   rM   rk   rl   rb   resulterrors          r   parseInstructionCSTNode.parse   sL    ==!ABB}}Q%%==!CV]]STEUEaEacicpcpqrcs  dB  dB  C  C	OFMM!$4$:$: ; A A CDH *,c&k!"488#7#7ef8M#NOF&++~66,///FKK--!fkk6==3G3S3SU[UbUbchUiUwUwx 12 }}%6e8L8X8XZ`ZgZghmZnZ|Z|}} c&k! "(fmmA6F6R6RTZTaTabcTdTrTrss#  	O==#5fmmA6F6L6L5MQ!OQWQ^Q^_`QaQmQmouo|o|}~o  pN  pN  O  O	Os   9I# #A+KKc                     SR                  U R                   Vs/ s H  n[        U5      PM     sn5      nU R                  R                   SU 3$ s  snf )Nr=   )rA   rl   r   rk   r   )r   operandrl   s      r   r    InstructionCSTNode.__str__   sI    88GgS\GH--%%&az22 Hs   A)r   r   rk   rl   )r   r   )r$   r%   r&   r'   r   r@   r8   r)   rn   rL   rT   rU   rr   r   r   rw   r   r    r*   r#   r"   r   ri   ri      ss    + +T.5I +WZ +lo +vz + t488// tD94D t t63 3r"   ri   c                      g r   r#   r#   r"   r   
parse_liner}      s    r"   c                   v    \ rS rSrS	S jr\S\R                  R                  S\	\
-  4S j5       rS\4S jrSrg)
CST   r   Nc                     / U l         g r   linesr   s    r   rn   CST.__init__   s	    !#
r"   sourcec                 *
   [        5       n0 nUR                  5        GH  nUR                  nU(       d  M  US   R                  [        R
                  R                  R                  :X  Ga+  US   R                  (       d4  [        R                  " SUS   R                  US   R                  5      s  $ [        U5      S:  a^  [        R                  " SUS   R                  R                   SUS   R                   3US   R                  US   R                  5      s  $ UR                  R                  [!        [        R"                  R%                  ['        US   R                  5      5      US   R                  US   R                  5      5        GMz  US   R                  [        R
                  R                  R(                  :X  Ga  [+        US   R                  [&        5      (       d4  [        R                  " SUS   R                  US   R                  5      s  $ US   R                  R-                  5       S:w  aR  [        R                  " SUS   R                  R-                  5        3US   R                  US   R                  5      s  $ [        U5      S	:  a4  [        R                  " S
US   R                  US   R                  5      s  $ US   R                  [        R
                  R                  R.                  :w  aN  [        R                  " SUS   R                  R                   3US   R                  US   R                  5      s  $ UR1                  ['        US   R                  5      USS  05        GMn  / nU H  nUR                  [        R
                  R                  R.                  :X  a  UR3                  ['        UR                  5      5      nU(       ad  U H\  n	UR                  [        R
                  R5                  U	R                  UR                  UR                  U	R                  5      5        M^     M  UR                  U5        M  UR                  U5        M     [6        R9                  [        R
                  R;                  U5      5      n
[+        U
[6        5      (       d1  U
R=                  SUS   R                  US   R                  5        U
s  $ UR                  R                  U
5        GM     U$ )Nr   zLabel must not be emptyrO   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)r   split_linesrM   rS   rT   rU   rV   r1   r   r   rq   r   r   r`   r   rs   r   typesr	   r   r\   r?   r]   rY   updategetTokenri   rw   rr   rt   )rI   r   cstmacroslinerM   result_tokensrc   macro_valuemacro_tokeninstructions              r   from_tokensCST.from_tokens   s    e24&&(D[[Fay~~!3!3!9!99ay$==+BVAYEZEZ\bcd\e\s\sttv;?$==;vay~~7K7K6LN[abc[d[j[jZk)lntuvnw  oD  oD  FL  MN  FO  F]  F]  ^  ^		  $***:*:3vay;O*PRXYZR[RgRgiopqir  jA  jA  "B  C488#5#5#;#;;!&)//377$==+VY_`aYbYnYnpvwxpy  qH  qH  I  I!9??((*h6$==+deklmenetetezeze|d})~  AG  HI  AJ  AV  AV  X^  _`  Xa  Xo  Xo  p  pv;>$==+orxyzr{  sH  sH  JP  QR  JS  Ja  Ja  b  b!9>>TXX%7%7%B%BB$==+Fvay~~G[G[F\)]_efg_h_t_tv|}~v  wN  wN  O  Os6!9??3VABZ@A 79#EzzTXX%7%7%B%BB&,jjU[[1A&B&/: - 4 4TXX^^KDTDTV[VgVgini|i|  J  P  P  6Q  !R 0; *007%,,U3 $ -224883G3G3VWKk+=>>%%&;VAY=R=RTZ[\T]TkTkl""II[)W )X 
r"   c                 v    SR                  U R                   Vs/ s H  n[        U5      PM     sn5      $ s  snf )N
)rA   r   r   )r   r   s     r   r    CST.__str__   s+    yy

;
#d)
;<<;s   6r   )r   N)r$   r%   r&   r'   rn   rL   rT   rU   rr   r   r   r   r   r    r*   r#   r"   r   r   r      sE    $ 0!5!5 0$:J 0 0d= =r"   r   )&__doc__r.   dataclassesr   typingr   r   r   r   
urcl.typesr   r	   r
   r   r   r   r   r   r   urcl.lexrT   rv   r   r   r   Enumr,   r8   rD   rU   rr   rg   ri   r   HeaderLiner}   r   r#   r"   r   <module>r      s    U  ! 0 0 G  G  G  CL
wqz  $))  # # # + + +L%$((.. L%3E L%\(3 (3T HTZZ%5%566$**BSBS9TT:= :=r"   