xref: /vim-8.2.3635/runtime/syntax/forth.vim (revision 6c391a74)
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