| " Vim syntax file |
| " Language: Forth |
| " Maintainer: Johan Kotlinski <kotlinski@gmail.com> |
| " Previous Maintainer: Christian V. J. Brüssow <cvjb@cvjb.de> |
| " Last Change: 2023 Aug 13 |
| " Filenames: *.f,*.fs,*.ft,*.fth,*.4th |
| " URL: https://github.com/jkotlinski/forth.vim |
| |
| " Supports the Forth-2012 Standard. |
| " |
| " Removed words from the earlier Forth-79, Forth-83 and Forth-94 standards are |
| " also included. |
| " |
| " These have been organised according to the version in which they were |
| " initially included and the version in which they were removed (obsolescent |
| " status is ignored). Words with "experimental" or "uncontrolled" status are |
| " not included unless they were later standardised. |
| |
| " quit when a syntax file was already loaded |
| if exists("b:current_syntax") |
| finish |
| endif |
| |
| let s:cpo_save = &cpo |
| set cpo&vim |
| |
| " Synchronization method |
| exe "syn sync minlines=" .. get(g:, "forth_minlines", 50) |
| |
| syn case ignore |
| |
| " Characters allowed in keywords |
| " I don't know if 128-255 are allowed in ANS-FORTH |
| syn iskeyword 33-126,128-255 |
| |
| " Space errors {{{1 |
| " when wanted, highlight trailing white space |
| if exists("forth_space_errors") |
| if !exists("forth_no_trail_space_error") |
| syn match forthSpaceError display excludenl "\s\+$" |
| endif |
| if !exists("forth_no_tab_space_error") |
| syn match forthSpaceError display " \+\t"me=e-1 |
| endif |
| endif |
| |
| " Core words {{{1 |
| |
| " basic mathematical and logical operators {{{2 |
| syn keyword forthOperators * */ */MOD + - / /MOD 0< 0= 1+ 1- 2* 2/ < = > ABS |
| syn keyword forthOperators AND FM/MOD INVERT LSHIFT M* MAX MIN MOD NEGATE OR |
| syn keyword forthOperators RSHIFT SM/REM U< UM* UM/MOD XOR |
| " extension words |
| syn keyword forthOperators 0<> 0> <> U> WITHIN |
| " Forth-79 |
| syn keyword forthOperators U* U/ U/MOD |
| " Forth-79, Forth-83 |
| syn keyword forthOperators NOT |
| " Forth-83 |
| syn keyword forthOperators 2+ 2- |
| |
| " non-standard basic mathematical and logical operators |
| syn keyword forthOperators 0<= 0>= 8* <= >= ?DNEGATE ?NEGATE U<= U>= UNDER+ |
| |
| " various words that take an input and do something with it {{{2 |
| syn keyword forthFunction . U. |
| " extension words |
| syn keyword forthFunction .R U.R |
| |
| " stack manipulations {{{2 |
| syn keyword forthStack 2DROP 2DUP 2OVER 2SWAP >R ?DUP DROP DUP OVER R> R@ ROT |
| syn keyword forthStack SWAP |
| " extension words |
| syn keyword forthStack NIP PICK ROLL TUCK |
| syn keyword forthRStack 2>R 2R> 2R@ |
| |
| " non-standard stack manipulations |
| syn keyword forthStack -ROT 3DROP 3DUP 4-ROT 4DROP 4DUP 4ROT 4SWAP 4TUCK |
| syn keyword forthStack 5DROP 5DUP 8DROP 8DUP 8SWAP |
| syn keyword forthRStack 4>R 4R> 4R@ 4RDROP RDROP |
| |
| " stack pointer manipulations {{{2 |
| syn keyword forthSP DEPTH |
| |
| " non-standard stack pointer manipulations |
| syn keyword forthSP FP! FP@ LP! LP@ RP! RP@ SP! SP@ |
| |
| " address operations {{{2 |
| syn keyword forthMemory ! +! 2! 2@ @ C! C@ |
| syn keyword forthAdrArith ALIGN ALIGNED ALLOT CELL+ CELLS CHAR+ CHARS |
| syn keyword forthMemBlks FILL MOVE |
| " extension words |
| syn keyword forthMemBlks ERASE UNUSED |
| |
| " non-standard address operations |
| syn keyword forthAdrArith ADDRESS-UNIT-BITS CELL CFALIGN CFALIGNED FLOAT |
| syn keyword forthAdrArith MAXALIGN MAXALIGNED |
| |
| " conditionals {{{2 |
| syn keyword forthCond ELSE IF THEN |
| " extension words |
| syn keyword forthCond CASE ENDCASE ENDOF OF |
| |
| " non-standard conditionals |
| syn keyword forthCond ?DUP-0=-IF ?DUP-IF ENDIF |
| |
| " iterations {{{2 |
| syn keyword forthLoop +LOOP BEGIN DO EXIT I J LEAVE LOOP RECURSE REPEAT UNLOOP |
| syn keyword forthLoop UNTIL WHILE |
| " extension words |
| syn keyword forthLoop ?DO AGAIN |
| |
| " non-standard iterations |
| syn keyword forthLoop +DO -DO -LOOP ?LEAVE DONE FOR K NEXT U+DO U-DO |
| |
| " new words {{{2 |
| syn match forthColonDef "\<:\s*[^ \t]\+\>" |
| syn keyword forthEndOfColonDef ; |
| syn keyword forthDefine ' , C, CONSTANT CREATE DOES> EXECUTE IMMEDIATE LITERAL |
| syn keyword forthDefine POSTPONE STATE VARIABLE ] |
| syn match forthDefine "\<\[']\>" |
| syn match forthDefine "\<\[\>" |
| " extension words |
| syn keyword forthColonDef :NONAME |
| syn keyword forthDefine BUFFER: COMPILE, DEFER IS MARKER TO VALUE |
| syn match forthDefine "\<\[COMPILE]\>" |
| " Forth-79, Forth-83 |
| syn keyword forthDefine COMPILE |
| |
| " non-standard new words |
| syn match forthClassDef "\<:CLASS\s*[^ \t]\+\>" |
| syn keyword forthEndOfClassDef ;CLASS |
| syn match forthObjectDef "\<:OBJECT\s*[^ \t]\+\>" |
| syn keyword forthEndOfObjectDef ;OBJECT |
| syn match forthColonDef "\<:M\s*[^ \t]\+\>" |
| syn keyword forthEndOfColonDef ;M |
| syn keyword forthDefine 2, <BUILDS <COMPILATION <INTERPRETATION C; COMP' |
| syn keyword forthDefine COMPILATION> COMPILE-ONLY CREATE-INTERPRET/COMPILE |
| syn keyword forthDefine CVARIABLE F, FIND-NAME INTERPRET INTERPRETATION> |
| syn keyword forthDefine LASTXT NAME>COMP NAME>INT NAME?INT POSTPONE, RESTRICT |
| syn keyword forthDefine USER |
| syn match forthDefine "\<\[COMP']\>" |
| |
| " basic character operations {{{2 |
| syn keyword forthCharOps BL COUNT CR EMIT FIND KEY SPACE SPACES TYPE WORD |
| " recognize 'char (' or '[CHAR] (' correctly, so it doesn't |
| " highlight everything after the paren as a comment till a closing ')' |
| syn match forthCharOps '\<CHAR\s\S\s' |
| syn match forthCharOps '\<\[CHAR]\s\S\s' |
| " Forth-83, Forth-94 |
| syn keyword forthCharOps EXPECT #TIB TIB |
| |
| " non-standard basic character operations |
| syn keyword forthCharOps (.) |
| |
| " char-number conversion {{{2 |
| syn keyword forthConversion # #> #S <# >NUMBER HOLD S>D SIGN |
| " extension words |
| syn keyword forthConversion HOLDS |
| " Forth-79, Forth-83, Forth-93 |
| syn keyword forthConversion CONVERT |
| |
| " non-standard char-number conversion |
| syn keyword forthConversion #>> (NUMBER) (NUMBER?) <<# DIGIT DPL HLD NUMBER |
| |
| " interpreter, wordbook, compiler {{{2 |
| syn keyword forthForth >BODY >IN ACCEPT ENVIRONMENT? EVALUATE HERE QUIT SOURCE |
| " extension words |
| syn keyword forthForth ACTION-OF DEFER! DEFER@ PAD PARSE PARSE-NAME REFILL |
| syn keyword forthForth RESTORE-INPUT SAVE-INPUT SOURCE-ID |
| " Forth-79 |
| syn keyword forthForth 79-STANDARD |
| " Forth-83 |
| syn keyword forthForth <MARK <RESOLVE >MARK >RESOLVE ?BRANCH BRANCH FORTH-83 |
| " Forth-79, Forth-83, Forth-94 |
| syn keyword forthForth QUERY |
| " Forth-83, Forth-94 |
| syn keyword forthForth SPAN |
| |
| " non-standard interpreter, wordbook, compiler |
| syn keyword forthForth ) >LINK >NEXT >VIEW ASSERT( ASSERT0( ASSERT1( ASSERT2( |
| syn keyword forthForth ASSERT3( BODY> CFA COLD L>NAME LINK> N>LINK NAME> VIEW |
| syn keyword forthForth VIEW> |
| |
| " booleans {{{2 |
| " extension words |
| syn match forthBoolean "\<\%(TRUE\|FALSE\)\>" |
| |
| " numbers {{{2 |
| syn keyword forthMath BASE DECIMAL |
| " extension words |
| syn keyword forthMath HEX |
| syn match forthInteger '\<-\=\d\+\.\=\>' |
| syn match forthInteger '\<#-\=\d\+\.\=\>' |
| syn match forthInteger '\<\$-\=\x\+\.\=\>' |
| syn match forthInteger '\<%-\=[01]\+\.\=\>' |
| |
| " characters {{{2 |
| syn match forthCharacter "'\k'" |
| |
| " strings {{{2 |
| |
| " Words that end with " are assumed to start string parsing. |
| " This includes standard words: S" ." |
| syn region forthString matchgroup=forthString start=+\<\S\+"\s+ end=+"+ end=+$+ contains=@Spell |
| " extension words |
| syn region forthString matchgroup=forthString start=+\<C"\s+ end=+"+ end=+$+ contains=@Spell |
| " Matches S\" |
| syn region forthString matchgroup=forthString start=+\<S\\"\s+ end=+"+ end=+$+ contains=@Spell,forthEscape |
| |
| syn match forthEscape +\C\\[abeflmnqrtvz"\\]+ contained |
| syn match forthEscape "\C\\x\x\x" contained |
| |
| " comments {{{2 |
| |
| syn keyword forthTodo contained TODO FIXME XXX |
| |
| " Some special, non-FORTH keywords |
| syn match forthTodo contained "\<\%(TODO\|FIXME\|XXX\)\%(\>\|:\@=\)" |
| |
| " XXX If you find this overkill you can remove it. This has to come after the |
| " highlighting for numbers and booleans otherwise it has no effect. |
| syn region forthComment start='\<\%(0\|FALSE\)\s\+\[IF]' end='\<\[ENDIF]' end='\<\[THEN]' contains=forthTodo |
| |
| if get(g:, "forth_no_comment_fold", 0) |
| syn region forthComment start='\<(\>' end=')' contains=@Spell,forthTodo,forthSpaceError |
| " extension words |
| syn match forthComment '\<\\\>.*$' contains=@Spell,forthTodo,forthSpaceError |
| else |
| syn region forthComment start='\<(\>' end=')' contains=@Spell,forthTodo,forthSpaceError fold |
| " extension words |
| syn match forthComment '\<\\\>.*$' contains=@Spell,forthTodo,forthSpaceError |
| syn region forthMultilineComment start="^\s*\\\>" end="\n\%(\s*\\\>\)\@!" contains=forthComment transparent fold |
| endif |
| |
| " extension words |
| syn region forthComment start='\<\.(\>' end=')' end='$' contains=@Spell,forthTodo,forthSpaceError |
| |
| " ABORT {{{2 |
| syn keyword forthForth ABORT |
| syn region forthForth start=+\<ABORT"\s+ end=+"\>+ end=+$+ |
| |
| " The optional Block word set {{{1 |
| " Handled as Core words - REFILL |
| syn keyword forthBlocks BLK BLOCK BUFFER FLUSH LOAD SAVE-BUFFERS UPDATE |
| " extension words |
| syn keyword forthBlocks EMPTY-BUFFERS LIST SCR THRU |
| |
| " Non-standard Block words |
| syn keyword forthBlocks +LOAD +THRU --> BLOCK-INCLUDED BLOCK-OFFSET |
| syn keyword forthBlocks BLOCK-POSITION EMPTY-BUFFER GET-BLOCK-FID OPEN-BLOCKS |
| syn keyword forthBlocks SAVE-BUFFER UPDATED? USE |
| |
| " The optional Double-Number word set {{{1 |
| syn keyword forthConversion D>S |
| syn keyword forthDefine 2CONSTANT 2LITERAL 2VARIABLE |
| syn keyword forthFunction D. D.R |
| syn keyword forthOperators D+ D- D0= D2* D2/ D= DABS DMAX DMIN DNEGATE |
| syn keyword forthOperators D0< D< M+ M*/ |
| " extension words |
| syn keyword forthDefine 2VALUE |
| syn keyword forthOperators DU< |
| syn keyword forthStack 2ROT |
| |
| " Non-standard Double-Number words |
| syn keyword forthOperators D0<= D0<> D0> D0>= D<= D<> D> D>= DU<= DU> DU>= |
| syn keyword forthStack 2-ROT 2NIP 2RDROP 2TUCK |
| |
| " The optional Exception word set {{{1 |
| " Handled as Core words - ABORT ABORT" |
| syn keyword forthCond CATCH THROW |
| |
| " The optional Facility word set {{{1 |
| syn keyword forthCharOps AT-XY KEY? PAGE |
| " extension words |
| syn keyword forthCharOps EKEY EKEY>CHAR EKEY>FKEY EKEY? EMIT? K-ALT-MASK |
| syn keyword forthCharOps K-CTRL-MASK K-DELETE K-DOWN K-END K-F1 K-F10 K-F11 |
| syn keyword forthCharOps K-F12 K-F2 K-F3 K-F4 K-F5 K-F6 K-F7 K-F8 K-F9 K-HOME |
| syn keyword forthCharOps K-INSERT K-LEFT K-NEXT K-PRIOR K-RIGHT K-SHIFT-MASK |
| syn keyword forthCharOps K-UP |
| syn keyword forthDefine +FIELD BEGIN-STRUCTURE CFIELD: END-STRUCTURE FIELD: |
| syn keyword forthForth MS TIME&DATE |
| |
| " The optional File-Access word set {{{1 |
| " Handled as Core words - REFILL SOURCE-ID S\" S" ( |
| syn keyword forthFileMode BIN R/O R/W W/O |
| syn keyword forthFileWords CLOSE-FILE CREATE-FILE DELETE-FILE FILE-POSITION |
| syn keyword forthFileWords FILE-SIZE INCLUDE-FILE INCLUDED OPEN-FILE READ-FILE |
| syn keyword forthFileWords READ-LINE REPOSITION-FILE RESIZE-FILE WRITE-FILE |
| syn keyword forthFileWords WRITE-LINE |
| " extension words |
| syn keyword forthFileWords FILE-STATUS FLUSH-FILE RENAME-FILE REQUIRED |
| syn match forthInclude '\<INCLUDE\s\+\k\+' |
| syn match forthInclude '\<REQUIRE\s\+\k\+' |
| |
| " Non-standard File-Access words |
| syn keyword forthFileWords EMIT-FILE KEY-FILE KEY?-FILE SLURP-FID SLURP-FILE |
| syn keyword forthFileWords STDERR STDIN STDOUT |
| syn match forthInclude '^FLOAD\s\+' |
| syn match forthInclude '^NEEDS\s\+' |
| |
| " The optional Floating-Point word set {{{1 |
| |
| " numbers |
| syn match forthFloat '\<[+-]\=\d\+\.\=\d*[DdEe][+-]\=\d*\>' |
| |
| syn keyword forthConversion >FLOAT D>F F>D |
| syn keyword forthAdrArith FALIGN FALIGNED FLOAT+ FLOATS |
| syn keyword forthDefine FCONSTANT FLITERAL FVARIABLE |
| syn keyword forthFStack FDROP FDUP FOVER FROT FSWAP |
| syn keyword forthFunction REPRESENT |
| syn keyword forthMemory F! F@ |
| syn keyword forthOperators F* F+ F- F/ F0< F0= F< FLOOR FMAX FMIN FNEGATE |
| syn keyword forthOperators FROUND |
| syn keyword forthSP FDEPTH |
| " extension words |
| syn keyword forthConversion F>S S>F |
| syn keyword forthAdrArith DFALIGN DFALIGNED DFLOAT+ DFLOATS SFALIGN |
| syn keyword forthAdrArith SFALIGNED SFLOAT+ SFLOATS |
| syn keyword forthDefine DFFIELD: FFIELD: FVALUE SFFIELD: |
| syn keyword forthFunction F. FE. FS. PRECISION SET-PRECISION |
| syn keyword forthMemory DF! DF@ SF! SF@ |
| syn keyword forthOperators F** FABS FACOS FACOSH FALOG FASIN FASINH FATAN |
| syn keyword forthOperators FATAN2 FATANH FCOS FCOSH FEXP FEXPM1 FLN FLNP1 |
| syn keyword forthOperators FLOG FSIN FSINCOS FSINH FSQRT FTAN FTANH FTRUNC F~ |
| |
| " Non-standard Floating-Point words |
| syn keyword forthOperators 1/F F2* F2/ F~ABS F~REL |
| syn keyword forthFStack FNIP FTUCK |
| |
| " The optional Locals word set {{{1 |
| syn keyword forthForth (LOCAL) |
| " extension words |
| syn region forthLocals start="\<{:\>" end="\<:}\>" |
| syn region forthLocals start="\<LOCALS|\>" end="\<|\>" |
| |
| " Non-standard Locals words |
| syn region forthLocals start="\<{\>" end="\<}\>" |
| |
| " The optional Memory-Allocation word set {{{1 |
| syn keyword forthMemory ALLOCATE FREE RESIZE |
| |
| " The optional Programming-Tools wordset {{{1 |
| syn keyword forthDebug .S ? DUMP SEE WORDS |
| " extension words |
| syn keyword forthAssembler ;CODE ASSEMBLER CODE END-CODE |
| syn keyword forthCond AHEAD CS-PICK CS-ROLL |
| syn keyword forthDefine NAME>COMPILE NAME>INTERPRET NAME>STRING SYNONYM |
| syn keyword forthDefine TRAVERSE-WORDLIST |
| syn match forthDefine "\<\[DEFINED]\>" |
| syn match forthDefine "\<\[ELSE]\>" |
| syn match forthDefine "\<\[IF]\>" |
| syn match forthDefine "\<\[THEN]\>" |
| syn match forthDefine "\<\[UNDEFINED]\>" |
| syn keyword forthForth BYE FORGET |
| syn keyword forthStack N>R NR> |
| syn keyword forthVocs EDITOR |
| |
| " Non-standard Programming-Tools words |
| syn keyword forthAssembler FLUSH-ICACHE |
| syn keyword forthDebug PRINTDEBUGDATA PRINTDEBUGLINE |
| syn match forthDebug "\<\~\~\>" |
| syn match forthDefine "\<\[+LOOP]\>" |
| syn match forthDefine "\<\[?DO]\>" |
| syn match forthDefine "\<\[AGAIN]\>" |
| syn match forthDefine "\<\[BEGIN]\>" |
| syn match forthDefine "\<\[DO]\>" |
| syn match forthDefine "\<\[ENDIF]\>" |
| syn match forthDefine "\<\[IFDEF]\>" |
| syn match forthDefine "\<\[IFUNDEF]\>" |
| syn match forthDefine "\<\[LOOP]\>" |
| syn match forthDefine "\<\[NEXT]\>" |
| syn match forthDefine "\<\[REPEAT]\>" |
| syn match forthDefine "\<\[UNTIL]\>" |
| syn match forthDefine "\<\[WHILE]\>" |
| |
| " The optional Search-Order word set {{{1 |
| " Handled as Core words - FIND |
| syn keyword forthVocs DEFINITIONS FORTH-WORDLIST GET-CURRENT GET-ORDER |
| syn keyword forthVocs SEARCH-WORDLIST SET-CURRENT SET-ORDER WORDLIST |
| " extension words |
| syn keyword forthVocs ALSO FORTH ONLY ORDER PREVIOUS |
| " Forth-79, Forth-83 |
| syn keyword forthVocs CONTEXT CURRENT VOCABULARY |
| |
| " Non-standard Search-Order words |
| syn keyword forthVocs #VOCS ROOT SEAL VOCS |
| |
| " The optional String word set {{{1 |
| syn keyword forthFunction -TRAILING /STRING BLANK CMOVE CMOVE> COMPARE SEARCH |
| syn keyword forthFunction SLITERAL |
| " extension words |
| syn keyword forthFunction REPLACES SUBSTITUTE UNESCAPE |
| |
| " The optional Extended-Character word set {{{1 |
| " Handled as Core words - [CHAR] CHAR and PARSE |
| syn keyword forthAdrArith XCHAR+ |
| syn keyword forthCharOps X-SIZE XC-SIZE XEMIT XKEY XKEY? |
| syn keyword forthDefine XC, |
| syn keyword forthMemory XC!+ XC!+? XC@+ |
| " extension words |
| syn keyword forthAdrArith XCHAR- +X/STRING X\\STRING- |
| syn keyword forthCharOps EKEY>XCHAR X-WIDTH XC-WIDTH |
| syn keyword forthConversion XHOLD |
| syn keyword forthString -TRAILING-GARBAGE |
| |
| " Define the default highlighting {{{1 |
| hi def link forthBoolean Boolean |
| hi def link forthCharacter Character |
| hi def link forthTodo Todo |
| hi def link forthOperators Operator |
| hi def link forthMath Number |
| hi def link forthInteger Number |
| hi def link forthFloat Float |
| hi def link forthStack Special |
| hi def link forthRstack Special |
| hi def link forthFStack Special |
| hi def link forthSP Special |
| hi def link forthMemory Function |
| hi def link forthAdrArith Function |
| hi def link forthMemBlks Function |
| hi def link forthCond Conditional |
| hi def link forthLoop Repeat |
| hi def link forthColonDef Define |
| hi def link forthEndOfColonDef Define |
| hi def link forthDefine Define |
| hi def link forthDebug Debug |
| hi def link forthAssembler Include |
| hi def link forthCharOps Character |
| hi def link forthConversion String |
| hi def link forthForth Statement |
| hi def link forthVocs Statement |
| hi def link forthEscape Special |
| hi def link forthString String |
| hi def link forthComment Comment |
| hi def link forthClassDef Define |
| hi def link forthEndOfClassDef Define |
| hi def link forthObjectDef Define |
| hi def link forthEndOfObjectDef Define |
| hi def link forthInclude Include |
| hi def link forthLocals Type " nothing else uses type and locals must stand out |
| hi def link forthFileMode Function |
| hi def link forthFunction Function |
| hi def link forthFileWords Statement |
| hi def link forthBlocks Statement |
| hi def link forthSpaceError Error |
| "}}} |
| |
| let b:current_syntax = "forth" |
| |
| let &cpo = s:cpo_save |
| unlet s:cpo_save |
| |
| " vim:ts=8:sw=4:nocindent:smartindent:fdm=marker:tw=78 |
| |