Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Logical Boolean operators #478

Merged
merged 6 commits into from
Apr 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 57 additions & 21 deletions source/qb64pe.bas
Original file line number Diff line number Diff line change
Expand Up @@ -1171,6 +1171,9 @@ HashAdd "AND", f, 0
HashAdd "OR", f, 0
HashAdd "XOR", f, 0
HashAdd "MOD", f, 0
HashAdd "_NEGATE", f, 0
HashAdd "_ANDALSO", f, 0
HashAdd "_ORELSE", f, 0

f = HASHFLAG_RESERVED + HASHFLAG_CUSTOMSYNTAX
HashAdd "LIST", f, 0
Expand Down Expand Up @@ -1548,6 +1551,11 @@ IF qb64prefix_set THEN

f = HASHFLAG_RESERVED + HASHFLAG_CUSTOMSYNTAX
HashAdd "EXPLICIT", f, 0

f = HASHFLAG_OPERATOR + HASHFLAG_RESERVED
HashAdd "NEGATE", f, 0
HashAdd "ANDALSO", f, 0
HashAdd "ORELSE", f, 0
END IF

DIM SHARED GlobTxtBuf: GlobTxtBuf = OpenBuffer%("O", tmpdir$ + "global.txt")
Expand Down Expand Up @@ -18828,6 +18836,12 @@ FUNCTION fixoperationorder$ (savea$)
IF temp1$ = "XOR" AND temp2$ = "XOR" THEN Give_Error "Error: XOR XOR": EXIT FUNCTION
IF temp1$ = "IMP" AND temp2$ = "IMP" THEN Give_Error "Error: IMP IMP": EXIT FUNCTION
IF temp1$ = "EQV" AND temp2$ = "EQV" THEN Give_Error "Error: EQV EQV": EXIT FUNCTION
IF temp1$ = "_ANDALSO" AND temp2$ = "_ANDALSO" THEN Give_Error "Error: _ANDALSO _ANDALSO": EXIT FUNCTION
IF temp1$ = "_ORELSE" AND temp2$ = "_ORELSE" THEN Give_Error "Error: _ORELSE _ORELSE": EXIT FUNCTION
IF qb64prefix_set THEN
IF temp1$ = "ANDALSO" AND temp2$ = "ANDALSO" THEN Give_Error "Error: ANDALSO ANDALSO": EXIT FUNCTION
IF temp1$ = "ORELSE" AND temp2$ = "ORELSE" THEN Give_Error "Error: ORELSE ORELSE": EXIT FUNCTION
END IF
NEXT

'----------------A. 'Quick' mismatched brackets check----------------
Expand Down Expand Up @@ -19784,11 +19798,14 @@ END SUB
FUNCTION isoperator (a2$)
a$ = UCASE$(a2$)
l = 0
l = l + 1: IF a$ = "_ORELSE" OR (qb64prefix_set AND a$ = "ORELSE") THEN GOTO opfound
l = l + 1: IF a$ = "_ANDALSO" OR (qb64prefix_set AND a$ = "ANDALSO") THEN GOTO opfound
l = l + 1: IF a$ = "IMP" THEN GOTO opfound
l = l + 1: IF a$ = "EQV" THEN GOTO opfound
l = l + 1: IF a$ = "XOR" THEN GOTO opfound
l = l + 1: IF a$ = "OR" THEN GOTO opfound
l = l + 1: IF a$ = "AND" THEN GOTO opfound
l = l + 1: IF a$ = "_NEGATE" OR (qb64prefix_set AND a$ = "NEGATE") THEN GOTO opfound
l = l + 1: IF a$ = "NOT" THEN GOTO opfound
l = l + 1
IF a$ = "=" THEN GOTO opfound
Expand Down Expand Up @@ -20883,9 +20900,12 @@ FUNCTION operatorusage (operator$, typ AS LONG, info$, lhs AS LONG, rhs AS LONG,
IF operator$ = "XOR" THEN info$ = "^": operatorusage = 1: EXIT FUNCTION
IF operator$ = "OR" THEN info$ = "|": operatorusage = 1: EXIT FUNCTION
IF operator$ = "AND" THEN info$ = "&": operatorusage = 1: EXIT FUNCTION
IF operator$ = "_ORELSE" OR (qb64prefix_set AND operator$ = "ORELSE") THEN info$ = "||": operatorusage = 3: EXIT FUNCTION
IF operator$ = "_ANDALSO" OR (qb64prefix_set AND operator$ = "ANDALSO") THEN info$ = "&&": operatorusage = 3: EXIT FUNCTION

lhs = 7
IF operator$ = "NOT" THEN info$ = "~": operatorusage = 5: EXIT FUNCTION
IF operator$ = "_NEGATE" OR (qb64prefix_set AND operator$ = "NEGATE") THEN info$ = "!": operatorusage = 5: EXIT FUNCTION

IF Debug THEN PRINT #9, "INVALID NUMBERIC OPERATOR!": END

Expand Down Expand Up @@ -23681,27 +23701,43 @@ FUNCTION SCase2$ (t$)
IF ideautolayoutkwcapitals THEN
SCase2$ = UCASE$(t$)
ELSE
newWord = -1
temp$ = ""
FOR i = 1 TO LEN(t$)
s$ = MID$(t$, i, 1)
IF newWord THEN
IF s$ = "_" OR s$ = separator$ THEN
temp$ = temp$ + s$
ELSE
temp$ = temp$ + UCASE$(s$)
newWord = 0
END IF
ELSE
IF s$ = separator$ THEN
temp$ = temp$ + separator$
newWord = -1
ELSE
temp$ = temp$ + LCASE$(s$)
END IF
END IF
NEXT
SCase2$ = temp$
SELECT CASE t$
CASE "_ANDALSO"
SCase2$ = "_AndAlso"

CASE "ANDALSO"
SCase2$ = "AndAlso"

CASE "_ORELSE"
SCase2$ = "_OrElse"

CASE "ORELSE"
SCase2$ = "OrElse"

CASE ELSE
newWord = -1
temp$ = ""
FOR i = 1 TO LEN(t$)
s$ = MID$(t$, i, 1)
IF newWord THEN
IF s$ = "_" OR s$ = separator$ THEN
temp$ = temp$ + s$
ELSE
temp$ = temp$ + UCASE$(s$)
newWord = 0
END IF
ELSE
IF s$ = separator$ THEN
temp$ = temp$ + separator$
newWord = -1
ELSE
temp$ = temp$ + LCASE$(s$)
END IF
END IF
NEXT
SCase2$ = temp$

END SELECT
END IF
END FUNCTION

Expand Down
2 changes: 1 addition & 1 deletion source/subs_functions/syntax_highlighter_list.bas
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ listOfKeywords$ = listOfKeywords$ + "_GLCOPYTEXSUBIMAGE2D@_GLCULLFACE@_GLDELETEL
listOfKeywords$ = listOfKeywords$ + "_GLPOPATTRIB@_GLPOPCLIENTATTRIB@_GLPOPMATRIX@_GLPOPNAME@_GLPRIORITIZETEXTURES@_GLPUSHATTRIB@_GLPUSHCLIENTATTRIB@_GLPUSHMATRIX@_GLPUSHNAME@_GLRASTERPOS2D@_GLRASTERPOS2DV@_GLRASTERPOS2F@_GLRASTERPOS2FV@_GLRASTERPOS2I@_GLRASTERPOS2IV@_GLRASTERPOS2S@_GLRASTERPOS2SV@_GLRASTERPOS3D@_GLRASTERPOS3DV@_GLRASTERPOS3F@_GLRASTERPOS3FV@_GLRASTERPOS3I@_GLRASTERPOS3IV@_GLRASTERPOS3S@_GLRASTERPOS3SV@_GLRASTERPOS4D@_GLRASTERPOS4DV@_GLRASTERPOS4F@_GLRASTERPOS4FV@_GLRASTERPOS4I@_GLRASTERPOS4IV@_GLRASTERPOS4S@_GLRASTERPOS4SV@_GLREADBUFFER@_GLREADPIXELS@_GLRECTD@_GLRECTDV@_GLRECTF@_GLRECTFV@_GLRECTI@_GLRECTIV@_GLRECTS@_GLRECTSV@_GLRENDERMODE@_GLROTATED@_GLROTATEF@_GLSCALED@_GLSCALEF@_GLSCISSOR@_GLSELECTBUFFER@_GLSHADEMODEL@_GLSTENCILFUNC@_GLSTENCILMASK@_GLSTENCILOP@_GLTEXCOORD1D@_GLTEXCOORD1DV@_GLTEXCOORD1F@_GLTEXCOORD1FV@_GLTEXCOORD1I@_GLTEXCOORD1IV@_GLTEXCOORD1S@_GLTEXCOORD1SV@_GLTEXCOORD2D@_GLTEXCOORD2DV@_GLTEXCOORD2F@_GLTEXCOORD2FV@_GLTEXCOORD2I@_GLTEXCOORD2IV@_GLTEXCOORD2S@_GLTEXCOORD2SV@_GLTEXCOORD3D@_GLTEXCOORD3DV@_GLTEXCOORD3F@_GLTEXCOORD3FV@_GLTEXCOORD3I@_GLTEXCOORD3IV@_GLTEXCOORD3S@_GLTEXCOORD3SV@_GLTEXCOORD4D@_GLTEXCOORD4DV@_GLTEXCOORD4F@_GLTEXCOORD4FV@_GLTEXCOORD4I@_GLTEXCOORD4IV@_GLTEXCOORD4S@_GLTEXCOORD4SV@_GLTEXCOORDPOINTER@_GLTEXENVF@_GLTEXENVFV@_GLTEXENVI@_GLTEXENVIV@_GLTEXGEND@_GLTEXGENDV@_GLTEXGENF@_GLTEXGENFV@_GLTEXGENI@_GLTEXGENIV@_GLTEXIMAGE1D@_GLTEXIMAGE2D@_GLTEXPARAMETERF@_GLTEXPARAMETERFV@_GLTEXPARAMETERI@_GLTEXPARAMETERIV@_GLTEXSUBIMAGE1D@_GLTEXSUBIMAGE2D@_GLTRANSLATED@_GLTRANSLATEF@_GLVERTEX2D@_GLVERTEX2DV@_GLVERTEX2F@_GLVERTEX2FV@_GLVERTEX2I@_GLVERTEX2IV@_GLVERTEX2S@_GLVERTEX2SV@_GLVERTEX3D@_GLVERTEX3DV@_GLVERTEX3F@_GLVERTEX3FV@_GLVERTEX3I@_GLVERTEX3IV@_GLVERTEX3S@_GLVERTEX3SV@_GLVERTEX4D@_GLVERTEX4DV@_GLVERTEX4F@_GLVERTEX4FV@_GLVERTEX4I@_GLVERTEX4IV@_GLVERTEX4S@_GLVERTEX4SV@_GLVERTEXPOINTER@_GLVIEWPORT@SMOOTH@STRETCH@_ANTICLOCKWISE@_BEHIND@_CLEAR@_FILLBACKGROUND@_GLUPERSPECTIVE@_HARDWARE@_HARDWARE1@_KEEPBACKGROUND@_NONE@_OFF@_ONLY@_ONLYBACKGROUND@_ONTOP@_SEAMLESS@_SMOOTH@_SMOOTHSHRUNK@_SMOOTHSTRETCHED@"
listOfKeywords$ = listOfKeywords$ + "_SOFTWARE@_SQUAREPIXELS@_STRETCH@_ALLOWFULLSCREEN@_ALL@_ECHO@_READFILE$@_WRITEFILE@_INSTRREV@_TRIM$@_ACCEPTFILEDROP@_FINISHDROP@_TOTALDROPPEDFILES@_DROPPEDFILE@_DROPPEDFILE$@_SHR@_SHL@_ROR@_ROL@"
listOfKeywords$ = listOfKeywords$ + "_ADLER32@_CRC32@_MD5$@_DEFLATE$@_INFLATE$@_READBIT@_RESETBIT@_SETBIT@_TOGGLEBIT@$INCLUDEONCE@$ASSERTS@CONSOLE@_ASSERT@_CAPSLOCK@_NUMLOCK@_SCROLLLOCK@_TOGGLE@_CONSOLEFONT@_CONSOLECURSOR@_CONSOLEINPUT@_CINP@$NOPREFIX@$COLOR@$DEBUG@$EMBED@_EMBEDDED$@_ENVIRONCOUNT@$UNSTABLE@$MIDISOUNDFONT@"
listOfKeywords$ = listOfKeywords$ + "_NOTIFYPOPUP@_MESSAGEBOX@_INPUTBOX$@_SELECTFOLDERDIALOG$@_COLORCHOOSERDIALOG@_OPENFILEDIALOG$@_SAVEFILEDIALOG$@_SAVEIMAGE@_FILES$@_FULLPATH$@"
listOfKeywords$ = listOfKeywords$ + "_NOTIFYPOPUP@_MESSAGEBOX@_INPUTBOX$@_SELECTFOLDERDIALOG$@_COLORCHOOSERDIALOG@_OPENFILEDIALOG$@_SAVEFILEDIALOG$@_SAVEIMAGE@_FILES$@_FULLPATH$@_NEGATE@_ANDALSO@_ORELSE@"
listOfKeywords$ = listOfKeywords$ + "_STATUSCODE@_SNDNEW@_SCALEDWIDTH@_SCALEDHEIGHT@_UFONTHEIGHT@_UPRINTWIDTH@_ULINESPACING@_UPRINTSTRING@_UCHARPOS@"
65 changes: 65 additions & 0 deletions tests/compile_tests/bool_test/bool_test.bas
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
$CONSOLE:ONLY
_DEFINE A-Z AS LONG
OPTION _EXPLICIT

CONST A = -100
CONST B = -10
CONST D = 10
CONST E = 100

DIM c AS LONG

PRINT "Logical op test:"
PRINT

c = _NEGATE (_NEGATE (_NEGATE (_NEGATE c)))

IF _NEGATE GetValue(c) THEN
PRINT "_NEGATE: Test passed."
ELSE
PRINT "_NEGATE: Test failed."
END IF

IF GetValue(D) < 0 _ANDALSO GetValue(E) < 0 THEN
PRINT "_ANDALSO: Test failed."
ELSE
PRINT "_ANDALSO: Test passed."
END IF

IF GetValue(A) < 0 _ORELSE GetValue(B) < 0 THEN
PRINT "_ORELSE: Test passed."
ELSE
PRINT "_ORELSE: Test failed."
END IF


PRINT
PRINT "Bitwise op test:"
PRINT

c = NOT (NOT (NOT (NOT c)))

IF NOT GetValue(c) THEN
PRINT "NOT: Test passed."
ELSE
PRINT "NOT: Test failed."
END IF

IF GetValue(D) < 0 AND GetValue(E) < 0 THEN
PRINT "AND: Test failed."
ELSE
PRINT "AND: Test passed."
END IF

IF GetValue(A) < 0 OR GetValue(B) < 0 THEN
PRINT "OR: Test passed."
ELSE
PRINT "OR: Test failed."
END IF

SYSTEM

FUNCTION GetValue& (x AS LONG)
PRINT "Function called for value:"; x
GetValue = x
END FUNCTION
19 changes: 19 additions & 0 deletions tests/compile_tests/bool_test/bool_test.output
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
Logical op test:

Function called for value: 0
_NEGATE: Test passed.
Function called for value: 10
_ANDALSO: Test passed.
Function called for value:-100
_ORELSE: Test passed.

Bitwise op test:

Function called for value: 0
NOT: Test passed.
Function called for value: 10
Function called for value: 100
AND: Test passed.
Function called for value:-100
Function called for value:-10
OR: Test passed.