
    öh              	          S SK r S SKJr  S SKrS SKJrJr  S SKrS SKrS SK	r	S SK
Jr  S SKrS SKrS SK	r	SrS rS\R                   R"                  S\S   S	\R$                  \-  4S
 jrS\R(                  S\S\S   S	\R$                  \-  4S jrS\S\R0                  S	\R2                  \-  4S jrS\S\R0                  S	\\-  4S jrg)    N)	dataclass)LiteralCallable)	TracebackzCould not parse urcl sourceinstructionbits)    @   returnc           	         [         R                  " S/ 5      n[        R                   GH  nU R                  UR
                  ;   d  M   [        U R                  5      UR                  :w  at  [        R                  " SU R                  R                  R                  5        S[        U R                  5       SUR                   3U R                  U R                  S9s  $ UR                  X5      n[!        U[        5      (       a  UnUs  $ UR"                  R%                  UR"                  5          U$    [        R                  " SU R                  R                   3U R                  U R                  5      $ )Nr   z Incorrect number of operands to z	 - found z, expected line_numbercolumn_numberz,No x86 translation for for URCL instruction )x86ASMCodecompile_x86TRANSLATIONSmnemonic	mnemonicslenoperandsoperand_countr   newnameupperr   r   compile
isinstancecodeextend)r   r   x86_codefamilytranslationerrors         &/mnt/public/Repos/urclelf/./compile.py urcl_instruction_to_x86_assemblyr%      s   {{1b!H**6#3#33;''(F,@,@@ }}'GH\H\HaHaHgHgHiGjjstw  yD  yM  yM  uN  tO  OZ  [a  [o  [o  Zp  &q  J  V  V  fq  f  f  @  @ ..;K+y11#$$[%5%56 O + }}KKL`L`LeLeKfgit  jA  jA  CN  C\  C\  ]  	]    urcl_programis_mainc           	         [         R                  " S / 5      nU(       a/  UR                  R                  [         R                  " S5      5        U R
                   GH`  n[        U[        R                  R                  5      (       ap  [        UR                  [        R                  5      (       aE  UR                  R                  [         R                  " UR                  R                  5      5        M  M  [        XB5      n[        U[        5      (       a/  UnUR                  SU S3UR                  UR                   S9  Us  $ UR                   Hd  n[        U[         R                  5      (       a  M$  UR#                  UR$                  UR&                   Vs/ s H  owR                  PM     sn5        Mf     GMc     U$ s  snf )N_startzURCL Instruction z could not be compiled into x86r   )r   r   r   appendLabellinesr   urclurclcstTerminalvaluer   r%   r   	elaborater   r   add_instructionr   r   )r'   r(   r   x86_assembly_codelinex86_instructionr#   ops           r$   compile_urcl_to_x86_asmr8   $   sY   D"-%%cii&9:""dDLL1122$**djj11!&&--cii

.HI:4Foy11#EOO/v5TUcgcscs  DH  DV  DVO  WL.33O/39955--o.F.F\k\t\tHu\tVX\tHuv  4 #$  Ivs   Gsourceoptionsc                 J   [         R                  " U 5      n[        U[        5      (       a  UnUR	                  S5        U$ UR
                  R                  5       n[        U[        5      (       a  UnU$ [        X!R                  U5      n[        U[        5      (       a,  UnUR	                  SUR
                  R                   35        U$ [        R                  " XT5      n[        U[        5      (       a-  UnUR	                  SUR
                  R                   S35        U$ U$ )Nz+Code cannot be parsed, aborting compilationz URCL code does not translate to z
Assembled z) program does not convert to machine code)r.   parser   r   r2   targetget_word_sizer8   r(   isar   assemble)r9   r:   r'   r#   r   assembly_codemachine_codes          r$   "compile_urcl_source_to_flat_binaryrC   >   s    ::f%L,	**EF>>'')D$	""+L//4PM-++:7>>;M;M:NOP<<4L,	***W^^%7%7$88abcr&   c                    [        X5      n[        U[        5      (       a  UnUR                  S5        U$ UR                  [
        R                  R                  :X  a  UR                  nOUR                  [
        R                  R                  :X  aD  [        R                  " X!R
                  R                  [
        R                  R                  :H  S9nO$[        R                  " SUR                   S35      $ [!        U5      $ )Nz#Machine code could not be generated)	is_64_bitzExecutable format z is not supported)rC   r   r   r2   executable_formatr=   ExecutableFormatFLATbinaryELFelfmake_relocatable_elfr?   IsaX64r   bytes)r9   r:   flat_binaryr#   output_binarys        r$   compile_urcl_to_executablerR   [   s    4VEK+y))=>  F$;$;$@$@@#**		"	"f&=&=&A&A	A00I[I[]c]g]g]k]kIkm}}1'2K2K1LL]^__r&   )mathdataclassesr   enumtypingr   r   r.   r   rK   r#   r   r   r=   PARSING_ERROR_MESSAGENO_ERROR_EXIT_CODEr/   InstructionCSTNoder   r%   CSTboolr8   strCompileOptionsAssembledMachineCoderC   rO   rR    r&   r$   <module>r`      s     !  $  
 
    
5  $,,2Q2Q Y`agYh mpmxmx  |E  nE &$(( T QW ]`]h]hkt]t 4s V=R=R WZWoWor{W{ : s  V5J5J  uW`O`  r&   