neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

forth.vim (16632B)


      1 " Vim syntax file
      2 " Language:		Forth
      3 " Maintainer:		Johan Kotlinski <kotlinski@gmail.com>
      4 " Previous Maintainer:	Christian V. J. Brüssow <cvjb@cvjb.de>
      5 " Last Change:		2023 Aug 13
      6 " Filenames:		*.f,*.fs,*.ft,*.fth,*.4th
      7 " URL:			https://github.com/jkotlinski/forth.vim
      8 
      9 " Supports the Forth-2012 Standard.
     10 "
     11 " Removed words from the earlier Forth-79, Forth-83 and Forth-94 standards are
     12 " also included.
     13 "
     14 " These have been organised according to the version in which they were
     15 " initially included and the version in which they were removed (obsolescent
     16 " status is ignored).  Words with "experimental" or "uncontrolled" status are
     17 " not included unless they were later standardised.
     18 
     19 " quit when a syntax file was already loaded
     20 if exists("b:current_syntax")
     21    finish
     22 endif
     23 
     24 let s:cpo_save = &cpo
     25 set cpo&vim
     26 
     27 " Synchronization method
     28 exe "syn sync minlines=" .. get(g:, "forth_minlines", 50)
     29 
     30 syn case ignore
     31 
     32 " Characters allowed in keywords
     33 " I don't know if 128-255 are allowed in ANS-FORTH
     34 syn iskeyword 33-126,128-255
     35 
     36 " Space errors {{{1
     37 " when wanted, highlight trailing white space
     38 if exists("forth_space_errors")
     39    if !exists("forth_no_trail_space_error")
     40        syn match forthSpaceError display excludenl "\s\+$"
     41    endif
     42    if !exists("forth_no_tab_space_error")
     43        syn match forthSpaceError display " \+\t"me=e-1
     44    endif
     45 endif
     46 
     47 " Core words {{{1
     48 
     49 " basic mathematical and logical operators {{{2
     50 syn keyword forthOperators * */ */MOD + - / /MOD 0< 0= 1+ 1- 2* 2/ < = > ABS
     51 syn keyword forthOperators AND FM/MOD INVERT LSHIFT M* MAX MIN MOD NEGATE OR
     52 syn keyword forthOperators RSHIFT SM/REM U< UM* UM/MOD XOR
     53  " extension words
     54 syn keyword forthOperators 0<> 0> <> U> WITHIN
     55  " Forth-79
     56 syn keyword forthOperators U* U/ U/MOD
     57  " Forth-79, Forth-83
     58 syn keyword forthOperators NOT
     59  " Forth-83
     60 syn keyword forthOperators 2+ 2-
     61 
     62 " non-standard basic mathematical and logical operators
     63 syn keyword forthOperators 0<= 0>= 8* <= >= ?DNEGATE ?NEGATE U<= U>= UNDER+
     64 
     65 " various words that take an input and do something with it {{{2
     66 syn keyword forthFunction . U.
     67  " extension words
     68 syn keyword forthFunction .R U.R
     69 
     70 " stack manipulations {{{2
     71 syn keyword forthStack 2DROP 2DUP 2OVER 2SWAP >R ?DUP DROP DUP OVER R> R@ ROT
     72 syn keyword forthStack SWAP
     73  " extension words
     74 syn keyword forthStack  NIP PICK ROLL TUCK
     75 syn keyword forthRStack 2>R 2R> 2R@
     76 
     77 " non-standard stack manipulations
     78 syn keyword forthStack  -ROT 3DROP 3DUP 4-ROT 4DROP 4DUP 4ROT 4SWAP 4TUCK
     79 syn keyword forthStack  5DROP 5DUP 8DROP 8DUP 8SWAP
     80 syn keyword forthRStack 4>R 4R> 4R@ 4RDROP RDROP
     81 
     82 " stack pointer manipulations {{{2
     83 syn keyword forthSP DEPTH
     84 
     85 " non-standard stack pointer manipulations
     86 syn keyword forthSP FP!  FP@ LP!  LP@ RP!  RP@ SP!  SP@
     87 
     88 " address operations {{{2
     89 syn keyword forthMemory !  +!  2!  2@ @ C!  C@
     90 syn keyword forthAdrArith ALIGN ALIGNED ALLOT CELL+ CELLS CHAR+ CHARS
     91 syn keyword forthMemBlks  FILL MOVE
     92  " extension words
     93 syn keyword forthMemBlks  ERASE UNUSED
     94 
     95 " non-standard address operations
     96 syn keyword forthAdrArith ADDRESS-UNIT-BITS CELL CFALIGN CFALIGNED FLOAT
     97 syn keyword forthAdrArith MAXALIGN MAXALIGNED
     98 
     99 " conditionals {{{2
    100 syn keyword forthCond ELSE IF THEN
    101  " extension words
    102 syn keyword forthCond CASE ENDCASE ENDOF OF
    103 
    104 " non-standard conditionals
    105 syn keyword forthCond ?DUP-0=-IF ?DUP-IF ENDIF
    106 
    107 " iterations {{{2
    108 syn keyword forthLoop +LOOP BEGIN DO EXIT I J LEAVE LOOP RECURSE REPEAT UNLOOP
    109 syn keyword forthLoop UNTIL WHILE
    110  " extension words
    111 syn keyword forthLoop ?DO AGAIN
    112 
    113 " non-standard iterations
    114 syn keyword forthLoop +DO -DO -LOOP ?LEAVE DONE FOR K NEXT U+DO U-DO
    115 
    116 " new words {{{2
    117 syn match   forthColonDef      "\<:\s*[^ \t]\+\>"
    118 syn keyword forthEndOfColonDef ;
    119 syn keyword forthDefine ' , C, CONSTANT CREATE DOES> EXECUTE IMMEDIATE LITERAL
    120 syn keyword forthDefine POSTPONE STATE VARIABLE ]
    121 syn match   forthDefine "\<\[']\>"
    122 syn match   forthDefine "\<\[\>"
    123  " extension words
    124 syn keyword forthColonDef :NONAME
    125 syn keyword forthDefine   BUFFER: COMPILE, DEFER IS MARKER TO VALUE
    126 syn match   forthDefine   "\<\[COMPILE]\>"
    127  " Forth-79, Forth-83
    128 syn keyword forthDefine COMPILE
    129 
    130 " non-standard new words
    131 syn match   forthClassDef       "\<:CLASS\s*[^ \t]\+\>"
    132 syn keyword forthEndOfClassDef  ;CLASS
    133 syn match   forthObjectDef      "\<:OBJECT\s*[^ \t]\+\>"
    134 syn keyword forthEndOfObjectDef ;OBJECT
    135 syn match   forthColonDef       "\<:M\s*[^ \t]\+\>"
    136 syn keyword forthEndOfColonDef  ;M
    137 syn keyword forthDefine 2, <BUILDS <COMPILATION <INTERPRETATION C; COMP'
    138 syn keyword forthDefine COMPILATION> COMPILE-ONLY CREATE-INTERPRET/COMPILE
    139 syn keyword forthDefine CVARIABLE F, FIND-NAME INTERPRET INTERPRETATION>
    140 syn keyword forthDefine LASTXT NAME>COMP NAME>INT NAME?INT POSTPONE, RESTRICT
    141 syn keyword forthDefine USER
    142 syn match   forthDefine "\<\[COMP']\>"
    143 
    144 " basic character operations {{{2
    145 syn keyword forthCharOps BL COUNT CR EMIT FIND KEY SPACE SPACES TYPE WORD
    146 " recognize 'char (' or '[CHAR] (' correctly, so it doesn't
    147 " highlight everything after the paren as a comment till a closing ')'
    148 syn match forthCharOps '\<CHAR\s\S\s'
    149 syn match forthCharOps '\<\[CHAR]\s\S\s'
    150  " Forth-83, Forth-94
    151 syn keyword forthCharOps EXPECT #TIB TIB
    152 
    153 " non-standard basic character operations
    154 syn keyword forthCharOps (.)
    155 
    156 " char-number conversion {{{2
    157 syn keyword forthConversion # #> #S <# >NUMBER HOLD S>D SIGN
    158  " extension words
    159 syn keyword forthConversion HOLDS
    160  " Forth-79, Forth-83, Forth-93
    161 syn keyword forthConversion CONVERT
    162 
    163 " non-standard char-number conversion
    164 syn keyword forthConversion #>> (NUMBER) (NUMBER?) <<# DIGIT DPL HLD NUMBER
    165 
    166 " interpreter, wordbook, compiler {{{2
    167 syn keyword forthForth >BODY >IN ACCEPT ENVIRONMENT?  EVALUATE HERE QUIT SOURCE
    168  " extension words
    169 syn keyword forthForth ACTION-OF DEFER!  DEFER@ PAD PARSE PARSE-NAME REFILL
    170 syn keyword forthForth RESTORE-INPUT SAVE-INPUT SOURCE-ID
    171  " Forth-79
    172 syn keyword forthForth 79-STANDARD
    173  " Forth-83
    174 syn keyword forthForth <MARK <RESOLVE >MARK >RESOLVE ?BRANCH BRANCH FORTH-83
    175  " Forth-79, Forth-83, Forth-94
    176 syn keyword forthForth QUERY
    177  " Forth-83, Forth-94
    178 syn keyword forthForth SPAN
    179 
    180 " non-standard interpreter, wordbook, compiler
    181 syn keyword forthForth ) >LINK >NEXT >VIEW ASSERT( ASSERT0( ASSERT1( ASSERT2(
    182 syn keyword forthForth ASSERT3( BODY> CFA COLD L>NAME LINK> N>LINK NAME> VIEW
    183 syn keyword forthForth VIEW>
    184 
    185 " booleans {{{2
    186  " extension words
    187 syn match forthBoolean "\<\%(TRUE\|FALSE\)\>"
    188 
    189 " numbers {{{2
    190 syn keyword forthMath  BASE DECIMAL
    191  " extension words
    192 syn keyword forthMath  HEX
    193 syn match forthInteger '\<-\=\d\+\.\=\>'
    194 syn match forthInteger '\<#-\=\d\+\.\=\>'
    195 syn match forthInteger '\<\$-\=\x\+\.\=\>'
    196 syn match forthInteger '\<%-\=[01]\+\.\=\>'
    197 
    198 " characters {{{2
    199 syn match forthCharacter "'\k'"
    200 
    201 " strings {{{2
    202 
    203 " Words that end with " are assumed to start string parsing.
    204 " This includes standard words: S" ."
    205 syn region forthString matchgroup=forthString start=+\<\S\+"\s+ end=+"+ end=+$+ contains=@Spell
    206  " extension words
    207 syn region forthString matchgroup=forthString start=+\<C"\s+ end=+"+ end=+$+ contains=@Spell
    208 " Matches S\"
    209 syn region forthString matchgroup=forthString start=+\<S\\"\s+ end=+"+ end=+$+ contains=@Spell,forthEscape
    210 
    211 syn match forthEscape +\C\\[abeflmnqrtvz"\\]+ contained
    212 syn match forthEscape "\C\\x\x\x" contained
    213 
    214 " comments {{{2
    215 
    216 syn keyword forthTodo contained TODO FIXME XXX
    217 
    218 " Some special, non-FORTH keywords
    219 syn match forthTodo contained "\<\%(TODO\|FIXME\|XXX\)\%(\>\|:\@=\)"
    220 
    221 " XXX If you find this overkill you can remove it. This has to come after the
    222 " highlighting for numbers and booleans otherwise it has no effect.
    223 syn region forthComment start='\<\%(0\|FALSE\)\s\+\[IF]' end='\<\[ENDIF]' end='\<\[THEN]' contains=forthTodo
    224 
    225 if get(g:, "forth_no_comment_fold", 0)
    226    syn region forthComment start='\<(\>' end=')' contains=@Spell,forthTodo,forthSpaceError
    227      " extension words
    228    syn match  forthComment '\<\\\>.*$' contains=@Spell,forthTodo,forthSpaceError
    229 else
    230    syn region forthComment start='\<(\>' end=')' contains=@Spell,forthTodo,forthSpaceError fold
    231      " extension words
    232    syn match  forthComment '\<\\\>.*$' contains=@Spell,forthTodo,forthSpaceError
    233    syn region forthMultilineComment start="^\s*\\\>" end="\n\%(\s*\\\>\)\@!" contains=forthComment transparent fold
    234 endif
    235 
    236  " extension words
    237 syn region forthComment start='\<\.(\>' end=')' end='$' contains=@Spell,forthTodo,forthSpaceError
    238 
    239 " ABORT {{{2
    240 syn keyword forthForth ABORT
    241 syn region forthForth start=+\<ABORT"\s+ end=+"\>+ end=+$+
    242 
    243 " The optional Block word set {{{1
    244 " Handled as Core words - REFILL
    245 syn keyword forthBlocks BLK BLOCK BUFFER FLUSH LOAD SAVE-BUFFERS UPDATE
    246  " extension words
    247 syn keyword forthBlocks EMPTY-BUFFERS LIST SCR THRU
    248 
    249 " Non-standard Block words
    250 syn keyword forthBlocks +LOAD +THRU --> BLOCK-INCLUDED BLOCK-OFFSET
    251 syn keyword forthBlocks BLOCK-POSITION EMPTY-BUFFER GET-BLOCK-FID OPEN-BLOCKS
    252 syn keyword forthBlocks SAVE-BUFFER UPDATED? USE
    253 
    254 " The optional Double-Number word set {{{1
    255 syn keyword forthConversion D>S
    256 syn keyword forthDefine     2CONSTANT 2LITERAL 2VARIABLE
    257 syn keyword forthFunction   D. D.R
    258 syn keyword forthOperators  D+ D- D0= D2* D2/ D= DABS DMAX DMIN DNEGATE
    259 syn keyword forthOperators  D0< D< M+ M*/
    260  " extension words
    261 syn keyword forthDefine    2VALUE
    262 syn keyword forthOperators DU<
    263 syn keyword forthStack     2ROT
    264 
    265 " Non-standard Double-Number words
    266 syn keyword forthOperators D0<= D0<> D0> D0>= D<= D<> D> D>= DU<= DU> DU>=
    267 syn keyword forthStack     2-ROT 2NIP 2RDROP 2TUCK
    268 
    269 " The optional Exception word set {{{1
    270 " Handled as Core words - ABORT ABORT"
    271 syn keyword forthCond CATCH THROW
    272 
    273 " The optional Facility word set {{{1
    274 syn keyword forthCharOps AT-XY KEY?  PAGE
    275  " extension words
    276 syn keyword forthCharOps EKEY EKEY>CHAR EKEY>FKEY EKEY?  EMIT?  K-ALT-MASK
    277 syn keyword forthCharOps K-CTRL-MASK K-DELETE K-DOWN K-END K-F1 K-F10 K-F11
    278 syn keyword forthCharOps K-F12 K-F2 K-F3 K-F4 K-F5 K-F6 K-F7 K-F8 K-F9 K-HOME
    279 syn keyword forthCharOps K-INSERT K-LEFT K-NEXT K-PRIOR K-RIGHT K-SHIFT-MASK
    280 syn keyword forthCharOps K-UP
    281 syn keyword forthDefine  +FIELD BEGIN-STRUCTURE CFIELD: END-STRUCTURE FIELD:
    282 syn keyword forthForth   MS TIME&DATE
    283 
    284 " The optional File-Access word set {{{1
    285 " Handled as Core words - REFILL SOURCE-ID S\" S" (
    286 syn keyword forthFileMode  BIN R/O R/W W/O
    287 syn keyword forthFileWords CLOSE-FILE CREATE-FILE DELETE-FILE FILE-POSITION
    288 syn keyword forthFileWords FILE-SIZE INCLUDE-FILE INCLUDED OPEN-FILE READ-FILE
    289 syn keyword forthFileWords READ-LINE REPOSITION-FILE RESIZE-FILE WRITE-FILE
    290 syn keyword forthFileWords WRITE-LINE
    291  " extension words
    292 syn keyword forthFileWords FILE-STATUS FLUSH-FILE RENAME-FILE REQUIRED
    293 syn match forthInclude '\<INCLUDE\s\+\k\+'
    294 syn match forthInclude '\<REQUIRE\s\+\k\+'
    295 
    296 " Non-standard File-Access words
    297 syn keyword forthFileWords EMIT-FILE KEY-FILE KEY?-FILE SLURP-FID SLURP-FILE
    298 syn keyword forthFileWords STDERR STDIN STDOUT
    299 syn match forthInclude '^FLOAD\s\+'
    300 syn match forthInclude '^NEEDS\s\+'
    301 
    302 " The optional Floating-Point word set {{{1
    303 
    304 " numbers
    305 syn match   forthFloat      '\<[+-]\=\d\+\.\=\d*[DdEe][+-]\=\d*\>'
    306 
    307 syn keyword forthConversion >FLOAT D>F F>D
    308 syn keyword forthAdrArith   FALIGN FALIGNED FLOAT+ FLOATS
    309 syn keyword forthDefine     FCONSTANT FLITERAL FVARIABLE
    310 syn keyword forthFStack     FDROP FDUP FOVER FROT FSWAP
    311 syn keyword forthFunction   REPRESENT
    312 syn keyword forthMemory     F! F@
    313 syn keyword forthOperators  F* F+ F- F/ F0< F0= F< FLOOR FMAX FMIN FNEGATE
    314 syn keyword forthOperators  FROUND
    315 syn keyword forthSP         FDEPTH
    316  " extension words
    317 syn keyword forthConversion F>S S>F
    318 syn keyword forthAdrArith   DFALIGN DFALIGNED DFLOAT+ DFLOATS SFALIGN
    319 syn keyword forthAdrArith   SFALIGNED SFLOAT+ SFLOATS
    320 syn keyword forthDefine     DFFIELD: FFIELD: FVALUE SFFIELD:
    321 syn keyword forthFunction   F. FE. FS. PRECISION SET-PRECISION
    322 syn keyword forthMemory     DF! DF@ SF! SF@
    323 syn keyword forthOperators  F** FABS FACOS FACOSH FALOG FASIN FASINH FATAN
    324 syn keyword forthOperators  FATAN2 FATANH FCOS FCOSH FEXP FEXPM1 FLN FLNP1
    325 syn keyword forthOperators  FLOG FSIN FSINCOS FSINH FSQRT FTAN FTANH FTRUNC F~
    326 
    327 " Non-standard Floating-Point words
    328 syn keyword forthOperators 1/F F2* F2/ F~ABS F~REL
    329 syn keyword forthFStack    FNIP FTUCK
    330 
    331 " The optional Locals word set {{{1
    332 syn keyword forthForth (LOCAL)
    333  " extension words
    334 syn region forthLocals start="\<{:\>" end="\<:}\>"
    335 syn region forthLocals start="\<LOCALS|\>" end="\<|\>"
    336 
    337 " Non-standard Locals words
    338 syn region forthLocals start="\<{\>" end="\<}\>"
    339 
    340 " The optional Memory-Allocation word set {{{1
    341 syn keyword forthMemory ALLOCATE FREE RESIZE
    342 
    343 " The optional Programming-Tools wordset {{{1
    344 syn keyword forthDebug .S ? DUMP SEE WORDS
    345  " extension words
    346 syn keyword forthAssembler ;CODE ASSEMBLER CODE END-CODE
    347 syn keyword forthCond      AHEAD CS-PICK CS-ROLL
    348 syn keyword forthDefine    NAME>COMPILE NAME>INTERPRET NAME>STRING SYNONYM
    349 syn keyword forthDefine    TRAVERSE-WORDLIST
    350 syn match   forthDefine    "\<\[DEFINED]\>"
    351 syn match   forthDefine    "\<\[ELSE]\>"
    352 syn match   forthDefine    "\<\[IF]\>"
    353 syn match   forthDefine    "\<\[THEN]\>"
    354 syn match   forthDefine    "\<\[UNDEFINED]\>"
    355 syn keyword forthForth     BYE FORGET
    356 syn keyword forthStack     N>R NR>
    357 syn keyword forthVocs      EDITOR
    358 
    359 " Non-standard Programming-Tools words
    360 syn keyword forthAssembler FLUSH-ICACHE
    361 syn keyword forthDebug     PRINTDEBUGDATA PRINTDEBUGLINE
    362 syn match   forthDebug     "\<\~\~\>"
    363 syn match   forthDefine    "\<\[+LOOP]\>"
    364 syn match   forthDefine    "\<\[?DO]\>"
    365 syn match   forthDefine    "\<\[AGAIN]\>"
    366 syn match   forthDefine    "\<\[BEGIN]\>"
    367 syn match   forthDefine    "\<\[DO]\>"
    368 syn match   forthDefine    "\<\[ENDIF]\>"
    369 syn match   forthDefine    "\<\[IFDEF]\>"
    370 syn match   forthDefine    "\<\[IFUNDEF]\>"
    371 syn match   forthDefine    "\<\[LOOP]\>"
    372 syn match   forthDefine    "\<\[NEXT]\>"
    373 syn match   forthDefine    "\<\[REPEAT]\>"
    374 syn match   forthDefine    "\<\[UNTIL]\>"
    375 syn match   forthDefine    "\<\[WHILE]\>"
    376 
    377 " The optional Search-Order word set {{{1
    378 " Handled as Core words - FIND
    379 syn keyword forthVocs DEFINITIONS FORTH-WORDLIST GET-CURRENT GET-ORDER
    380 syn keyword forthVocs SEARCH-WORDLIST SET-CURRENT SET-ORDER WORDLIST
    381  " extension words
    382 syn keyword forthVocs ALSO FORTH ONLY ORDER PREVIOUS
    383  " Forth-79, Forth-83
    384 syn keyword forthVocs CONTEXT CURRENT VOCABULARY
    385 
    386 " Non-standard Search-Order words
    387 syn keyword forthVocs #VOCS ROOT SEAL VOCS
    388 
    389 " The optional String word set {{{1
    390 syn keyword forthFunction -TRAILING /STRING BLANK CMOVE CMOVE> COMPARE SEARCH
    391 syn keyword forthFunction SLITERAL
    392  " extension words
    393 syn keyword forthFunction REPLACES SUBSTITUTE UNESCAPE
    394 
    395 " The optional Extended-Character word set {{{1
    396 " Handled as Core words - [CHAR] CHAR and PARSE
    397 syn keyword forthAdrArith XCHAR+
    398 syn keyword forthCharOps  X-SIZE XC-SIZE XEMIT XKEY XKEY?
    399 syn keyword forthDefine   XC,
    400 syn keyword forthMemory   XC!+ XC!+? XC@+
    401  " extension words
    402 syn keyword forthAdrArith   XCHAR- +X/STRING X\\STRING-
    403 syn keyword forthCharOps    EKEY>XCHAR X-WIDTH XC-WIDTH
    404 syn keyword forthConversion XHOLD
    405 syn keyword forthString     -TRAILING-GARBAGE
    406 
    407 " Define the default highlighting {{{1
    408 hi def link forthBoolean Boolean
    409 hi def link forthCharacter Character
    410 hi def link forthTodo Todo
    411 hi def link forthOperators Operator
    412 hi def link forthMath Number
    413 hi def link forthInteger Number
    414 hi def link forthFloat Float
    415 hi def link forthStack Special
    416 hi def link forthRstack Special
    417 hi def link forthFStack Special
    418 hi def link forthSP Special
    419 hi def link forthMemory Function
    420 hi def link forthAdrArith Function
    421 hi def link forthMemBlks Function
    422 hi def link forthCond Conditional
    423 hi def link forthLoop Repeat
    424 hi def link forthColonDef Define
    425 hi def link forthEndOfColonDef Define
    426 hi def link forthDefine Define
    427 hi def link forthDebug Debug
    428 hi def link forthAssembler Include
    429 hi def link forthCharOps Character
    430 hi def link forthConversion String
    431 hi def link forthForth Statement
    432 hi def link forthVocs Statement
    433 hi def link forthEscape Special
    434 hi def link forthString String
    435 hi def link forthComment Comment
    436 hi def link forthClassDef Define
    437 hi def link forthEndOfClassDef Define
    438 hi def link forthObjectDef Define
    439 hi def link forthEndOfObjectDef Define
    440 hi def link forthInclude Include
    441 hi def link forthLocals Type " nothing else uses type and locals must stand out
    442 hi def link forthFileMode Function
    443 hi def link forthFunction Function
    444 hi def link forthFileWords Statement
    445 hi def link forthBlocks Statement
    446 hi def link forthSpaceError Error
    447 "}}}
    448 
    449 let b:current_syntax = "forth"
    450 
    451 let &cpo = s:cpo_save
    452 unlet s:cpo_save
    453 
    454 " vim:ts=8:sw=4:nocindent:smartindent:fdm=marker:tw=78