1071d4279SBram Moolenaar" Vim syntax file 2071d4279SBram Moolenaar" Language: FORTH 325a6e8a7SBram Moolenaar" Current Maintainer: Johan Kotlinski <[email protected]> 4cb80aa2dSBram Moolenaar" Previous Maintainer: Christian V. J. Brüssow <[email protected]> 525a6e8a7SBram Moolenaar" Last Change: 2018-03-29 6071d4279SBram Moolenaar" Filenames: *.fs,*.ft 725a6e8a7SBram Moolenaar" URL: https://github.com/jkotlinski/forth.vim 8071d4279SBram Moolenaar 989bcfda6SBram Moolenaar" quit when a syntax file was already loaded 1089bcfda6SBram Moolenaarif exists("b:current_syntax") 11071d4279SBram Moolenaar finish 12071d4279SBram Moolenaarendif 13071d4279SBram Moolenaar 146ee8d89cSBram Moolenaarlet s:cpo_save = &cpo 156ee8d89cSBram Moolenaarset cpo&vim 166ee8d89cSBram Moolenaar 17071d4279SBram Moolenaar" Synchronization method 188299df96SBram Moolenaarsyn sync ccomment 198299df96SBram Moolenaarsyn sync maxlines=200 20071d4279SBram Moolenaar 21071d4279SBram Moolenaar" I use gforth, so I set this to case ignore 22071d4279SBram Moolenaarsyn case ignore 23071d4279SBram Moolenaar 24071d4279SBram Moolenaar" Some special, non-FORTH keywords 25071d4279SBram Moolenaarsyn keyword forthTodo contained TODO FIXME XXX 26071d4279SBram Moolenaarsyn match forthTodo contained 'Copyright\(\s([Cc])\)\=\(\s[0-9]\{2,4}\)\=' 27071d4279SBram Moolenaar 28071d4279SBram Moolenaar" Characters allowed in keywords 29e37d50a5SBram Moolenaar" I don't know if 128-255 are allowed in ANS-FORTH 30071d4279SBram Moolenaarsetlocal iskeyword=!,@,33-35,%,$,38-64,A-Z,91-96,a-z,123-126,128-255 31071d4279SBram Moolenaar 323577c6faSBram Moolenaar" when wanted, highlight trailing white space 333577c6faSBram Moolenaarif exists("forth_space_errors") 343577c6faSBram Moolenaar if !exists("forth_no_trail_space_error") 353577c6faSBram Moolenaar syn match forthSpaceError display excludenl "\s\+$" 363577c6faSBram Moolenaar endif 373577c6faSBram Moolenaar if !exists("forth_no_tab_space_error") 383577c6faSBram Moolenaar syn match forthSpaceError display " \+\t"me=e-1 393577c6faSBram Moolenaar endif 403577c6faSBram Moolenaarendif 41071d4279SBram Moolenaar 42071d4279SBram Moolenaar" Keywords 43071d4279SBram Moolenaar 44071d4279SBram Moolenaar" basic mathematical and logical operators 45071d4279SBram Moolenaarsyn keyword forthOperators + - * / MOD /MOD NEGATE ABS MIN MAX 46e37d50a5SBram Moolenaarsyn keyword forthOperators AND OR XOR NOT LSHIFT RSHIFT INVERT 2* 2/ 1+ 47e37d50a5SBram Moolenaarsyn keyword forthOperators 1- 2+ 2- 8* UNDER+ 48071d4279SBram Moolenaarsyn keyword forthOperators M+ */ */MOD M* UM* M*/ UM/MOD FM/MOD SM/REM 49e37d50a5SBram Moolenaarsyn keyword forthOperators D+ D- DNEGATE DABS DMIN DMAX D2* D2/ 50071d4279SBram Moolenaarsyn keyword forthOperators F+ F- F* F/ FNEGATE FABS FMAX FMIN FLOOR FROUND 51071d4279SBram Moolenaarsyn keyword forthOperators F** FSQRT FEXP FEXPM1 FLN FLNP1 FLOG FALOG FSIN 52071d4279SBram Moolenaarsyn keyword forthOperators FCOS FSINCOS FTAN FASIN FACOS FATAN FATAN2 FSINH 53e37d50a5SBram Moolenaarsyn keyword forthOperators FCOSH FTANH FASINH FACOSH FATANH F2* F2/ 1/F 54e37d50a5SBram Moolenaarsyn keyword forthOperators F~REL F~ABS F~ 55e37d50a5SBram Moolenaarsyn keyword forthOperators 0< 0<= 0<> 0= 0> 0>= < <= <> = > >= U< U<= 56e37d50a5SBram Moolenaarsyn keyword forthOperators U> U>= D0< D0<= D0<> D0= D0> D0>= D< D<= D<> 57e37d50a5SBram Moolenaarsyn keyword forthOperators D= D> D>= DU< DU<= DU> DU>= WITHIN ?NEGATE 5825a6e8a7SBram Moolenaarsyn keyword forthOperators ?DNEGATE TRUE FALSE 5925a6e8a7SBram Moolenaar 6025a6e8a7SBram Moolenaar" various words that take an input and do something with it 6125a6e8a7SBram Moolenaarsyn keyword forthFunction . U. .R U.R 62071d4279SBram Moolenaar 63071d4279SBram Moolenaar" stack manipulations 64071d4279SBram Moolenaarsyn keyword forthStack DROP NIP DUP OVER TUCK SWAP ROT -ROT ?DUP PICK ROLL 65e37d50a5SBram Moolenaarsyn keyword forthStack 2DROP 2NIP 2DUP 2OVER 2TUCK 2SWAP 2ROT 2-ROT 66e37d50a5SBram Moolenaarsyn keyword forthStack 3DUP 4DUP 5DUP 3DROP 4DROP 5DROP 8DROP 4SWAP 4ROT 67e37d50a5SBram Moolenaarsyn keyword forthStack 4-ROT 4TUCK 8SWAP 8DUP 68071d4279SBram Moolenaarsyn keyword forthRStack >R R> R@ RDROP 2>R 2R> 2R@ 2RDROP 69e37d50a5SBram Moolenaarsyn keyword forthRstack 4>R 4R> 4R@ 4RDROP 70071d4279SBram Moolenaarsyn keyword forthFStack FDROP FNIP FDUP FOVER FTUCK FSWAP FROT 71071d4279SBram Moolenaar 72071d4279SBram Moolenaar" stack pointer manipulations 7325a6e8a7SBram Moolenaarsyn keyword forthSP SP@ SP! FP@ FP! RP@ RP! LP@ LP! DEPTH 74071d4279SBram Moolenaar 75071d4279SBram Moolenaar" address operations 76071d4279SBram Moolenaarsyn keyword forthMemory @ ! +! C@ C! 2@ 2! F@ F! SF@ SF! DF@ DF! 77071d4279SBram Moolenaarsyn keyword forthAdrArith CHARS CHAR+ CELLS CELL+ CELL ALIGN ALIGNED FLOATS 78071d4279SBram Moolenaarsyn keyword forthAdrArith FLOAT+ FLOAT FALIGN FALIGNED SFLOATS SFLOAT+ 79071d4279SBram Moolenaarsyn keyword forthAdrArith SFALIGN SFALIGNED DFLOATS DFLOAT+ DFALIGN DFALIGNED 80071d4279SBram Moolenaarsyn keyword forthAdrArith MAXALIGN MAXALIGNED CFALIGN CFALIGNED 81071d4279SBram Moolenaarsyn keyword forthAdrArith ADDRESS-UNIT-BITS ALLOT ALLOCATE HERE 8225a6e8a7SBram Moolenaarsyn keyword forthMemBlks MOVE ERASE CMOVE CMOVE> FILL BLANK UNUSED 83071d4279SBram Moolenaar 84071d4279SBram Moolenaar" conditionals 85071d4279SBram Moolenaarsyn keyword forthCond IF ELSE ENDIF THEN CASE OF ENDOF ENDCASE ?DUP-IF 86071d4279SBram Moolenaarsyn keyword forthCond ?DUP-0=-IF AHEAD CS-PICK CS-ROLL CATCH THROW WITHIN 87071d4279SBram Moolenaar 88071d4279SBram Moolenaar" iterations 89071d4279SBram Moolenaarsyn keyword forthLoop BEGIN WHILE REPEAT UNTIL AGAIN 90071d4279SBram Moolenaarsyn keyword forthLoop ?DO LOOP I J K +DO U+DO -DO U-DO DO +LOOP -LOOP 9125a6e8a7SBram Moolenaarsyn keyword forthLoop UNLOOP LEAVE ?LEAVE EXIT DONE FOR NEXT RECURSE 92071d4279SBram Moolenaar 93071d4279SBram Moolenaar" new words 94e37d50a5SBram Moolenaarsyn match forthClassDef '\<:class\s*[^ \t]\+\>' 95e37d50a5SBram Moolenaarsyn match forthObjectDef '\<:object\s*[^ \t]\+\>' 96071d4279SBram Moolenaarsyn match forthColonDef '\<:m\?\s*[^ \t]\+\>' 97071d4279SBram Moolenaarsyn keyword forthEndOfColonDef ; ;M ;m 98e37d50a5SBram Moolenaarsyn keyword forthEndOfClassDef ;class 99e37d50a5SBram Moolenaarsyn keyword forthEndOfObjectDef ;object 100e37d50a5SBram Moolenaarsyn keyword forthDefine CONSTANT 2CONSTANT FCONSTANT VARIABLE 2VARIABLE 101e37d50a5SBram Moolenaarsyn keyword forthDefine FVARIABLE CREATE USER VALUE TO DEFER IS DOES> IMMEDIATE 102e37d50a5SBram Moolenaarsyn keyword forthDefine COMPILE-ONLY COMPILE RESTRICT INTERPRET POSTPONE EXECUTE 103e37d50a5SBram Moolenaarsyn keyword forthDefine LITERAL CREATE-INTERPRET/COMPILE INTERPRETATION> 104e37d50a5SBram Moolenaarsyn keyword forthDefine <INTERPRETATION COMPILATION> <COMPILATION ] LASTXT 105e37d50a5SBram Moolenaarsyn keyword forthDefine COMP' POSTPONE, FIND-NAME NAME>INT NAME?INT NAME>COMP 10625a6e8a7SBram Moolenaarsyn keyword forthDefine NAME>STRING STATE C; CVARIABLE BUFFER: MARKER 10725a6e8a7SBram Moolenaarsyn keyword forthDefine , 2, F, C, COMPILE, 108e37d50a5SBram Moolenaarsyn match forthDefine "\[IFDEF]" 109e37d50a5SBram Moolenaarsyn match forthDefine "\[IFUNDEF]" 110e37d50a5SBram Moolenaarsyn match forthDefine "\[THEN]" 111e37d50a5SBram Moolenaarsyn match forthDefine "\[ENDIF]" 112e37d50a5SBram Moolenaarsyn match forthDefine "\[ELSE]" 113e37d50a5SBram Moolenaarsyn match forthDefine "\[?DO]" 114e37d50a5SBram Moolenaarsyn match forthDefine "\[DO]" 115e37d50a5SBram Moolenaarsyn match forthDefine "\[LOOP]" 116e37d50a5SBram Moolenaarsyn match forthDefine "\[+LOOP]" 117e37d50a5SBram Moolenaarsyn match forthDefine "\[NEXT]" 118e37d50a5SBram Moolenaarsyn match forthDefine "\[BEGIN]" 119e37d50a5SBram Moolenaarsyn match forthDefine "\[UNTIL]" 120e37d50a5SBram Moolenaarsyn match forthDefine "\[AGAIN]" 121e37d50a5SBram Moolenaarsyn match forthDefine "\[WHILE]" 122e37d50a5SBram Moolenaarsyn match forthDefine "\[REPEAT]" 123071d4279SBram Moolenaarsyn match forthDefine "\[COMP']" 124071d4279SBram Moolenaarsyn match forthDefine "'" 125071d4279SBram Moolenaarsyn match forthDefine '\<\[\>' 126071d4279SBram Moolenaarsyn match forthDefine "\[']" 127071d4279SBram Moolenaarsyn match forthDefine '\[COMPILE]' 12825a6e8a7SBram Moolenaarsyn match forthDefine '\[CHAR]' 129071d4279SBram Moolenaar 130071d4279SBram Moolenaar" debugging 131071d4279SBram Moolenaarsyn keyword forthDebug PRINTDEBUGDATA PRINTDEBUGLINE 132071d4279SBram Moolenaarsyn match forthDebug "\<\~\~\>" 133071d4279SBram Moolenaar 134071d4279SBram Moolenaar" Assembler 135071d4279SBram Moolenaarsyn keyword forthAssembler ASSEMBLER CODE END-CODE ;CODE FLUSH-ICACHE C, 136071d4279SBram Moolenaar 137071d4279SBram Moolenaar" basic character operations 138071d4279SBram Moolenaarsyn keyword forthCharOps (.) CHAR EXPECT FIND WORD TYPE -TRAILING EMIT KEY 13925a6e8a7SBram Moolenaarsyn keyword forthCharOps KEY? TIB CR BL COUNT SPACE SPACES 140071d4279SBram Moolenaar" recognize 'char (' or '[char] (' correctly, so it doesn't 141071d4279SBram Moolenaar" highlight everything after the paren as a comment till a closing ')' 142071d4279SBram Moolenaarsyn match forthCharOps '\<char\s\S\s' 143071d4279SBram Moolenaarsyn match forthCharOps '\<\[char\]\s\S\s' 144071d4279SBram Moolenaarsyn region forthCharOps start=+."\s+ skip=+\\"+ end=+"+ 145071d4279SBram Moolenaar 146071d4279SBram Moolenaar" char-number conversion 147e37d50a5SBram Moolenaarsyn keyword forthConversion <<# <# # #> #>> #S (NUMBER) (NUMBER?) CONVERT D>F 148e37d50a5SBram Moolenaarsyn keyword forthConversion D>S DIGIT DPL F>D HLD HOLD NUMBER S>D SIGN >NUMBER 14925a6e8a7SBram Moolenaarsyn keyword forthConversion F>S S>F HOLDS 150071d4279SBram Moolenaar 151cdf04208SBram Moolenaar" interpreter, wordbook, compiler 152071d4279SBram Moolenaarsyn keyword forthForth (LOCAL) BYE COLD ABORT >BODY >NEXT >LINK CFA >VIEW HERE 153071d4279SBram Moolenaarsyn keyword forthForth PAD WORDS VIEW VIEW> N>LINK NAME> LINK> L>NAME FORGET 154e37d50a5SBram Moolenaarsyn keyword forthForth BODY> ASSERT( ASSERT0( ASSERT1( ASSERT2( ASSERT3( ) 15525a6e8a7SBram Moolenaarsyn keyword forthForth >IN ACCEPT ENVIRONMENT? EVALUATE QUIT SOURCE ACTION-OF 15625a6e8a7SBram Moolenaarsyn keyword forthForth DEFER! DEFER@ PARSE PARSE-NAME REFILL RESTORE-INPUT 15725a6e8a7SBram Moolenaarsyn keyword forthForth SAVE-INPUT SOURCE-ID 158071d4279SBram Moolenaarsyn region forthForth start=+ABORT"\s+ skip=+\\"+ end=+"+ 159071d4279SBram Moolenaar 160071d4279SBram Moolenaar" vocabularies 161071d4279SBram Moolenaarsyn keyword forthVocs ONLY FORTH ALSO ROOT SEAL VOCS ORDER CONTEXT #VOCS 162071d4279SBram Moolenaarsyn keyword forthVocs VOCABULARY DEFINITIONS 163071d4279SBram Moolenaar 164e37d50a5SBram Moolenaar" File keywords 165e37d50a5SBram Moolenaarsyn keyword forthFileMode R/O R/W W/O BIN 166e37d50a5SBram Moolenaarsyn keyword forthFileWords OPEN-FILE CREATE-FILE CLOSE-FILE DELETE-FILE 167e37d50a5SBram Moolenaarsyn keyword forthFileWords RENAME-FILE READ-FILE READ-LINE KEY-FILE 168e37d50a5SBram Moolenaarsyn keyword forthFileWords KEY?-FILE WRITE-FILE WRITE-LINE EMIT-FILE 169e37d50a5SBram Moolenaarsyn keyword forthFileWords FLUSH-FILE FILE-STATUS FILE-POSITION 170e37d50a5SBram Moolenaarsyn keyword forthFileWords REPOSITION-FILE FILE-SIZE RESIZE-FILE 171e37d50a5SBram Moolenaarsyn keyword forthFileWords SLURP-FILE SLURP-FID STDIN STDOUT STDERR 17225a6e8a7SBram Moolenaarsyn keyword forthFileWords INCLUDE-FILE INCLUDED REQUIRED 173e37d50a5SBram Moolenaarsyn keyword forthBlocks OPEN-BLOCKS USE LOAD --> BLOCK-OFFSET 174e37d50a5SBram Moolenaarsyn keyword forthBlocks GET-BLOCK-FID BLOCK-POSITION LIST SCR BLOCK 175e37d50a5SBram Moolenaarsyn keyword forthBlocks BUFER EMPTY-BUFFERS EMPTY-BUFFER UPDATE UPDATED? 176e37d50a5SBram Moolenaarsyn keyword forthBlocks SAVE-BUFFERS SAVE-BUFFER FLUSH THRU +LOAD +THRU 17725a6e8a7SBram Moolenaarsyn keyword forthBlocks BLOCK-INCLUDED BLK 178e37d50a5SBram Moolenaar 179071d4279SBram Moolenaar" numbers 180071d4279SBram Moolenaarsyn keyword forthMath DECIMAL HEX BASE 18125a6e8a7SBram Moolenaarsyn match forthInteger '\<-\=[0-9]\+.\=\>' 18225a6e8a7SBram Moolenaarsyn match forthInteger '\<&-\=[0-9]\+.\=\>' 183071d4279SBram Moolenaar" recognize hex and binary numbers, the '$' and '%' notation is for gforth 184*6c391a74SBram Moolenaarsyn match forthInteger '\<\$\x*\x\+\>' " *1* --- don't mess 185071d4279SBram Moolenaarsyn match forthInteger '\<\x*\d\x*\>' " *2* --- this order! 186071d4279SBram Moolenaarsyn match forthInteger '\<%[0-1]*[0-1]\+\>' 187e37d50a5SBram Moolenaarsyn match forthFloat '\<-\=\d*[.]\=\d\+[DdEe]\d\+\>' 188e37d50a5SBram Moolenaarsyn match forthFloat '\<-\=\d*[.]\=\d\+[DdEe][-+]\d\+\>' 189e37d50a5SBram Moolenaar 19025a6e8a7SBram Moolenaar" XXX If you find this overkill you can remove it. this has to come after the 191e37d50a5SBram Moolenaar" highlighting for numbers otherwise it has no effect. 192e37d50a5SBram Moolenaarsyn region forthComment start='0 \[if\]' end='\[endif\]' end='\[then\]' contains=forthTodo 193071d4279SBram Moolenaar 194071d4279SBram Moolenaar" Strings 19525a6e8a7SBram Moolenaarsyn region forthString start=+\.*\"+ end=+"+ end=+$+ 196071d4279SBram Moolenaar" XXX 19725a6e8a7SBram Moolenaarsyn region forthString start=+s\"+ end=+"+ end=+$+ 19825a6e8a7SBram Moolenaarsyn region forthString start=+s\\\"+ end=+"+ end=+$+ 19925a6e8a7SBram Moolenaarsyn region forthString start=+c\"+ end=+"+ end=+$+ 200071d4279SBram Moolenaar 201071d4279SBram Moolenaar" Comments 20225a6e8a7SBram Moolenaarsyn match forthComment '\\\s.*$' contains=forthTodo,forthSpaceError 20325a6e8a7SBram Moolenaarsyn region forthComment start='\\S\s' end='.*' contains=forthTodo,forthSpaceError 20425a6e8a7SBram Moolenaarsyn match forthComment '\.(\s[^)]*)' contains=forthTodo,forthSpaceError 20525a6e8a7SBram Moolenaarsyn region forthComment start='\(^\|\s\)\zs(\s' skip='\\)' end=')' contains=forthTodo,forthSpaceError 20625a6e8a7SBram Moolenaarsyn region forthComment start='/\*' end='\*/' contains=forthTodo,forthSpaceError 207071d4279SBram Moolenaar 208071d4279SBram Moolenaar" Include files 209071d4279SBram Moolenaarsyn match forthInclude '^INCLUDE\s\+\k\+' 21025a6e8a7SBram Moolenaarsyn match forthInclude '^REQUIRE\s\+\k\+' 21125a6e8a7SBram Moolenaarsyn match forthInclude '^FLOAD\s\+' 21225a6e8a7SBram Moolenaarsyn match forthInclude '^NEEDS\s\+' 213071d4279SBram Moolenaar 214e37d50a5SBram Moolenaar" Locals definitions 215e37d50a5SBram Moolenaarsyn region forthLocals start='{\s' start='{$' end='\s}' end='^}' 216e37d50a5SBram Moolenaarsyn match forthLocals '{ }' " otherwise, at least two spaces between 217e37d50a5SBram Moolenaarsyn region forthDeprecated start='locals|' end='|' 218e37d50a5SBram Moolenaar 219071d4279SBram Moolenaar" Define the default highlighting. 220f37506f6SBram Moolenaarhi def link forthTodo Todo 221f37506f6SBram Moolenaarhi def link forthOperators Operator 222f37506f6SBram Moolenaarhi def link forthMath Number 223f37506f6SBram Moolenaarhi def link forthInteger Number 224f37506f6SBram Moolenaarhi def link forthFloat Float 225f37506f6SBram Moolenaarhi def link forthStack Special 226f37506f6SBram Moolenaarhi def link forthRstack Special 227f37506f6SBram Moolenaarhi def link forthFStack Special 228f37506f6SBram Moolenaarhi def link forthSP Special 229f37506f6SBram Moolenaarhi def link forthMemory Function 230f37506f6SBram Moolenaarhi def link forthAdrArith Function 231f37506f6SBram Moolenaarhi def link forthMemBlks Function 232f37506f6SBram Moolenaarhi def link forthCond Conditional 233f37506f6SBram Moolenaarhi def link forthLoop Repeat 234f37506f6SBram Moolenaarhi def link forthColonDef Define 235f37506f6SBram Moolenaarhi def link forthEndOfColonDef Define 236f37506f6SBram Moolenaarhi def link forthDefine Define 237f37506f6SBram Moolenaarhi def link forthDebug Debug 238f37506f6SBram Moolenaarhi def link forthAssembler Include 239f37506f6SBram Moolenaarhi def link forthCharOps Character 240f37506f6SBram Moolenaarhi def link forthConversion String 241f37506f6SBram Moolenaarhi def link forthForth Statement 242f37506f6SBram Moolenaarhi def link forthVocs Statement 243f37506f6SBram Moolenaarhi def link forthString String 244f37506f6SBram Moolenaarhi def link forthComment Comment 245f37506f6SBram Moolenaarhi def link forthClassDef Define 246f37506f6SBram Moolenaarhi def link forthEndOfClassDef Define 247f37506f6SBram Moolenaarhi def link forthObjectDef Define 248f37506f6SBram Moolenaarhi def link forthEndOfObjectDef Define 249f37506f6SBram Moolenaarhi def link forthInclude Include 250f37506f6SBram Moolenaarhi def link forthLocals Type " nothing else uses type and locals must stand out 251f37506f6SBram Moolenaarhi def link forthDeprecated Error " if you must, change to Type 252f37506f6SBram Moolenaarhi def link forthFileMode Function 25325a6e8a7SBram Moolenaarhi def link forthFunction Function 254f37506f6SBram Moolenaarhi def link forthFileWords Statement 255f37506f6SBram Moolenaarhi def link forthBlocks Statement 256f37506f6SBram Moolenaarhi def link forthSpaceError Error 257071d4279SBram Moolenaar 258071d4279SBram Moolenaarlet b:current_syntax = "forth" 259071d4279SBram Moolenaar 2606ee8d89cSBram Moolenaarlet &cpo = s:cpo_save 2616ee8d89cSBram Moolenaarunlet s:cpo_save 262071d4279SBram Moolenaar" vim:ts=8:sw=4:nocindent:smartindent: 263