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

Merge pull request #478 from a740g/logical-operators

Logical Boolean operators
This commit is contained in:
Samuel Gomes 2024-04-10 23:03:36 +05:30 committed by GitHub
commit 9ec149b2a1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 142 additions and 22 deletions

View file

@ -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
@ -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")
@ -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----------------
@ -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
@ -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
@ -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

View file

@ -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@"

View file

@ -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

View file

@ -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.