1
1
Fork 0
mirror of https://github.com/QB64-Phoenix-Edition/QB64pe.git synced 2024-09-20 05:34:47 +00:00

Merge pull request #452 from mkilgore/fix-math-eval

Fix Math Evaluator
This commit is contained in:
Matt Kilgore 2024-02-13 23:56:00 -05:00 committed by GitHub
commit 5688b1c89e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 17 additions and 7 deletions

View file

@ -5511,15 +5511,20 @@ FUNCTION ide2 (ignore)
IF LEN(retval$) THEN IF LEN(retval$) THEN
Dim num As ParseNum Dim num As ParseNum
mathEvalExpr$ = retval$ mathEvalExpr$ = retval$
retval$ = lineformat(retval$)
Error_Happened = 0
ev0$ = Evaluate_Expression$(retval$, num) ev0$ = Evaluate_Expression$(retval$, num)
ev$ = ev0$ ev$ = ev0$
mathEvalError%% = INSTR(ev$, "ERROR") > 0 mathEvalError%% = INSTR(ev$, "ERROR") > 0
IF mathEvalError%% = 0 AND mathEvalHEX%% THEN ev$ = "&H" + HEX$(VAL(ev$)) IF mathEvalError%% = 0 AND mathEvalHEX%% THEN ev$ = "&H" + HEX$(num.ui)
DO DO
b1$ = "#Insert;" b1$ = "#Insert;"
IF mathEvalHEX%% THEN b2$ = "#Decimal;" ELSE b2$ = "#HEX$;" IF mathEvalHEX%% THEN b2$ = "#Decimal;" ELSE b2$ = "#HEX$;"
IF mathEvalError%% = 0 AND mathEvalComment%% THEN IF mathEvalError%% = 0 AND mathEvalComment%% THEN
mathMsg$ = ev$ + " '" + retval$ mathMsg$ = ev$ + " '" + mathEvalExpr$
b3$ = "#Uncomment;" b3$ = "#Uncomment;"
ELSE ELSE
mathMsg$ = ev$ mathMsg$ = ev$
@ -5534,7 +5539,7 @@ FUNCTION ide2 (ignore)
EXIT DO EXIT DO
CASE 2 CASE 2
mathEvalHEX%% = NOT mathEvalHEX%% mathEvalHEX%% = NOT mathEvalHEX%%
IF mathEvalHEX%% THEN ev$ = "&H" + HEX$(VAL(ev$)) ELSE ev$ = ev0$ IF mathEvalHEX%% THEN ev$ = "&H" + HEX$(num.ui) ELSE ev$ = ev0$
CASE 3 CASE 3
mathEvalComment%% = NOT mathEvalComment%% mathEvalComment%% = NOT mathEvalComment%%
END SELECT END SELECT

View file

@ -590,11 +590,11 @@ FUNCTION Factor&(exp$, state AS ParserState)
IF Unary&(exp$, state) = 0 THEN FixupErrorMessage state, "*": EXIT FUNCTION IF Unary&(exp$, state) = 0 THEN FixupErrorMessage state, "*": EXIT FUNCTION
IF (num.typ AND ISFLOAT) OR (state.num.typ AND ISFLOAT) THEN IF (num.typ AND ISFLOAT) OR (state.num.typ AND ISFLOAT) THEN
num.f = num.f * state.num.f ParseNumSetF num, FLOATTYPE - ISPOINTER, num.f * state.num.f
num.i = num.f ELSEIF (num.typ AND ISUNSIGNED) OR (state.num.typ AND ISUNSIGNED) THEN
ParseNumSetUI num, UINTEGER64TYPE - ISPOINTER, num.ui * state.num.ui
ELSE ELSE
num.i = num.i * state.num.i ParseNumSetI num, INTEGER64TYPE - ISPOINTER, num.i * state.num.i
num.f = num.i
END IF END IF
ELSEIF ele$ = "/" THEN ELSEIF ele$ = "/" THEN
ele$ = getnextelement$(exp$, state.index, state.strIndex) ele$ = getnextelement$(exp$, state.index, state.strIndex)

View file

@ -45,6 +45,8 @@ CONST const__str2 = "foobar" + "foobar2"
CONST const__str3 = const__str + const__str2 CONST const__str3 = const__str + const__str2
CONST const__str4 = (const__str + (const__str2)) CONST const__str4 = (const__str + (const__str2))
CONST const__unsignedint = 2~&& * 5~&&
PRINT const__OR PRINT const__OR
PRINT const__AND PRINT const__AND
PRINT const__NOT PRINT const__NOT
@ -87,4 +89,6 @@ PRINT const__str2
PRINT const__str3 PRINT const__str3
PRINT const__str4 PRINT const__str4
PRINT const__unsignedint
SYSTEM SYSTEM

View file

@ -33,3 +33,4 @@ foobar
foobarfoobar2 foobarfoobar2
foobarfoobarfoobar2 foobarfoobarfoobar2
foobarfoobarfoobar2 foobarfoobarfoobar2
10