neovim/runtime/syntax/freebasic.vim

675 lines
26 KiB
VimL

" Vim syntax file
" Language: FreeBASIC
" Maintainer: Doug Kearns <dougkearns@gmail.com>
" Previous Maintainer: Mark Manning <markem@sim1.us>
" Last Change: 2023 Aug 14
"
" Description:
"
" Based originally on the work done by Allan Kelly <Allan.Kelly@ed.ac.uk>
" Updated by Mark Manning <markem@sim1.us>
" Applied FreeBASIC support to the already excellent support
" for standard basic syntax (like QB).
"
" First version based on Micro$soft QBASIC circa
" 1989, as documented in 'Learn BASIC Now' by
" Halvorson&Rygmyr. Microsoft Press 1989. This syntax file
" not a complete implementation yet. Send suggestions to
" the maintainer.
"
" TODO: split this into separate dialect-based files, possibly with a common base
"
" Quit when a (custom) syntax file was already loaded (Taken from c.vim)
"
if exists("b:current_syntax")
finish
endif
"
" Dialect detection
"
let s:lang = freebasic#GetDialect()
"
" Whitespace Errors
"
if exists("freebasic_space_errors")
if !exists("freebasic_no_trail_space_error")
syn match freebasicSpaceError display excludenl "\s\+$"
endif
if !exists("freebasic_no_tab_space_error")
syn match freebasicSpaceError display " \+\t"me=e-1
endif
endif
"
" Be sure to turn on the "case ignore" since current versions
" of freebasic support both upper as well as lowercase
" letters. - MEM 10/1/2006
"
syn case ignore
"
" Do the Basic variables names first. This is because it
" is the most inclusive of the tests. Later on we change
" this so the identifiers are split up into the various
" types of identifiers like functions, basic commands and
" such. MEM 9/9/2006
"
if s:lang =~# '\<\%(qb\|fblite\)\>'
syn iskeyword @,48-57,_,192-255,.
syn match freebasicIdentifier "\<\h\%(\w\|\.\)*\>"
syn match freebasicGenericFunction "\<\h\%(\w\|\.\)*\>\ze\s*("
else
syn iskeyword @,48-57,_,192-255
syn match freebasicIdentifier "\<\h\w*\>"
syn match freebasicGenericFunction "\<\h\w*\>\ze\s*("
endif
"
" This list of keywords is taken directly from the FreeBASIC
" user's guide as presented by the FreeBASIC online site.
"
syn keyword freebasicArrays ERASE LBOUND PRESERVE REDIM UBOUND
" array.bi
syn keyword freebasicArrays ARRAYLEN ARRAYSIZE
if s:lang == "fb"
syn keyword freebasicArrays ArrayConstDescriptorPtr ArrayDescriptorPtr FBARRAY
endif
if s:lang == "qb"
syn keyword freebasicAsm __ASM
syn match freebasicAsm "\<end\s\+__asm\>"
else
syn keyword freebasicAsm ASM
syn match freebasicAsm "\<end\s\+asm\>"
endif
if s:lang == "qb"
syn keyword freebasicBitManipulation __BIT __BITRESET __BITSET __HIBYTE __HIWORD __LOBYTE __LOWORD
else
syn keyword freebasicBitManipulation BIT BITRESET BITSET HIBYTE HIWORD LOBYTE LOWORD
endif
if s:lang != "fb"
syn keyword freebasicCompilerSwitches DEFDBL DEFINT DEFLNG DEFSNG DEFSTR
endif
if s:lang == "qb"
syn keyword freebasicCompilerSwitches __DEFBYTE __DEFLONGINT __DEFSHORT __DEFUBYTE __DEFUINT __DEFULONGINT __DEFUSHORT
elseif s:lang == "fblite" || s:lang == "deprecated"
syn keyword freebasicCompilerSwitches DEFBYTE DEFLONGINT DEFSHORT DEFUBYTE DEFUINT DEFUILONGINT DEFUSHORT
endif
syn match freebasicCompilerSwitches "\<option\s\+\%(BASE\|BYVAL\|DYNAMIC\|ESCAPE\|EXPLICIT\|GOSUB\|NOGOSUB\)\>"
syn match freebasicCompilerSwitches "\<option\s\+\%(NOKEYWORD\|PRIVATE\|STATIC\)\>"
syn keyword freebasicData DATA READ RESTORE
syn keyword freebasicProgramFlow EXIT GOTO RETURN SLEEP
syn match freebasicProgramFlow "\<end\>"
if s:lang == "qb"
syn keyword freebasicProgramFlow __SLEEP
endif
if s:lang == "fblite" || s:lang == "qb"
syn keyword freebasicProgramFlow GOSUB
endif
if s:lang == "fb" || s:lang == "deprecated"
syn keyword freebasicProgramFlow SCOPE
syn match freebasicProgramFlow "\<end\s\+scope\>"
endif
if s:lang == "fblite" || s:lang == "qb"
syn region freebasicConditional matchgroup=freebasicConditional start="\<on\>" end="\<gosub\>" transparent
syn region freebasicConditional matchgroup=freebasicConditional start="\<on\>" end="\<goto\>" transparent
endif
syn keyword freebasicConditional IF THEN ELSE ELSEIF
if s:lang == "qb"
syn keyword freebasicConditional __IIF __WITH
syn match freebasicConditional "\<end\s\+__with\>"
else
syn keyword freebasicConditional IIF WITH
syn match freebasicConditional "\<end\s\+with\>"
endif
syn match freebasicConditional "\<end\s\+if\>"
syn match freebasicConditional "\<select\s\+case\>"
syn match freebasicConditional "\<case\>"
syn match freebasicConditional "\<case\s\+is\>"
syn match freebasicConditional "\<end\s\+select\>"
syn keyword freebasicConsole BEEP CLS CSRLIN LOCATE PRINT POS SPC TAB USING VIEW WIDTH
syn match freebasicConsole "?"
syn keyword freebasicDataTypes SINGLE DOUBLE INTEGER LONG
syn match freebasicDataTypes "\<string\>"
syn keyword freebasicDataTypes AS DIM CONST ENUM SHARED TYPE
syn match freebasicDataTypes "\<end\s\+enum\>"
syn match freebasicDataTypes "\<end\s\+type\>"
if s:lang == "qb"
syn keyword freebasicDataTypes __BOOLEAN __BYTE __LONGINT __SHORT __UBYTE __UINTEGER __ULONG __ULONGINT __UNSIGNED __USHORT __ZSTRING
syn match freebasicDataTypes "\<__WSTRING\>"
syn keyword freebasicDataTypes __EXPLICIT __EXTENDS __IMPLEMENTS __OBJECT __POINTER __PTR __SIZEOF __TYPEOF
syn keyword freebasicDataTypes __UNION
syn match freebasicDataTypes "\<end\s\+__union\>"
else
syn keyword freebasicDataTypes BOOLEAN BYTE LONGINT SHORT UBYTE UINTEGER ULONG ULONGINT UNSIGNED USHORT ZSTRING
syn match freebasicDataTypes "\<WSTRING\>"
syn keyword freebasicDataTypes EXPLICIT EXTENDS IMPLEMENTS OBJECT POINTER PTR SIZEOF TYPEOF
syn keyword freebasicDataTypes UNION
syn match freebasicDataTypes "\<end\s\+union\>"
endif
if s:lang == "fb"
syn keyword freebasicDataTypes BASE CLASS THIS VAR
endif
if s:lang == "qb"
syn match freebasicDateTime "\<\%(date\|time\)\$"
elseif s:lang == "fblite" || s:lang == "deprecated"
syn match freebasicDateTime "\<\%(date\|time\)\>\$\="
else " fb
syn keyword freebasicDateTime DATE TIME
endif
syn keyword freebasicDateTime SETDATE SETTIME
" datetime.bi
syn keyword freebasicDateTime DATEADD DATEDIFF DATEPART DATESERIAL DATEVALUE DAY HOUR ISDATE MINUTE
syn keyword freebasicDateTime MONTH MONTHNAME NOW SECOND TIMESERIAL TIMEVALUE
syn keyword freebasicDateTime TIMER YEAR WEEKDAY WEEKDAYNAME
syn keyword freebasicDebug STOP
if s:lang == "qb"
syn keyword freebasicDebug __ASSERT __ASSERTWARN
else
syn keyword freebasicDebug ASSERT ASSERTWARN
endif
syn keyword freebasicErrorHandling ERR ERL ERROR
if s:lang == "qb"
syn keyword freebasicErrorHandling __ERFN __ERMN
syn match freebasicErrorHandling "\<on\s\+error\>"
else
syn keyword freebasicErrorHandling ERFN ERMN
syn match freebasicErrorHandling "\<on\s\+\%(local\s\+\)\=error\>"
endif
if s:lang != "fb"
syn match freebasicErrorHandling "\<resume\%(\s\+next\)\=\>"
endif
syn match freebasicFiles "\<get\s\+#\>"
syn match freebasicFiles "\<input\s\+#\>"
syn match freebasicFiles "\<line\s\+input\s\+#\>"
syn match freebasicFiles "\<put\s\+#\>"
syn keyword freebasicFiles ACCESS APPEND BINARY CLOSE EOF FREEFILE INPUT LOC
syn keyword freebasicFiles LOCK LOF OUTPUT RANDOM RESET SEEK UNLOCK WRITE
syn match freebasicFiles "\<open\>"
if s:lang == "qb"
syn keyword freebasicFiles __ENCODING
else
syn keyword freebasicFiles ENCODING WINPUT
syn match freebasicFiles "\<open\s\+\%(cons\|err\|pipe\|scrn\)\>"
endif
" file.bi
syn keyword freebasicFiles FILEATTR FILECOPY FILEDATETIME FILEEXISTS FILEFLUSH FILELEN FILESETEOF
syn keyword freebasicFunctions ALIAS BYREF BYVAL CDECL DECLARE LIB NAKED PASCAL STATIC STDCALL
syn match freebasicFunctions "\<option\ze\s*("
if s:lang == "qb"
syn keyword freebasicFunctions __CVA_ARG __CVA_COPY __CVA_END __CVA_LIST __CVA_START
syn keyword freebasicFunctions __VA_ARG __VA_FIRST __VA_NEXT
else
syn keyword freebasicFunctions CVA_ARG CVA_COPY CVA_END CVA_LIST CVA_START
syn keyword freebasicFunctions VA_ARG VA_FIRST VA_NEXT
syn keyword freebasicFunctions ANY OVERLOAD
endif
syn keyword freebasicFunctions FUNCTION SUB
syn match freebasicFunctions "\<end\s\+function\>"
syn match freebasicFunctions "\<end\s\+sub\>"
if s:lang == "fb"
syn keyword freebasicFunctions ABSTRACT OVERRIDE VIRTUAL __THISCALL
syn keyword freebasicFunctions CONSTRUCTOR DESTRUCTOR OPERATOR PROPERTY
syn match freebasicFunctions "\<end\s\+constructor\>"
syn match freebasicFunctions "\<end\s\+destructor\>"
syn match freebasicFunctions "\<end\s\+operator\>"
syn match freebasicFunctions "\<end\s\+property\>"
else
syn keyword freebasicFunctions CALL
endif
syn match freebasicGraphics "\<palette\s\+get\>"
syn keyword freebasicGraphics ADD ALPHA BLOAD BSAVE CIRCLE CLS COLOR DRAW GET
syn keyword freebasicGraphics LINE PAINT PALETTE PCOPY PMAP POINT
syn keyword freebasicGraphics PRESET PSET PUT SCREEN
syn keyword freebasicGraphics TRANS WINDOW
if s:lang == "qb"
syn keyword freebasicGraphics __FLIP __IMAGECONVERTROW __IMAGECREATE __IMAGEDESTROY __IMAGEINFO __POINTCOORD
syn keyword freebasicGraphics __RGB __RGBA __SCREENCOPY __SCREENCONTROL __SCREENEVENT __SCREENGLPROC __SCREENINFO
syn keyword freebasicGraphics __SCREENLIST __SCREENLOCK __SCREENPTR __SCREENRES __SCREENSET __SCREENSYNC
syn keyword freebasicGraphics __SCREENUNLOCK __WINDOWTITLE
else
syn keyword freebasicGraphics CUSTOM
syn keyword freebasicGraphics FLIP IMAGECONVERTROW IMAGECREATE IMAGEDESTROY IMAGEINFO POINTCOORD
syn keyword freebasicGraphics RGB RGBA SCREENCOPY SCREENCONTROL SCREENEVENT SCREENGLPROC SCREENINFO
syn keyword freebasicGraphics SCREENLIST SCREENLOCK SCREENPTR SCREENRES SCREENSET SCREENSYNC
syn keyword freebasicGraphics SCREENUNLOCK WINDOWTITLE
endif
if s:lang != "qb"
syn match freebasicHardware "\<open\s\+\%(com\|lpt\)\>"
endif
syn keyword freebasicHardware INP OUT WAIT LPOS LPRINT
syn keyword freebasicMath ABS ATN COS EXP FIX FRAC INT LOG MOD RANDOMIZE RND SGN SIN SQR TAN
if s:lang == "qb"
syn keyword freebasicMath __ACOS __ASIN __ATAN2
else
syn keyword freebasicMath ACOS ASIN ATAN2
endif
if s:lang == "qb"
syn keyword freebasicMemory __ALLOCATE __CALLOCATE __DEALLOCATE __REALLOCATE
else
syn keyword freebasicMemory ALLOCATE CALLOCATE DEALLOCATE REALLOCATE
syn keyword freebasicMemory PEEK POKE CLEAR FB_MEMCOPY FB_MEMCOPYCLEAR FB_MEMMOVE SWAP SADD
syn keyword freebasicMemory FIELD FRE
endif
syn keyword freebasicMisc LET TO
if s:lang == "qb"
syn keyword freebasicMisc __OFFSETOF
else
syn keyword freebasicMisc OFFSETOF
endif
syn keyword freebasicModularizing CHAIN COMMON
if s:lang == "fb"
syn keyword freebasicModularizing EXTERN
syn match freebasicModularizing "\<end\s\+extern\>"
syn keyword freebasicModularizing PROTECTED
endif
if s:lang == "qb"
syn keyword freebasicModularizing __EXPORT __IMPORT __DYLIBFREE __DYLIBLOAD __DYLIBSYMBOL
else
syn keyword freebasicModularizing EXPORT IMPORT DYLIBFREE DYLIBLOAD DYLIBSYMBOL
syn keyword freebasicModularizing PRIVATE PUBLIC
syn keyword freebasicModularizing NAMESPACE
syn match freebasicModularizing "\<end\s\+namespace\>"
endif
if s:lang != "qb"
syn keyword freebasicMultithreading MUTEXCREATE MUTEXDESTROY MUTEXLOCK MUTEXUNLOCK THREADCREATE THREADWAIT
syn keyword freebasicMultithreading CONDBROADCAST CONDCREATE CONDDESTROY CONDSIGNAL CONDWAIT
syn keyword freebasicMultithreading THREADCALL THREADDETACH THREADSELF
endif
syn keyword freebasicShell CHDIR KILL NAME MKDIR RMDIR RUN SETENVIRON
if s:lang == "qb"
syn keyword freebasicShell __CURDIR __DIR __EXEC __EXEPATH
syn match freebasicString "\<\%(command\|environ\)\$"
else
" fbio.bi
syn keyword freebasicShell ISREDIRECTED
syn keyword freebasicShell CURDIR DIR EXEC EXEPATH
syn match freebasicString "\<\%(command\|environ\)\>\$\="
endif
syn keyword freebasicEnviron SHELL SYSTEM
syn keyword freebasicLoops FOR LOOP WHILE WEND DO STEP UNTIL NEXT
if s:lang == "qb"
syn keyword freebasicLoops __CONTINUE
else
syn keyword freebasicLoops CONTINUE
endif
"
" File numbers
"
syn match freebasicFilenumber "#\d\+"
syn match freebasicFilenumber "#\a[[:alpha:].]*[%&!#]\="
syn match freebasicMetacommand "$\s*\%(dynamic\|static\)"
syn match freebasicMetacommand "$\s*include\s*\%(once\)\=\s*:\s*'[^']\+'"
syn match freebasicMetacommand '$\s*include\s*\%(once\)\=\s*:\s*"[^"]\+"'
syn match freebasicMetacommand '$\s*lang\s*:\s*"[^"]\+"'
"
" Intrinsic defines
"
syn keyword freebasicPredefined __DATE__ __DATE_ISO__
syn keyword freebasicPredefined __FB_64BIT__ __FB_ARGC__ __FB_ARG_COUNT__ __FB_ARG_EXTRACT__ __FB_ARG_LEFTOF__
syn keyword freebasicPredefined __FB_ARG_RIGHTOF__ __FB_ARGV__ __FB_ARM__ __FB_ASM__ __FB_BACKEND__
syn keyword freebasicPredefined __FB_BIGENDIAN__ __FB_BUILD_DATE__ __FB_BUILD_DATE_ISO__ __FB_BUILD_SHA1__
syn keyword freebasicPredefined __FB_CYGWIN__ __FB_DARWIN__ __FB_DEBUG__ __FB_DOS__ __FB_ERR__ __FB_EVAL__
syn keyword freebasicPredefined __FB_FPMODE__ __FB_FPU__ __FB_FREEBSD__ __FB_GCC__ __FB_GUI__ __FB_IIF__ __FB_JOIN__
syn keyword freebasicPredefined __FB_LANG__ __FB_LINUX__ __FB_MAIN__ __FB_MIN_VERSION__ __FB_MT__ __FB_NETBSD__
syn keyword freebasicPredefined __FB_OPENBSD__ __FB_OPTIMIZE__ __FB_OPTION_BYVAL__ __FB_OPTION_DYNAMIC__
syn keyword freebasicPredefined __FB_OPTION_ESCAPE__ __FB_OPTION_EXPLICIT__ __FB_OPTION_GOSUB__
syn keyword freebasicPredefined __FB_OPTION_PRIVATE__ __FB_OUT_DLL__ __FB_OUT_EXE__ __FB_OUT_LIB__ __FB_OUT_OBJ__
syn keyword freebasicPredefined __FB_PCOS__ __FB_PPC__ __FB_QUERY_SYMBOL__ __FB_QUOTE__ __FB_SIGNATURE__ __FB_SSE__
syn keyword freebasicPredefined __FB_UNIQUEID__ __FB_UNIQUEID_POP__ __FB_UNIQUEID_PUSH__ __FB_UNIX__ __FB_UNQUOTE__
syn keyword freebasicPredefined __FB_VECTORIZE__ __FB_VER_MAJOR__ __FB_VER_MINOR__ __FB_VER_PATCH__ __FB_VERSION__
syn keyword freebasicPredefined __FB_WIN32__ __FB_X86__ __FB_XBOX__
syn keyword freebasicPredefined __FILE__ __FILE_NQ__ __FUNCTION__ __FUNCTION_NQ__
syn keyword freebasicPredefined __LINE__ __PATH__ __TIME__
"
" Preprocessor directives
"
syn match freebasicInclude "#\s*\%(inclib\|include\%(\s\+once\)\=\|libpath\)\>"
syn match freebasicPreProcessor "#\s*assert\>"
syn match freebasicPreProcessor "#\s*cmdline\>"
syn match freebasicPreProcessor "#\s*\%(define\|undef\)\>"
syn match freebasicPreProcessor "#\s*\%(if\|ifdef\|ifndef\|else\|elseif\|endif\)\>"
syn match freebasicPreProcessor "#\s*\%(macro\|endmacro\)\>"
syn match freebasicPreProcessor "#\s*error\>"
syn match freebasicPreProcessor "#\s*lang\>"
syn match freebasicPreProcessor "#\s*line\>"
syn match freebasicPreProcessor "#\s*pragma\%(\s\+reserve\)\=\>"
syn match freebasicPreProcessor "#\s*\%(print\|dynamic\|static\)\>"
syn keyword freebasicPreProcessor DEFINED
syn keyword freebasicString LEN
syn keyword freebasicString ASC
" string.bi
syn keyword freebasicString FORMAT
syn keyword freebasicString VAL
syn keyword freebasicString CVD CVI CVL CVS
syn keyword freebasicString INSTR
syn keyword freebasicString LSET RSET
if s:lang == "qb"
syn match freebasicString "\<string\$\ze\s*("
syn match freebasicString "\<__wstring\ze\s*("
syn match freebasicString "\<space\$"
syn keyword freebasicString __WSPACE
syn match freebasicString "\<chr\$"
syn keyword freebasicString __WCHR
syn keyword freebasicString __WBIN __WHEX __WOCT __WSTR
syn match freebasicString "\<\%(bin\|hex\|oct\|str\)\$"
syn keyword freebasicString __VALLNG __VALINT __VALUINT __VALULNG
syn match freebasicString "\<\%(mkd\|mki\|mkl\|mks\)\$"
syn keyword freebasicString __MKLONGINT __MKSHORT
syn keyword freebasicString __CVLONGINT __CVSHORT
syn match freebasicString "\<\%(left\|mid\|right\|lcase\|ucase\|ltrim\|rtrim\)\$"
syn keyword freebasicString __TRIM
syn keyword freebasicString __INSTRREV
else
syn match freebasicString "\<string\$\=\ze\s*("
syn match freebasicString "\<wstring\ze\s*("
syn match freebasicString "\<space\>\$\="
syn keyword freebasicString WSPACE
syn match freebasicString "\<chr\>\$\="
syn keyword freebasicString WCHR
syn keyword freebasicString WBIN WHEX WOCT WSTR
syn match freebasicString "\<\%(bin\|hex\|oct\|str\)\>\$\="
syn keyword freebasicString VALLNG VALINT VALUINT VALULNG
syn match freebasicString "\<\%(mkd\|mki\|mkl\|mks\)\>\$\="
syn match freebasicString "\<\%(mklongint\|mkshort\)\>\$\="
syn keyword freebasicString CVLONGINT CVSHORT
syn match freebasicString "\<\%(left\|mid\|right\|lcase\|ucase\|ltrim\|rtrim\)\>\$\="
syn match freebasicString "\<trim\>\$\="
syn keyword freebasicString INSTRREV
endif
syn keyword freebasicTypeCasting CDBL CINT CLNG CSNG
if s:lang == "qb"
syn keyword freebasicTypeCasting __CAST __CBOOL __CBYTE __CLNGINT __CPTR __CSHORT __CSIGN __CYBTE __CUINT __CULNG
syn keyword freebasicTypeCasting __CULNGINT __CUNSG __CUSHORT
else
syn keyword freebasicTypeCasting CAST CBOOL CBYTE CLNGINT CPTR CSHORT CSIGN CUBYTE CUINT CULNG CULNGINT CUNSG CUSHORT
endif
syn match freebasicUserInput "\<line\s\+input\>"
syn keyword freebasicUserInput INKEY INPUT
if s:lang == "qb"
syn keyword freebasicUserInput __GETJOYSTICK __GETKEY __GETMOUSE __MULTIKEY __SETMOUSE STICK STRIG
else
syn keyword freebasicUserInput GETJOYSTICK GETKEY GETMOUSE MULTIKEY SETMOUSE
endif
"
" Operators
"
" TODO: make these context sensitive to remove the overlap of common operators
" : alpha operators should probably always be highlighted
" -- DJK 20/11/19
if s:lang == "qb"
syn match freebasicArithmeticOperator "\<\%(MOD\|__SHL\|__SHR\)\>"
else
syn match freebasicArithmeticOperator "\<\%(MOD\|SHL\|SHR\)\>"
endif
syn match freebasicBitwiseOperator "\<\%(AND\|EQV\|IMP\|NOT\|OR\|XOR\)\>" " freebaseLogical?
if s:lang == "qb"
syn match freebasicAssignmentOperator "\<\%(MOD\|AND\|EQV\|IMP\|OR\|XOR\|__SHL\|__SHR\)=\@=" " exclude trailing '='
else
syn match freebasicAssignmentOperator "\<\%(MOD\|AND\|EQV\|IMP\|OR\|XOR\|SHL\|SHR\)=\@="
endif
syn match freebasicShortcircuitOperator "\<\%(ANDALSO\|ORELSE\)\>"
if s:lang == "fb"
syn match freebasicMemoryOperator '\<\%(new\|delete\)\>'
endif
syn keyword freebasicPointerOperator STRPTR VARPTR
if s:lang == "qb"
syn keyword freebasicPointerOperator __PROCPTR
else
syn keyword freebasicPointerOperator PROCPTR
endif
syn match freebasicTypeOperator '\<is\>'
syn match freebasicTypeOperator '\.' nextgroup=freebasicIdentifier skipwhite
if s:lang == "fb"
syn match freebasicTypeOperator '->' nextgroup=freebasicIdentifier skipwhite
endif
if exists("freebasic_operators")
syn match freebasicAssignmentOperator "=>\=\|[-+&/\\*^]="
if s:lang == "qb"
syn match freebasicAssignmentOperator "\<\%(MOD\|AND\|EQV\|IMP\|OR\|XOR\|__SHL\|__SHR\)=" " include trailing '='
else
syn match freebasicAssignmentOperator "\<\%(MOD\|AND\|EQV\|IMP\|OR\|XOR\|SHL\|SHR\)="
endif
syn match freebasicArithmeticOperator "[-+&/\\*^]"
" syn match freebasicIndexingOperator "[[\]()]" " FIXME
syn match freebasicRelationalOperator "=\|<>\|<=\|<\|>=\|>"
syn match freebasicPreprocessorOperator '\%(^\s*\)\@<!\%(##\|#\)\|[$!]"\@='
syn match freebasicPointerOperator '[@*]'
syn match freebasicTypeOperator '\.' nextgroup=freebasicIdentifier skipwhite
if s:lang == "fb"
syn match freebasicTypeOperator '->' nextgroup=freebasicIdentifier skipwhite
endif
endif
syn cluster freebasicOperator contains=freebasic.*Operator
"
" Catch errors caused by wrong parenthesis
"
" syn region freebasicParen transparent start='(' end=')' contains=ALLBUT,@freebasicParenGroup
" syn match freebasicParenError ")"
" syn match freebasicInParen contained "[{}]"
" syn cluster freebasicParenGroup contains=freebasicParenError,freebasicSpecial,freebasicTodo,freebasicUserCont,freebasicUserLabel,freebasicBitField
"
" Integer number
"
syn match freebasicHexError "&h\w*\>"
syn match freebasicOctalError "&o\w*\>"
syn match freebasicBinaryError "&b\w*\>"
syn match freebasicHex "&h\x\+\%([%L&U]\|UL\|LL\|ULL\)\=\>"
syn match freebasicOctal "&o\o\+\%([%L&U]\|UL\|LL\|ULL\)\=\>"
syn match freebasicBinary "&b[10]\+\%([%L&U]\|UL\|LL\|ULL\)\=\>"
syn match freebasicInteger "\<\d\+\%([%L&U]\|UL\|LL\|ULL\)\=\>"
"
" Floating point
" See: https://www.freebasic.net/forum/viewtopic.php?t=20323
"
" Floating point number, with dot, optional exponent, optional suffix
"
syn match freebasicFloat "\<\d\+\.\d*\%([de][-+]\=\d*\)\=[f!#]\="
"
" Floating point number, starting with a dot, optional exponent, optional suffix
"
syn match freebasicFloat "\.\d\+\%([de][-+]\=\d*\)\=[f!#]\="
"
" Floating point number, without dot, with optional exponent, optional suffix
"
syn match freebasicFloat "\<\d\+\%([de][-+]\=\d*\)[f!#]\="
"
" Floating point number, without dot, without exponent, with suffix
"
syn match freebasicFloat "\<\d\+[f!#]"
"
" Create the clusters
"
syn cluster freebasicNumber contains=freebasicHex,freebasicOctal,freebasicBinary,freebasicInteger,freebasicFloat
syn cluster freebasicNumberError contains=freebasicHexError,freebasicOctalError,freebasicBinaryError
"
" Booleans
"
if s:lang != "qb"
syn keyword freebasicBoolean TRUE FALSE
endif
"
"
" String and escape sequences
"
syn match freebasicSpecial contained "\\."
syn match freebasicSpecial contained "\\\d\{1,3}"
syn match freebasicSpecial contained "\\&h\x\{1,2}"
syn match freebasicSpecial contained "\\&o\o\{1,3}"
syn match freebasicSpecial contained "\\&b[01]\{1,8}"
syn match freebasicSpecial contained "\\u\x\{1,4}"
syn region freebasicString start='"' end='"' " TODO: Toggle contains on Option Escape in fblite and qb? -- DJK 20/11/19
syn region freebasicString start='!\zs"' end='"' contains=freebasicSpecial
syn region freebasicString start='$\zs"' end='"'
"
" Line labels
"
if s:lang =~# '\<\%(qb\|fblite\)\>'
syn match freebasicLineLabel "^\s*\zs\h\%(\w\|\.\)*\ze\s*:"
else
syn match freebasicLineLabel "^\s*\zs\h\w*\ze\s*:"
endif
syn match freebasicLineNumber "^\s*\zs\d\+"
"
" Line continuations
"
" syn match freebasicLineContinuation "\<_\>" nextgroup=freebasicComment,freebasicPostLineContinuation skipwhite
syn keyword freebasicLineContinuation _ nextgroup=freebasicComment,freebasicPostLineContinuation skipwhite
syn match freebasicPostLineContinuation ".*" contained
"
"
" Type suffixes
if exists("freebasic_type_suffixes") && s:lang =~# '\<\%(qb\|fblite\)\>'
syn match freebasicTypeSuffix "\h\%(\w\|.\)*\zs[$%&!#]"
endif
"
" Comments
"
syn keyword freebasicTodo TODO FIXME XXX NOTE contained
syn region freebasicComment start="\<rem\>" end="$" contains=freebasicTodo,@Spell,freebasicMetacommand
syn region freebasicComment start="'" end="$" contains=freebasicTodo,@Spell,freebasicMetacommand
syn region freebasicDoubleComment start="''" end="$" contains=freebasicTodo,@Spell
if !exists("freebasic_no_comment_fold")
syn region freebasicMultilineComment start="/'" end="'/" contains=freebasicTodo,@Spell,freeBasicMultilineComment fold keepend extend
syn region freebasicMultilineComment2 start="^\s*'.*\n\%(\s*'\)\@=" end="^\s*'.*\n\%(\s*'\)\@!" contains=freebasicComment,freebasicDoubleComment keepend fold
else
syn region freebasicMultilineComment start="/'" end="'/" contains=freebasicTodo,@Spell,freeBasicMultilineComment
endif
syn case match
syn sync linebreaks=1
"
" The default methods for highlighting. Can be overridden later
"
hi def link freebasicArrays StorageClass
hi def link freebasicAsm Special
hi def link freebasicBitManipulation Operator
hi def link freebasicBoolean Boolean
if s:lang == "fb"
hi def link freebasicCompilerSwitches freebasicUnsupportedError
else
hi def link freebasicCompilerSwitches PreCondit
endif
hi def link freebasicConsole Special
hi def link freebasicData Special
hi def link freebasicDataTypes Type
hi def link freebasicDateTime Type
hi def link freebasicDebug Special
hi def link freebasicErrorHandling Special
hi def link freebasicFilenumber Special
hi def link freebasicFiles Special
hi def link freebasicFunctions Function
hi def link freebasicGraphics Function
hi def link freebasicHardware Special
hi def link freebasicLoops Repeat
hi def link freebasicMath Function
if s:lang == "fb"
hi def link freebasicMetacommand freebasicUnsupportedError
else
hi def link freebasicMetacommand SpecialComment
endif
hi def link freebasicMemory Function
hi def link freebasicMisc Special
hi def link freebasicModularizing Special
hi def link freebasicMultithreading Special
hi def link freebasicShell Special
hi def link freebasicEnviron Special
hi def link freebasicPointer Special
hi def link freebasicPredefined PreProc
hi def link freebasicPreProcessor PreProc
hi def link freebasicProgramFlow Statement
hi def link freebasicString String
hi def link freebasicTypeCasting Type
hi def link freebasicUserInput Statement
hi def link freebasicComment Comment
hi def link freebasicDoubleComment Comment
hi def link freebasicMultilineComment Comment
hi def link freebasicConditional Conditional
hi def link freebasicError Error
hi def link freebasicIdentifier Identifier
hi def link freebasicInclude Include
hi def link freebasicGenericFunction Function
hi def link freebasicLineContinuation Special
hi def link freebasicLineLabel LineNr
if s:lang == "fb"
hi def link freebasicLineNumber freebasicUnsupportedError
else
hi def link freebasicLineNumber LineNr
endif
hi def link freebasicMathOperator Operator
hi def link freebasicHex Number
hi def link freebasicOctal Number
hi def link freebasicBinary Number
hi def link freebasicInteger Number
hi def link freebasicFloat Float
hi def link freebasicHexError Error
hi def link freebasicOctalError Error
hi def link freebasicBinaryError Error
hi def link freebasicAssignmentOperator Operator
hi def link freebasicArithmeticOperator Operator
hi def link freebasicIndexingOperator Operator
hi def link freebasicRelationalOperator Operator
hi def link freebasicBitwiseOperator Operator
hi def link freebasicShortcircuitOperator Operator
hi def link freebasicPreprocessorOperator Operator
hi def link freebasicPointerOperator Operator
if exists("freebasic_operators")
hi def link freebasicTypeOperator Operator
endif
hi def link freebasicMemoryOperator Operator
hi def link freebasicSpaceError Error
hi def link freebasicSpecial Special
hi def link freebasicTodo Todo
hi def link freebasicUnsupported freebasicUnsupportedError
hi def link freebasicUnsupportedError Error
unlet s:lang
let b:current_syntax = "freebasic"
" vim: ts=8 tw=132 fdm=marker