blob: bde954506ea10104cd7895812b661dfa61210733 [file] [log] [blame]
Bram Moolenaarbaca7f72013-09-22 14:42:24 +02001" Vim syntax file
2" Language: J
3" Maintainer: David Bürgin <676c7473@gmail.com>
Bram Moolenaara6878372014-03-22 21:02:50 +01004" URL: https://github.com/glts/vim-j
Bram Moolenaar822ff862014-06-12 21:46:14 +02005" Last Change: 2014-05-25
Bram Moolenaarbaca7f72013-09-22 14:42:24 +02006
Bram Moolenaara6878372014-03-22 21:02:50 +01007if exists('b:current_syntax')
Bram Moolenaarbaca7f72013-09-22 14:42:24 +02008 finish
9endif
10
Bram Moolenaar75b81562014-04-06 14:09:13 +020011let s:save_cpo = &cpo
12set cpo&vim
13
Bram Moolenaarbaca7f72013-09-22 14:42:24 +020014syntax case match
15syntax sync minlines=50
16
Bram Moolenaar75b81562014-04-06 14:09:13 +020017syntax cluster jStdlibItems contains=jStdlibNoun,jStdlibAdverb,jStdlibConjunction,jStdlibVerb
18syntax cluster jPrimitiveItems contains=jNoun,jAdverb,jConjunction,jVerb,jCopula
19
Bram Moolenaara6878372014-03-22 21:02:50 +010020syntax 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*\./
Bram Moolenaarbaca7f72013-09-22 14:42:24 +020022
Bram Moolenaar75b81562014-04-06 14:09:13 +020023" 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\)\>\.\@!/
Bram Moolenaarbaca7f72013-09-22 14:42:24 +020032
Bram Moolenaar75b81562014-04-06 14:09:13 +020033" Numbers. Matching J numbers is difficult. The regular expression used for
34" the general case roughly embodies this grammar sketch:
Bram Moolenaarbaca7f72013-09-22 14:42:24 +020035"
Bram Moolenaara6878372014-03-22 21:02:50 +010036" 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
Bram Moolenaarbaca7f72013-09-22 14:42:24 +020040"
Bram Moolenaara6878372014-03-22 21:02:50 +010041" The grammar is implemented as shown in this pseudo-regexp:
Bram Moolenaarbaca7f72013-09-22 14:42:24 +020042"
Bram Moolenaara6878372014-03-22 21:02:50 +010043" 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\+\)\=\)\=\)\)\=/
Bram Moolenaar822ff862014-06-12 21:46:14 +020049syntax match jNumber /\<_\=\d\+\%([eE]\d\+\)\=b_\=[0-9a-z]\+\%(\.[0-9a-z]\+\)\=/
Bram Moolenaara6878372014-03-22 21:02:50 +010050syntax match jNumber /\<__\=\>/
Bram Moolenaar75b81562014-04-06 14:09:13 +020051syntax match jNumber /\<_\./
Bram Moolenaara6878372014-03-22 21:02:50 +010052syntax match jNumber /\<_\=\d\+x\>/
Bram Moolenaarbaca7f72013-09-22 14:42:24 +020053
Bram Moolenaar75b81562014-04-06 14:09:13 +020054syntax 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
Bram Moolenaar822ff862014-06-12 21:46:14 +020067" Explicit noun definition. The difficulty is that the define expression can
68" occur in the middle of a line but the jNounDefine region must only start on
69" the next line. The trick is to split the problem into two regions and link
70" them with "nextgroup=". The fold wrapper provides syntax folding.
71syntax region jNounDefineFold
72 \ matchgroup=NONE start=/\<\%(\%(0\|noun\)\s\+\%(\:\s*0\|def\s\+0\|define\)\>\)\@=/
73 \ keepend matchgroup=NONE end=/^\s*)\s*$/
74 \ contains=jNounDefineStart
75 \ fold
Bram Moolenaar75b81562014-04-06 14:09:13 +020076syntax region jNounDefineStart
77 \ matchgroup=jDefineExpression start=/\<\%(0\|noun\)\s\+\%(\:\s*0\|def\s\+0\|define\)\>/
78 \ keepend matchgroup=NONE end=/$/
79 \ contains=@jStdlibItems,@jPrimitiveItems,jNumber,jString,jParenGroup,jParen,jComment
Bram Moolenaar822ff862014-06-12 21:46:14 +020080 \ contained oneline skipempty nextgroup=jDefineEnd,jNounDefine
Bram Moolenaar75b81562014-04-06 14:09:13 +020081" These two items must have "contained", which allows them to match only after
82" jNounDefineStart thanks to the "nextgroup=" above.
83syntax region jNounDefine
84 \ matchgroup=NONE start=/^/
85 \ matchgroup=jDefineEnd end=/^\s*)\s*$/
86 \ contained
87" This match is necessary in case of an empty noun definition
88syntax match jDefineEnd contained /^\s*)\s*$/
89
90" Explicit verb, adverb, and conjunction definition
91syntax region jDefine
92 \ matchgroup=jDefineExpression start=/\<\%([1-4]\|13\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\>/
93 \ matchgroup=jDefineEnd end=/^\s*)\s*$/
94 \ contains=jControl,@jStdlibItems,@jPrimitiveItems,jNumber,jString,jArgument,jParenGroup,jParen,jComment,jDefineMonadDyad
Bram Moolenaar822ff862014-06-12 21:46:14 +020095 \ fold
Bram Moolenaar75b81562014-04-06 14:09:13 +020096syntax match jDefineMonadDyad contained /^\s*:\s*$/
97
98" Paired parentheses. When a jDefineExpression such as "3 : 0" is
99" parenthesised it will erroneously extend jParenGroup to span over the whole
100" definition body. This situation receives a special treatment here.
101syntax match jParen /(\%(\s*\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\s*)\)\@=/
102syntax match jParen contained /\%((\s*\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\s*\)\@<=)/
103syntax region jParenGroup
104 \ matchgroup=jParen start=/(\%(\s*\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\>\)\@!/
105 \ matchgroup=jParen end=/)/
106 \ oneline transparent
107
108syntax keyword jTodo contained TODO FIXME XXX
Bram Moolenaara6878372014-03-22 21:02:50 +0100109syntax match jComment /NB\..*$/ contains=jTodo,@Spell
Bram Moolenaar75b81562014-04-06 14:09:13 +0200110
Bram Moolenaara6878372014-03-22 21:02:50 +0100111syntax match jSharpBang /\%^#!.*$/
Bram Moolenaarbaca7f72013-09-22 14:42:24 +0200112
Bram Moolenaar75b81562014-04-06 14:09:13 +0200113highlight default link jControl Statement
114highlight default link jStdlibNoun Identifier
115highlight default link jStdlibAdverb Function
116highlight default link jStdlibConjunction Function
117highlight default link jStdlibVerb Function
118highlight default link jString String
119highlight default link jNumber Number
120highlight default link jNoun Constant
121highlight default link jAdverb Normal
122highlight default link jConjunction Normal
123highlight default link jVerb Normal
124highlight default link jCopula Normal
125highlight default link jArgument Identifier
126highlight default link jParen Delimiter
127
128highlight default link jDefineExpression Define
129highlight default link jDefineMonadDyad Delimiter
130highlight default link jDefineEnd Delimiter
131highlight default link jNounDefine Normal
132
133highlight default link jTodo Todo
134highlight default link jComment Comment
135highlight default link jSharpBang PreProc
Bram Moolenaarbaca7f72013-09-22 14:42:24 +0200136
Bram Moolenaara6878372014-03-22 21:02:50 +0100137let b:current_syntax = 'j'
Bram Moolenaar75b81562014-04-06 14:09:13 +0200138
139let &cpo = s:save_cpo
140unlet s:save_cpo