xref: /vim-8.2.3635/runtime/syntax/j.vim (revision e968e36a)
1" Vim syntax file
2" Language:	J
3" Maintainer:	David Bürgin <[email protected]>
4" URL:		https://github.com/glts/vim-j
5" Last Change:	2014-04-05
6
7if exists('b:current_syntax')
8  finish
9endif
10
11let s:save_cpo = &cpo
12set cpo&vim
13
14syntax case match
15syntax sync minlines=50
16
17syntax cluster jStdlibItems contains=jStdlibNoun,jStdlibAdverb,jStdlibConjunction,jStdlibVerb
18syntax cluster jPrimitiveItems contains=jNoun,jAdverb,jConjunction,jVerb,jCopula
19
20syntax match jControl /\<\%(assert\|break\|case\|catch[dt]\=\|continue\|do\|else\%(if\)\=\|end\|fcase\|for\|if\|return\|select\|throw\|try\|whil\%(e\|st\)\)\./
21syntax match jControl /\<\%(for\|goto\|label\)_\a\k*\./
22
23" Standard library names. A few names need to be defined with ":syntax match"
24" because they would otherwise take precedence over the corresponding jControl
25" and jDefineExpression items.
26syntax keyword jStdlibNoun ARGV BINPATH CR CRLF DEL Debug EAV EMPTY FF FHS IF64 IFIOS IFJCDROID IFJHS IFQT IFRASPI IFUNIX IFWIN IFWINCE IFWINE IFWOW64 JB01 JBOXED JCHAR JCMPX JFL JINT JPTR JSIZES JSTR JTYPES JVERSION LF LF2 TAB UNAME UNXLIB andurl dbhelp libjqt
27syntax keyword jStdlibAdverb define each every fapplylines inv inverse items leaf rows table
28syntax keyword jStdlibConjunction bind cuts def on
29syntax keyword jStdlibVerb AND Endian IFDEF Note OR XOR alpha17 alpha27 anddf android_exec_host andunzip apply boxopen boxxopen bx calendar cd cdcb cder cderx cdf charsub chopstring clear coclass cocreate cocurrent codestroy coerase cofind cofindv cofullname coinfo coinsert coname conames conew conl conouns conounsx copath copathnl copathnlx coreset costate cut cutLF cutopen cutpara datatype dbctx dberm dberr dbg dbjmp dblocals dblxq dblxs dbnxt dbq dbr dbret dbrr dbrrx dbrun dbs dbsig dbsq dbss dbst dbstack dbstk dbstop dbstopme dbstopnext dbstops dbtrace dbview deb debc delstring detab dfh dir dircompare dircompares dirfind dirpath dirss dirssrplc dirtree dirused dlb dltb dltbs dquote drop dropafter dropto dtb dtbs echo empty endian erase evtloop exit expand f2utf8 fappend fappends fboxname fc fcopynew fdir ferase fetch fexist fexists fgets file2url fixdotdot fliprgb fmakex foldpara foldtext fpathcreate fpathname fputs fread freadblock freadr freads frename freplace fsize fss fssrplc fstamp fstringreplace ftype fview fwrite fwritenew fwrites getargs getdate getenv getqtbin hfd hostpathsep ic install iospath isatty isotimestamp isutf8 jcwdpath joinstring jpathsep jsystemdefs list ljust load loadd mema memf memr memw nameclass namelist names nc nl pick quote require rjust rplc script scriptd setbreak show sign sminfo smoutput sort split splitnostring splitstring ss startupandroid startupconsole startupide stderr stdin stdout stringreplace symdat symget symset take takeafter taketo timespacex timestamp timex tmoutput toCRLF toHOST toJ todate todayno tolower topara toupper tsdiff tsrep tstamp type ucp ucpcount unxlib usleep utf8 uucp valdate wcsize weekday weeknumber weeksinyear winpathsep
30syntax match jStdlibNoun /\<\%(adverb\|conjunction\|dyad\|monad\|noun\|verb\)\>/
31syntax match jStdlibVerb /\<\%(assert\|break\|do\)\>\.\@!/
32
33" Numbers. Matching J numbers is difficult. The regular expression used for
34" the general case roughly embodies this grammar sketch:
35"
36"     BASE     := /_?\d+(\.\d*)?([eE]_?\d+)?/
37"     RATIONAL := BASE  |  BASE r BASE
38"     COMPLEX  := BASE  |  BASE (j|a[dr]) BASE
39"     JNUMBER  := RATIONAL  |  RATIONAL [px] RATIONAL  |  COMPLEX  |  COMPLEX [px] COMPLEX
40"
41" The grammar is implemented as shown in this pseudo-regexp:
42"
43"        base         rational                       complex                       remainder
44"     /\< B  (  [r]B ([px]B([r]B)?)?  |  (j|a[dr])B ([px]B((j|a[dr])B)?)?  |  [px]B ((j|a[dr]|r)B)?  )?/
45"
46" All in all, a compromise between correctness and practicality had to be
47" made. See http://www.jsoftware.com/help/dictionary/dcons.htm for reference.
48syntax match jNumber /\<_\=\d\+\%(\.\d*\)\=\%([eE]_\=\d\+\)\=\%(\%(r_\=\d\+\%(\.\d*\)\=\%([eE]_\=\d\+\)\=\%([px]_\=\d\+\%(\.\d*\)\=\%([eE]_\=\d\+\)\=\%(r_\=\d\+\%(\.\d*\)\=\%([eE]_\=\d\+\)\=\)\=\)\=\)\|\%(\%(j\|a[dr]\)_\=\d\+\%(\.\d*\)\=\%([eE]_\=\d\+\)\=\%([px]_\=\d\+\%(\.\d*\)\=\%([eE]_\=\d\+\)\=\%(\%(j\|a[dr]\)_\=\d\+\%(\.\d*\)\=\%([eE]_\=\d\+\)\=\)\=\)\=\)\|\%([px]_\=\d\+\%(\.\d*\)\=\%([eE]_\=\d\+\)\=\%(\%(j\|a[dr]\|r\)_\=\d\+\%(\.\d*\)\=\%([eE]_\=\d\+\)\=\)\=\)\)\=/
49syntax match jNumber /\<_\=\d\+\%([eE]\d\+\)\=b_\=[0-9a-z]\+/
50syntax match jNumber /\<__\=\>/
51syntax match jNumber /\<_\./
52syntax match jNumber /\<_\=\d\+x\>/
53
54syntax region jString oneline start=/'/ skip=/''/ end=/'/
55
56syntax keyword jArgument contained x y u v m n
57
58" Primitives. Order is significant both within the patterns and among
59" ":syntax match" statements. Refer to "Parts of speech" in the J dictionary.
60syntax match jNoun /\<a[.:]/
61syntax match jAdverb /[}~]\|[/\\]\.\=\|\<\%([Mbft]\.\|t:\)/
62syntax match jConjunction /"\|`:\=\|[.:@&][.:]\=\|&\.:\|\<\%([dDHT]\.\|[DLS]:\)/
63syntax match jVerb /[=!\]]\|[\^?]\.\=\|[;[]:\=\|{\.\|[_/\\]:\|[<>+*\-%$|,#][.:]\=\|[~}"][.:]\|{\%[::]\|\<\%([ACeEiIjLor]\.\|p\.\.\=\|[ipqsux]:\|0:\|_\=[1-9]:\)/
64syntax match jCopula /=[.:]/
65syntax match jConjunction /;\.\|\^:\|![.:]/
66
67" Explicit noun definition. The difficulty is that the define expression
68" "0 : 0" can occur in the middle of a line but the jNounDefine region must
69" only start on the next line. The trick is to split the problem into two
70" regions and link them with "nextgroup=".
71syntax region jNounDefineStart
72    \ matchgroup=jDefineExpression start=/\<\%(0\|noun\)\s\+\%(\:\s*0\|def\s\+0\|define\)\>/
73    \ keepend matchgroup=NONE end=/$/
74    \ contains=@jStdlibItems,@jPrimitiveItems,jNumber,jString,jParenGroup,jParen,jComment
75    \ oneline skipempty nextgroup=jDefineEnd,jNounDefine
76" These two items must have "contained", which allows them to match only after
77" jNounDefineStart thanks to the "nextgroup=" above.
78syntax region jNounDefine
79    \ matchgroup=NONE start=/^/
80    \ matchgroup=jDefineEnd end=/^\s*)\s*$/
81    \ contained
82" This match is necessary in case of an empty noun definition
83syntax match jDefineEnd contained /^\s*)\s*$/
84
85" Explicit verb, adverb, and conjunction definition
86syntax region jDefine
87    \ matchgroup=jDefineExpression start=/\<\%([1-4]\|13\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\>/
88    \ matchgroup=jDefineEnd end=/^\s*)\s*$/
89    \ contains=jControl,@jStdlibItems,@jPrimitiveItems,jNumber,jString,jArgument,jParenGroup,jParen,jComment,jDefineMonadDyad
90syntax match jDefineMonadDyad contained /^\s*:\s*$/
91
92" Paired parentheses. When a jDefineExpression such as "3 : 0" is
93" parenthesised it will erroneously extend jParenGroup to span over the whole
94" definition body. This situation receives a special treatment here.
95syntax match jParen /(\%(\s*\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\s*)\)\@=/
96syntax match jParen contained /\%((\s*\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\s*\)\@<=)/
97syntax region jParenGroup
98    \ matchgroup=jParen start=/(\%(\s*\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\>\)\@!/
99    \ matchgroup=jParen end=/)/
100    \ oneline transparent
101
102syntax keyword jTodo contained TODO FIXME XXX
103syntax match jComment /NB\..*$/ contains=jTodo,@Spell
104
105syntax match jSharpBang /\%^#!.*$/
106
107highlight default link jControl           Statement
108highlight default link jStdlibNoun        Identifier
109highlight default link jStdlibAdverb      Function
110highlight default link jStdlibConjunction Function
111highlight default link jStdlibVerb        Function
112highlight default link jString            String
113highlight default link jNumber            Number
114highlight default link jNoun              Constant
115highlight default link jAdverb            Normal
116highlight default link jConjunction       Normal
117highlight default link jVerb              Normal
118highlight default link jCopula            Normal
119highlight default link jArgument          Identifier
120highlight default link jParen             Delimiter
121
122highlight default link jDefineExpression  Define
123highlight default link jDefineMonadDyad   Delimiter
124highlight default link jDefineEnd         Delimiter
125highlight default link jNounDefine        Normal
126
127highlight default link jTodo              Todo
128highlight default link jComment           Comment
129highlight default link jSharpBang         PreProc
130
131let b:current_syntax = 'j'
132
133let &cpo = s:save_cpo
134unlet s:save_cpo
135