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:
commit
9ec149b2a1
4 changed files with 142 additions and 22 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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
tests/compile_tests/bool_test/bool_test.bas
Normal file
65
tests/compile_tests/bool_test/bool_test.bas
Normal 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
|
19
tests/compile_tests/bool_test/bool_test.output
Normal file
19
tests/compile_tests/bool_test/bool_test.output
Normal 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.
|
Loading…
Reference in a new issue