o
    hv(                     @   s   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	 d	ee ZG d
d dejZeG dd dZeG dd dZdejjdefddZG dd dZ e eej!j B eej!j" B Z#dd Z$G d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                   @   s4   e Zd ZU eed< eed< eed< defddZdS )Terminalvalueline_numbercolumn_numberreturnc                 C   s
   t | jS N)strr   self r   6/home/seanl/mnt/public/Repos/urclelf/./urcl/urclcst.py__str__   s   
zTerminal.__str__N)__name__
__module____qualname__r   __annotations__intr   r   r   r   r   r   r      s
   
 r   c                   @   sD   e Zd Ze Ze Ze Ze Ze Z	e Z
e ZdS )OperandTypeN)r   r   r    enumautoINTEGERLABELGENERAL_REGISTER	CHARACTERPORTRELATIVE_ADDERESSARRAYr   r   r   r   r#      s    r#   c                   @   sX   e Zd ZU eeeeeee	e
eeB eB ee B f ed< eed< eed< defddZdS )OperandCSTNoder   r   r   r   c                 C   sN   t | jtrd| j dS t | jtr"dddd | jD  dS t| jS )N"[ c                 S      g | ]}t |qS r   r   ).0r   r   r   r   
<listcomp>)       z*OperandCSTNode.__str__.<locals>.<listcomp>])
isinstancer   r   listjoinr   r   r   r   r   $   s
   
zOperandCSTNode.__str__N)r   r   r    r   r   r   r"   r	   r
   r   r   r   r   r   r8   r   r!   r   r   r   r   r   r-      s
   
 ,r-   c                   @   s2   e Zd ZU eeB dB ed< eed< edd ZdS )OperandParseResultNdatatokens_consumedc                 C   s
   t d dS )Nr   )r:   )clsr   r   r   miss2      
zOperandParseResult.miss)	r   r   r    r-   r   r!   r"   classmethodr>   r   r   r   r   r:   -   s
   
 r:   tokensr   c                 C   s  d}| j | }|jtjjjkrtttt	|j
|j|jdS t|j
tr1tt|j
|j|jdS |jtjjjkrUt|j
tsItd|j
 ddS tt|j
|j|jdS |jtjjjkr{t|j
tsmtd|j
 ddS ttt|j
|j|jdS |jtjjjkrt|j
t	r|j
std|j
 ddS ttt|j
|j|jdS |jtjjjkrt|j
t	r|j
std|j
 ddS tt|j
|j|jdS |jtjjjkrt|j
t	r|j
std|j
 ddS |j
 d	krttt |j|jdS |j
 d
krttt |j|jdS t S |jtjjjkrNt|j
t	r&|j
s0td|j
 ddS t|j
}|rDtt||j|jdS td|j
 ddS |jtjjjkrt|j
t	rtz	t|j
  }W n t!ys   d }Y nw d }|std|j
 ddS tt||j|jdS |jtjjj"krd}|t#| k r| j | }|jtjjj$krn|d7 }|d7 }|t#| k stddS tt|| j d j| j d j|d 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)%rA   typeurcllex	TokenTyper'   r:   r-   r   r   r   r   r   r7   r   r&   r"   RELATIVE_JUMPr	   r)   r
   STRING
IDENTIFIERlowerr   r   r>   r*   r   
from_valueMACROr   upper
ValueErrorLEFT_BRACKETlenRIGHT_BRACKET)rA   indextokenportdefined_immediateppr   r   r   parse_operand6   sx   
 

&rZ   c                   @   s\   e Zd Zddedee dededdf
dd	Zed
e	j
jdeeB fddZdefddZdS )InstructionCSTNoder   mnemonicoperandsr   r   r   Nc                 C   s   || _ || _|| _|| _d S r   )r\   r]   r   r   )r   r\   r]   r   r   r   r   r   __init__   s   
zInstructionCSTNode.__init__rA   c              	   C   sj  |st dS |jd jst d|jd j|jd jS ztt|jd j }W n  t	yJ   t d|jd j d|jd j|jd j Y S w g }d}|t
|k rttj|j|d  }t|jtrt||j ||j7 }n,t|jtrt |j|j| j|j| j}|d |S t d|j| j|j| jS |t
|k sUt|||jd j|jd jS )NzInstruction must not be empty.r   z Instruction must have a mnemoriczUnknown mnemonic 'rC   rB   zInvalid operand)r   newrA   r   r   r   r   r   rM   rQ   rS   rZ   rG   rH   TokenStreamr7   r;   r-   appendr<   	elaborater[   )r=   rA   r\   r]   rU   resulterrorr   r   r   parse   s.   
2 
zInstructionCSTNode.parsec                 C   s(   d dd | jD }| jj d| S )Nr0   c                 S   r1   r   r2   )r3   operandr   r   r   r4      r5   z.InstructionCSTNode.__str__.<locals>.<listcomp>)r9   r]   r\   r   )r   r]   r   r   r   r      s   zInstructionCSTNode.__str__)r   r   )r   r   r    r   r8   r-   r"   r^   r@   rG   rH   r`   r   r   re   r   r   r   r   r   r   r[      s
    $r[   c                   C   s   d S r   r   r   r   r   r   
parse_line   s   rg   c                   @   sB   e Zd Zd
ddZedejjdee	B fddZ
defdd	ZdS )CSTr   Nc                 C   s
   g | _ d S r   )linesr   r   r   r   r^      r?   zCST.__init__sourcec                 C   s  t  }i }| D ]L}|j}|sq	|d jtjjjkrl|d js0t	
d|d j|d j  S t|dkrRt	
d|d jj d|d j |d j|d j  S |jttjt|d j|d j|d j q	|d jtjjjkrt|d jtst	
d|d j|d j  S |d j dkrt	
d|d j  |d j|d j  S t|d	k rt	
d
|d j|d j  S |d jtjjjkrt	
d|d jj |d j|d j  S |t|d j|dd  i q	g }|D ]8}|jtjjjkr*|t|j}|r$|D ]}	|tj|	j|j|j|	j qq|| q|| qttj|}
t|
tsP|
d|d j|d j |
  S |j|
 q	|S )Nr   zLabel must not be emptyrB   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)rh   split_linesrA   rF   rG   rH   rI   r'   r   r   r_   r   r   rS   ri   ra   r   typesr   r   rO   r7   rP   rL   updategetTokenr[   re   r`   rb   )r=   rj   cstmacroslinerA   result_tokensrV   macro_valuemacro_tokeninstructionr   r   r   from_tokens   sP   
82., $zCST.from_tokensc                 C   s   d dd | jD S )N
c                 S   r1   r   r2   )r3   ru   r   r   r   r4      r5   zCST.__str__.<locals>.<listcomp>)r9   ri   r   r   r   r   r      s   zCST.__str__)r   N)r   r   r    r^   r@   rG   rH   r`   r   r   rz   r   r   r   r   r   r   rh      s
    
2rh   )&__doc__r$   dataclassesr   typingr   r   r   r   
urcl.typesr   r   r	   r
   r   r   r   r   r   urcl.lexrG   rd   r   r   r   Enumr#   r-   r:   rH   r`   rZ   r[   ro   HeaderLinerg   rh   r   r   r   r   <module>   s(    ,		N*