Author Topic: Compound operators for SmplMath  (Read 116 times)

HSE

  • Member
  • *****
  • Posts: 1343
  • <AMD>< 7-32>
Compound operators for SmplMath
« on: June 22, 2020, 08:32:06 AM »
Hi all!

I maked a little wrapper to fSlv to manage some compound operators(*=, /=, +=, -=, ++, --):
Code: [Select]
    fSlvW res1 = 10.0 + 5.0
    print real8$(res1),13,10

    fSlvW res1 ++
    print real8$(res1),13,10

    fSlvW res1 -= -10
    print real8$(res1),13,10

    fSlvW res1 *=2
    print real8$(res1),13,10
   
    mov eax, 0
    fSlvW res1[eax*8] *= 2
    print real8$(res1),13,10
Code: [Select]
1.5000e+001
1.6000e+001
2.6000e+001
5.2000e+001
1.0400e+002
ress any key to continue ...
Code: [Select]
fSlvW macro Expression:=< >

    tk_dest TEXTEQU <>
    tk_exp  TEXTEQU <>
    tk_op TEXTEQU <>
    tk_op1  = 0
    tk_op2 = 0
    FORC char,<&Expression>
        IF tk_op2 EQ 0
            tk_switch INSTR 1,<*/+->,<&char>
            IF tk_switch EQ 0
                IF tk_op1 EQ 0 
                    tk_switch4 INSTR 1,<=>,<&char>
                    If tk_switch4 EQ 1
                        tk_op1 = 1
                        tk_op CATSTR tk_op,<&char>
                        tk_op2 = 1
                    ELSE
                       tk_dest CATSTR tk_dest,<&char>
                    ENDIF
                ELSEIF tk_op1 GT 1 
                    tk_exp CATSTR tk_exp,<&char>
                ELSE
                    tk_switch2 INSTR 1,<=>,<&char>
                    IF tk_switch2 EQ 1 
                        IF tk_op1 EQ 1
                            tk_op1 = 2
                            tk_op CATSTR tk_op,<&char>
                            tk_op2 = 1
                        ELSE
                            tk_exp CATSTR tk_exp,<&char>
                        ENDIF
                    ELSE
                        tk_dest CATSTR tk_dest,tk_op
                        tk_op TEXTEQU <>
                        tk_dest CATSTR tk_dest,<&char>
                        tk_op1 = 0
                    ENDIF       
                ENDIF
            ELSE
                IF tk_op1 EQ 0 
                    tk_op1 = 1
                    tk_op CATSTR tk_op,<&char>
                    tk_switch3 = tk_switch
                %    echo tk_op
                ELSE
                    tk_switch2 INSTR 1,<+->,<&char>
                    IF tk_switch2 GT 0
                        echo es doble
                        tk_is INSTR 1, tk_op, <&char>
                        IF tk_is EQ 1
                            echo es igual
                            tk_op1 = 3
                        ELSE
                            .err A2052 invalid compound operator
                        ENDIF
                    ELSE
                        .err A2052  invalid compound operator
                    ENDIF
                ENDIF
            ENDIF
        ELSE
            tk_exp CATSTR tk_exp,<&char>
        ENDIF
    ENDM

    IF tk_op1 EQ 1
        echo es 1
        tk_dest CATSTR <fSlv >, tk_dest, tk_op, tk_exp
    ELSEIf tk_op1 EQ 2
        echo es 2
        IF tk_switch3 EQ 1
            tk_dest CATSTR <fSlv >, tk_dest,<= >,tk_dest,<* (>,tk_exp,<)>
        ELSEIF tk_switch3 EQ 2
            tk_dest CATSTR <fSlv >, tk_dest,<= >,tk_dest,</ (>,tk_exp,<)>
        ELSEIF tk_switch3 EQ 3
            tk_dest CATSTR <fSlv >, tk_dest,<= >,tk_dest,<+ (>,tk_exp,<)>
        ELSEIF tk_switch3 EQ 4
            tk_dest CATSTR <fSlv >, tk_dest,<= >,tk_dest,<- (>,tk_exp,<)>
        ENDIF
    ELSEIf tk_op1 EQ 3
        echo es 3
        IF tk_switch3 EQ 3
            tk_dest CATSTR <fSlv >, tk_dest,<= >,tk_dest,<+ 1.0>
        ELSE
            tk_dest CATSTR <fSlv >, tk_dest,<= >,tk_dest,<- 1.0>
        ENDIF
    ENDIF
%    echo tk_dest
    tk_dest

endm

I'm still testing the wrapper, but look good. Anyway if there is a better idea ... Thanks in advance.

Regards. HSE

Update: Also arrays.
« Last Edit: June 23, 2020, 03:13:16 AM by HSE »