Solves the fours problem
#1
Code to solve the fours problem:

Code:
Fours v1.3a documentation. QB64.

Fours calculates the 'fours problem'.

The fours problem is a solution using four 4s with any mathematical
symbols to calculate the solutions for 1 to 24.

Precedence for division/multiplication is greater than addition/
subtraction: 4-4/4+4 is 7.

Power is next greater precedence: 4+(4/û4)^4 is 20.

Single unary parser for negate is highest precedence: 4-4-4-!4 is 1.

Parenthesis implies recursive precedence: 4*(4-4+4) is 16.

The û is a square root symbol in ascii. Not all editors display it as a
square root symbol.

The negation of 4 is equal to -5 because !4 is twos-complement calculated.

Version v1.2a features:  Upgrade to solve only first 24 solutions then
  quit, also lists each fours number in order of solution.

Version v1.3a features:  Entry for number of solutions to search for,
  also adds negation parser. Adds debug mode for number of errors, and
  number of solutions not found.

-end-

This is the program:

Code:
REM Fours v1.3a expression parser. Calculates fours problem. QB64.

COMMON SHARED Token AS INTEGER, Token.Index AS INTEGER
COMMON SHARED Out2 AS STRING, Nul AS STRING, Strng AS STRING
COMMON SHARED Solutions AS DOUBLE, Out3 AS STRING, Counter AS INTEGER
COMMON SHARED Debug AS INTEGER, Num.Fours AS INTEGER, D() AS STRING
COMMON SHARED Token.List AS STRING

ON ERROR GOTO Error.Routine
Token.List$ = "-+*/^()!"
Nul = "": Solutions = 0: Debug = -1
COLOR 15, 0
CLS
PRINT "Fours v1.3a: Calculates fours problem;"
start.loop:
PRINT "Enter fours solutions to calculate(<enter> for default)";
INPUT Num.Fours
IF Num.Fours < 0 THEN GOTO start.loop
IF Num.Fours = 0 THEN Num.Fours = 24
REDIM D(1 TO Num.Fours) AS STRING
PRINT "Calculating: ";
a$ = "-+/*^" ' token list
FOR l = 1 TO 5
    FOR m = 1 TO 5
        FOR N = 1 TO 5
            FOR p = 1 TO 7
                SELECT CASE p
                    CASE 1 ' 4/4/4/4
                        FOR q1 = 1 TO 4
                            FOR q2 = 1 TO 4
                                FOR q3 = 1 TO 4
                                    FOR q4 = 1 TO 4
                                        SELECT CASE q1
                                            CASE 1
                                                q1$ = "4": r1$ = "4"
                                            CASE 2
                                                q1$ = "sqr(4)": r1$ = CHR$(251) + "4"
                                            CASE 3
                                                q1$ = "fct(4)": r1$ = "4!"
                                            CASE 4
                                                q1$ = "!4": r1$ = "!4"
                                        END SELECT
                                        SELECT CASE q2
                                            CASE 1
                                                q2$ = "4": r2$ = "4"
                                            CASE 2
                                                q2$ = "sqr(4)": r2$ = CHR$(251) + "4"
                                            CASE 3
                                                q2$ = "fct(4)": r2$ = "4!"
                                            CASE 4
                                                q2$ = "!4": r2$ = "!4"
                                        END SELECT
                                        SELECT CASE q3
                                            CASE 1
                                                q3$ = "4": r3$ = "4"
                                            CASE 2
                                                q3$ = "sqr(4)": r3$ = CHR$(251) + "4"
                                            CASE 3
                                                q3$ = "fct(4)": r3$ = "4!"
                                            CASE 4
                                                q3$ = "!4": r3$ = "!4"
                                        END SELECT
                                        SELECT CASE q4
                                            CASE 1
                                                q4$ = "4": r4$ = "4"
                                            CASE 2
                                                q4$ = "sqr(4)": r4$ = CHR$(251) + "4"
                                            CASE 3
                                                q4$ = "fct(4)": r4$ = "4!"
                                            CASE 4
                                                q4$ = "!4": r4$ = "!4"
                                        END SELECT
                                        Out2 = q1$ + MID$(a$, l, 1) + q2$ + MID$(a$, m, 1) + q3$ + MID$(a$, N, 1) + q4$
                                        Out3 = r1$ + MID$(a$, l, 1) + r2$ + MID$(a$, m, 1) + r3$ + MID$(a$, N, 1) + r4$
                                        CALL Equate: IF Counter = Num.Fours THEN GOTO End.Program
                                    NEXT
                                NEXT
                            NEXT
                        NEXT
                    CASE 2 ' (4/4)+4/4
                        FOR q1 = 1 TO 4
                            FOR q2 = 1 TO 4
                                FOR q3 = 1 TO 4
                                    FOR q4 = 1 TO 4
                                        SELECT CASE q1
                                            CASE 1
                                                q1$ = "4": r1$ = "4"
                                            CASE 2
                                                q1$ = "sqr(4)": r1$ = CHR$(251) + "4"
                                            CASE 3
                                                q1$ = "fct(4)": r1$ = "4!"
                                            CASE 4
                                                q1$ = "!4": r1$ = "!4"
                                        END SELECT
                                        SELECT CASE q2
                                            CASE 1
                                                q2$ = "4": r2$ = "4"
                                            CASE 2
                                                q2$ = "sqr(4)": r2$ = CHR$(251) + "4"
                                            CASE 3
                                                q2$ = "fct(4)": r2$ = "4!"
                                            CASE 4
                                                q2$ = "!4": r2$ = "!4"
                                        END SELECT
                                        SELECT CASE q3
                                            CASE 1
                                                q3$ = "4": r3$ = "4"
                                            CASE 2
                                                q3$ = "sqr(4)": r3$ = CHR$(251) + "4"
                                            CASE 3
                                                q3$ = "fct(4)": r3$ = "4!"
                                            CASE 4
                                                q4$ = "!4": r4$ = "!4"
                                        END SELECT
                                        SELECT CASE q4
                                            CASE 1
                                                q4$ = "4": r4$ = "4"
                                            CASE 2
                                                q4$ = "sqr(4)": r4$ = CHR$(251) + "4"
                                            CASE 3
                                                q4$ = "fct(4)": r4$ = "4!"
                                            CASE 4
                                                q4$ = "!4": r4$ = "!4"
                                        END SELECT
                                        Out2 = "(" + q1$ + MID$(a$, l, 1) + q2$ + ")" + MID$(a$, m, 1) + q3$ + MID$(a$, N, 1) + q4$
                                        Out3 = "(" + r1$ + MID$(a$, l, 1) + r2$ + ")" + MID$(a$, m, 1) + r3$ + MID$(a$, N, 1) + r4$
                                        CALL Equate: IF Counter = Num.Fours THEN GOTO End.Program
                                    NEXT
                                NEXT
                            NEXT
                        NEXT
                    CASE 3 ' 4/(4/4)/4
                        FOR q1 = 1 TO 4
                            FOR q2 = 1 TO 4
                                FOR q3 = 1 TO 4
                                    FOR q4 = 1 TO 4
                                        SELECT CASE q1
                                            CASE 1
                                                q1$ = "4": r1$ = "4"
                                            CASE 2
                                                q1$ = "sqr(4)": r1$ = CHR$(251) + "4"
                                            CASE 3
                                                q1$ = "fct(4)": r1$ = "4!"
                                            CASE 4
                                                q1$ = "!4": r1$ = "!4"
                                        END SELECT
                                        SELECT CASE q2
                                            CASE 1
                                                q2$ = "4": r2$ = "4"
                                            CASE 2
                                                q2$ = "sqr(4)": r2$ = CHR$(251) + "4"
                                            CASE 3
                                                q2$ = "fct(4)": r2$ = "4!"
                                            CASE 4
                                                q2$ = "!4": r2$ = "!4"
                                        END SELECT
                                        SELECT CASE q3
                                            CASE 1
                                                q3$ = "4": r3$ = "4"
                                            CASE 2
                                                q3$ = "sqr(4)": r3$ = CHR$(251) + "4"
                                            CASE 3
                                                q3$ = "fct(4)": r3$ = "4!"
                                            CASE 4
                                                q3$ = "!4": r3$ = "!4"
                                        END SELECT
                                        SELECT CASE q4
                                            CASE 1
                                                q4$ = "4": r4$ = "4"
                                            CASE 2
                                                q4$ = "sqr(4)": r4$ = CHR$(251) + "4"
                                            CASE 3
                                                q4$ = "fct(4)": r4$ = "4!"
                                            CASE 4
                                                q4$ = "!4": r4$ = "!4"
                                        END SELECT
                                        Out2 = q1$ + MID$(a$, l, 1) + "(" + q2$ + MID$(a$, m, 1) + q3$ + ")" + MID$(a$, N, 1) + q4$
                                        Out3 = r1$ + MID$(a$, l, 1) + "(" + r2$ + MID$(a$, m, 1) + r3$ + ")" + MID$(a$, N, 1) + r4$
                                        CALL Equate: IF Counter = Num.Fours THEN GOTO End.Program
                                    NEXT
                                NEXT
                            NEXT
                        NEXT
                    CASE 4 ' 4/4/(4/4)
                        FOR q1 = 1 TO 4
                            FOR q2 = 1 TO 4
                                FOR q3 = 1 TO 4
                                    FOR q4 = 1 TO 4
                                        SELECT CASE q1
                                            CASE 1
                                                q1$ = "4": r1$ = "4"
                                            CASE 2
                                                q1$ = "sqr(4)": r1$ = CHR$(251) + "4"
                                            CASE 3
                                                q1$ = "fct(4)": r1$ = "4!"
                                            CASE 4
                                                q1$ = "!4": r1$ = "!4"
                                        END SELECT
                                        SELECT CASE q2
                                            CASE 1
                                                q2$ = "4": r2$ = "4"
                                            CASE 2
                                                q2$ = "sqr(4)": r2$ = CHR$(251) + "4"
                                            CASE 3
                                                q2$ = "fct(4)": r2$ = "4!"
                                            CASE 4
                                                q2$ = "!4": r2$ = "!4"
                                        END SELECT
                                        SELECT CASE q3
                                            CASE 1
                                                q3$ = "4": r3$ = "4"
                                            CASE 2
                                                q3$ = "sqr(4)": r3$ = CHR$(251) + "4"
                                            CASE 3
                                                q3$ = "fct(4)": r3$ = "4!"
                                            CASE 4
                                                q3$ = "!4": r3$ = "!4"
                                        END SELECT
                                        SELECT CASE q4
                                            CASE 1
                                                q4$ = "4": r4$ = "4"
                                            CASE 2
                                                q4$ = "sqr(4)": r4$ = CHR$(251) + "4"
                                            CASE 3
                                                q4$ = "fct(4)": r4$ = "4!"
                                            CASE 4
                                                q4$ = "!4": r4$ = "!4"
                                        END SELECT
                                        Out2 = q1$ + MID$(a$, l, 1) + q2$ + MID$(a$, m, 1) + "(" + q3$ + MID$(a$, N, 1) + q4$ + ")"
                                        Out3 = r1$ + MID$(a$, l, 1) + r2$ + MID$(a$, m, 1) + "(" + r3$ + MID$(a$, N, 1) + r4$ + ")"
                                        CALL Equate: IF Counter = Num.Fours THEN GOTO End.Program
                                    NEXT
                                NEXT
                            NEXT
                        NEXT
                    CASE 5 ' (4/4)/(4/4)
                        FOR q1 = 1 TO 4
                            FOR q2 = 1 TO 4
                                FOR q3 = 1 TO 4
                                    FOR q4 = 1 TO 4
                                        SELECT CASE q1
                                            CASE 1
                                                q1$ = "4": r1$ = "4"
                                            CASE 2
                                                q1$ = "sqr(4)": r1$ = CHR$(251) + "4"
                                            CASE 3
                                                q1$ = "fct(4)": r1$ = "4!"
                                            CASE 4
                                                q1$ = "!4": r1$ = "!4"
                                        END SELECT
                                        SELECT CASE q2
                                            CASE 1
                                                q2$ = "4": r2$ = "4"
                                            CASE 2
                                                q2$ = "sqr(4)": r2$ = CHR$(251) + "4"
                                            CASE 3
                                                q2$ = "fct(4)": r2$ = "4!"
                                            CASE 4
                                                q2$ = "!4": r2$ = "!4"
                                        END SELECT
                                        SELECT CASE q3
                                            CASE 1
                                                q3$ = "4": r3$ = "4"
                                            CASE 2
                                                q3$ = "sqr(4)": r3$ = CHR$(251) + "4"
                                            CASE 3
                                                q3$ = "fct(4)": r3$ = "4!"
                                            CASE 4
                                                q3$ = "!4": r3$ = "!4"
                                        END SELECT
                                        SELECT CASE q4
                                            CASE 1
                                                q4$ = "4": r4$ = "4"
                                            CASE 2
                                                q4$ = "sqr(4)": r4$ = CHR$(251) + "4"
                                            CASE 3
                                                q4$ = "fct(4)": r4$ = "4!"
                                            CASE 4
                                                q4$ = "!4": r4$ = "!4"
                                        END SELECT
                                        Out2 = "(" + q1$ + MID$(a$, l, 1) + q2$ + ")" + MID$(a$, m, 1) + "(" + q3$ + MID$(a$, N, 1) + q4$ + ")"
                                        Out3 = "(" + r1$ + MID$(a$, l, 1) + r2$ + ")" + MID$(a$, m, 1) + "(" + r3$ + MID$(a$, N, 1) + r4$ + ")"
                                        CALL Equate: IF Counter = Num.Fours THEN GOTO End.Program
                                    NEXT
                                NEXT
                            NEXT
                        NEXT
                    CASE 6 ' (4/4/4)/4
                        FOR q1 = 1 TO 4
                            FOR q2 = 1 TO 4
                                FOR q3 = 1 TO 4
                                    FOR q4 = 1 TO 4
                                        SELECT CASE q1
                                            CASE 1
                                                q1$ = "4": r1$ = "4"
                                            CASE 2
                                                q1$ = "sqr(4)": r1$ = CHR$(251) + "4"
                                            CASE 3
                                                q1$ = "fct(4)": r1$ = "4!"
                                            CASE 4
                                                q1$ = "!4": r1$ = "!4"
                                        END SELECT
                                        SELECT CASE q2
                                            CASE 1
                                                q2$ = "4": r2$ = "4"
                                            CASE 2
                                                q2$ = "sqr(4)": r2$ = CHR$(251) + "4"
                                            CASE 3
                                                q2$ = "fct(4)": r2$ = "4!"
                                            CASE 4
                                                q2$ = "!4": r2$ = "!4"
                                        END SELECT
                                        SELECT CASE q3
                                            CASE 1
                                                q3$ = "4": r3$ = "4"
                                            CASE 2
                                                q3$ = "sqr(4)": r3$ = CHR$(251) + "4"
                                            CASE 3
                                                q3$ = "fct(4)": r3$ = "4!"
                                            CASE 4
                                                q4$ = "!4": r4$ = "!4"
                                        END SELECT
                                        SELECT CASE q4
                                            CASE 1
                                                q4$ = "4": r4$ = "4"
                                            CASE 2
                                                q4$ = "sqr(4)": r4$ = CHR$(251) + "4"
                                            CASE 3
                                                q4$ = "fct(4)": r4$ = "4!"
                                            CASE 4
                                                q4$ = "!4": r4$ = "!4"
                                        END SELECT
                                        Out2 = "(" + q1$ + MID$(a$, l, 1) + q2$ + MID$(a$, m, 1) + q3$ + ")" + MID$(a$, N, 1) + q4$
                                        Out3 = "(" + r1$ + MID$(a$, l, 1) + r2$ + MID$(a$, m, 1) + r3$ + ")" + MID$(a$, N, 1) + r4$
                                        CALL Equate: IF Counter = Num.Fours THEN GOTO End.Program
                                    NEXT
                                NEXT
                            NEXT
                        NEXT
                    CASE 7 ' 4/(4/4/4)
                        FOR q1 = 1 TO 4
                            FOR q2 = 1 TO 4
                                FOR q3 = 1 TO 4
                                    FOR q4 = 1 TO 4
                                        SELECT CASE q1
                                            CASE 1
                                                q1$ = "4": r1$ = "4"
                                            CASE 2
                                                q1$ = "sqr(4)": r1$ = CHR$(251) + "4"
                                            CASE 3
                                                q1$ = "fct(4)": r1$ = "4!"
                                            CASE 4
                                                q1$ = "!4": r1$ = "!4"
                                        END SELECT
                                        SELECT CASE q2
                                            CASE 1
                                                q2$ = "4": r2$ = "4"
                                            CASE 2
                                                q2$ = "sqr(4)": r2$ = CHR$(251) + "4"
                                            CASE 3
                                                q2$ = "fct(4)": r2$ = "4!"
                                            CASE 4
                                                q2$ = "!4": r2$ = "!4"
                                        END SELECT
                                        SELECT CASE q3
                                            CASE 1
                                                q3$ = "4": r3$ = "4"
                                            CASE 2
                                                q3$ = "sqr(4)": r3$ = CHR$(251) + "4"
                                            CASE 3
                                                q3$ = "fct(4)": r3$ = "4!"
                                            CASE 4
                                                q3$ = "!4": r3$ = "!4"
                                        END SELECT
                                        SELECT CASE q4
                                            CASE 1
                                                q4$ = "4": r4$ = "4"
                                            CASE 2
                                                q4$ = "sqr(4)": r4$ = CHR$(251) + "4"
                                            CASE 3
                                                q4$ = "fct(4)": r4$ = "4!"
                                            CASE 4
                                                q4$ = "!4": r4$ = "!4"
                                        END SELECT
                                        Out2 = q1$ + MID$(a$, l, 1) + "(" + q2$ + MID$(a$, m, 1) + q3$ + MID$(a$, N, 1) + q4$ + ")"
                                        Out3 = r1$ + MID$(a$, l, 1) + "(" + r2$ + MID$(a$, m, 1) + r3$ + MID$(a$, N, 1) + r4$ + ")"
                                        CALL Equate: IF Counter = Num.Fours THEN GOTO End.Program
                                    NEXT
                                NEXT
                            NEXT
                        NEXT
                END SELECT
            NEXT
        NEXT
    NEXT
NEXT
End.Program:
OPEN "fours.txt" FOR OUTPUT AS #1
FOR l = 1 TO Num.Fours
    x$ = RTRIM$(D(l))
    IF x$ = "" THEN
        Num.Found = Num.Found + 1
        PRINT #1, x$; "="; l; "("; MID$(STR$(Num.Found), 2); ")"
    ELSE
        PRINT #1, x$; "="; l
    END IF
NEXT
CLOSE
PRINT
COLOR 14, 0
PRINT "Calculations complete:"; Solutions
IF Debug THEN
    PRINT "Errors trapped: "; Num.Errors
    IF Num.Found = 0 THEN
        PRINT "All solutions found."
    ELSE
        PRINT "Solutions not found:"; Num.Found
    END IF
END IF
PRINT "Solutions written to fours.txt"
COLOR 7, 0
END

Error.Routine:
' illegal function call
IF ERR = 5 THEN
    Num.Errors = Num.Errors + 1
    RESUME NEXT
END IF
' overflow
IF ERR = 6 THEN
    Num.Errors = Num.Errors + 1
    RESUME NEXT
END IF
' division by zero
IF ERR = 11 THEN
    Num.Errors = Num.Errors + 1
    RESUME NEXT
END IF
PRINT "Fatal error "; ERR
END

' routine accepts an operation and performs on two values
SUB Arith (Token.Parsed$, Temp#, Temp2#)
    ON ERROR GOTO Error.Routine
    SELECT CASE Token.Parsed$
        CASE "-"
            Temp# = Temp# - Temp2#
        CASE "+"
            Temp# = Temp# + Temp2#
        CASE "/"
            Temp# = Temp# / Temp2#
        CASE "*"
            Temp# = Temp# * Temp2#
        CASE "^"
            Temp# = Temp# ^ Temp2#
    END SELECT
END SUB

' entry to expression parser
SUB Equate
    ON ERROR GOTO Error.Routine
    Out2 = UCASE$(Out2)
    Solutions = Solutions + 1
    Temp# = False ' reset result
    Token.Index = 1 ' reset pointer to expression token
    CALL Get.Token ' read next token
    CALL Parse1(Temp#) ' entry to parse the expression
    IF INT(Temp#) = Temp# THEN
        IF Temp# >= 1 AND Temp# <= Num.Fours THEN
            IF RTRIM$(D(Temp#)) = Nul THEN
                D(Temp#) = Out3
                Counter = Counter + 1
                PRINT Temp#;
            END IF
        END IF
    END IF
END SUB

SUB Get.Token
    ON ERROR GOTO Error.Routine
    Strng = Nul ' reset token
    Token = 0 ' reset token type
    IF Token.Index > LEN(Out2) THEN ' compare pointer at end of expression
        EXIT SUB
    END IF
    ' locate expression symbol
    IF INSTR(Token.List$, MID$(Out2, Token.Index, 1)) THEN
        Token = 1 ' store token type
        Strng = MID$(Out2, Token.Index, 1) ' store token
        Token.Index = Token.Index + 1 ' increment pointer
        EXIT SUB
    END IF
    ' locate expression is number
    IF MID$(Out2, Token.Index, 1) >= "0" AND MID$(Out2, Token.Index, 1) <= "9" THEN
        ' increment token until token is other than number
        WHILE INSTR(Token.List$, MID$(Out2, Token.Index, 1)) = False
            Strng = Strng + MID$(Out2, Token.Index, 1)
            Token.Index = Token.Index + 1
        WEND
        Token = 2 ' store token type
        EXIT SUB
    END IF
    ' locate expression is alphabetic
    IF MID$(Out2, Token.Index, 1) >= "A" AND MID$(Out2, Token.Index, 1) <= "Z" THEN
        ' increment token until token is other than alphabetic
        WHILE INSTR(Token.List$, MID$(Out2, Token.Index, 1)) = False
            Strng = Strng + MID$(Out2, Token.Index, 1)
            Token.Index = Token.Index + 1
        WEND
        Token = 3 ' store token type
        EXIT SUB
    END IF
END SUB

' addition/subtraction parser
SUB Parse1 (Temp#)
    ON ERROR GOTO Error.Routine
    CALL Parse2(Temp#) ' get next operator precedence
    Token.Parsed$ = Strng ' store token
    ' process token
    WHILE Token.Parsed$ = "+" OR Token.Parsed$ = "-"
        CALL Get.Token ' read next token
        CALL Parse2(Temp2#) ' get next operator
        CALL Arith(Token.Parsed$, Temp#, Temp2#) ' calculate expression
        Token.Parsed$ = Strng ' store next token
    WEND
END SUB

' multiplication/division parser
SUB Parse2 (Temp#)
    ON ERROR GOTO Error.Routine
    CALL Parse3(Temp#) ' get next operator precedence
    Token.Parsed$ = Strng ' store token
    ' process token
    WHILE Token.Parsed$ = "*" OR Token.Parsed$ = "/"
        CALL Get.Token ' read next token
        CALL Parse3(Temp2#) ' get next operator
        CALL Arith(Token.Parsed$, Temp#, Temp2#) ' calculate expression
        Token.Parsed$ = Strng ' store next token
    WEND
END SUB

' power parser
SUB Parse3 (Temp#)
    ON ERROR GOTO Error.Routine
    CALL Parse3a(Temp#) ' get next operator precedence
    Token.Parsed$ = Strng ' store token
    ' process token
    WHILE Token.Parsed$ = "^"
        CALL Get.Token ' read next token
        CALL Parse3a(Temp2#) ' get next operator
        CALL Arith(Token.Parsed$, Temp#, Temp2#) ' calculate expression
        Token.Parsed$ = Strng ' store next token
    WEND
END SUB

' negate parser
SUB Parse3a (Temp#)
    ON ERROR GOTO Error.Routine
    CALL Parse4(Temp#) ' get next operator precedence
    Token.Parsed$ = Strng ' store token
    ' process token
    WHILE Token.Parsed$ = "!"
        CALL Get.Token ' read next token
        CALL Parse4(Temp2#) ' get next operator
        Temp# = NOT (Temp2#)
        Token.Parsed$ = Strng ' store next token
    WEND
END SUB

SUB Parse4 (Temp#)
    ON ERROR GOTO Error.Routine
    SELECT CASE Token ' determine token type
        CASE 1 ' token is symbol
            SELECT CASE Strng ' determine token
                CASE "(" ' calculate opening parenthesis
                    CALL Get.Token ' read next token value inside parenthesis
                    DO ' calculate value
                        CALL Parse1(Temp#) ' call parse entry
                    LOOP UNTIL Strng = ")" OR Token = 0 ' check closing parenthesis
                    CALL Get.Token ' read next token after parenthesis
                CASE ")" ' check token is closing parenthesis
                    CALL Get.Token ' read next token after parenthesis
                    EXIT SUB
            END SELECT
        CASE 2 ' token is numeric value
            Temp# = VAL(Strng) ' calculate value
            CALL Get.Token ' read next token after number
        CASE 3 ' token type is alphabetic
            SELECT CASE Strng
                CASE "SQR" ' compare token
                    CALL Get.Token ' read next parenthesis
                    CALL Get.Token ' read next parse value
                    CALL Parse1(Temp#) ' recursively calculate imbedded value in expression
                    Temp# = SQR(Temp#) ' return token calculation
                CASE "FCT" ' calculate xth factorial
                    CALL Get.Token
                    CALL Get.Token
                    CALL Parse1(Temp#)
                    Factorial# = 1 ' reset factorial
                    Factorial.Count# = INT(Temp#)
                    IF Factorial.Count# >= 1 THEN ' check xth value
                        FOR Factorial.Count# = 1 TO Temp# ' compute xth value
                            Factorial# = Factorial# * Factorial.Count# ' compute value
                        NEXT
                    END IF
                    Temp# = Factorial# ' assign result
            END SELECT
            CALL Get.Token ' read next token
    END SELECT
END SUB
dndbbs project:

Links to my MUD: (strictly 16-bit); AKA XP:

Dndbbs executables
http://www.filegate.net/pdn/pdnbasic/dnd50a1e.zip

Dndbbs source
http://www.filegate.net/pdn/pdnbasic/dnd50a1s.zip

Dndbbs upgrade
http://www.filegate.net/pdn/pdnbasic/dnd50a1u.zip

DNDDOOR - https://bit.ly/EriksDNDDoor DUNGEON - https://bit.ly/EriksDungeon
Interpreter - https://bit.ly/EriksSICK Hex Editor - https://bit.ly/EriksHexEditor Utilities - https://bit.ly/EriksUtils
QB45 files: - https://bit.ly/EriksQB45 QB64shell - https://bit.ly/QB64shell Some old QB64 versions: - https://bit.ly/OldQB64
Reply