|
""" |
|
pygments.lexers.j |
|
~~~~~~~~~~~~~~~~~ |
|
|
|
Lexer for the J programming language. |
|
|
|
:copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. |
|
:license: BSD, see LICENSE for details. |
|
""" |
|
|
|
from pygments.lexer import RegexLexer, words, include, bygroups |
|
from pygments.token import Comment, Keyword, Name, Number, Operator, \ |
|
Punctuation, String, Whitespace |
|
|
|
__all__ = ['JLexer'] |
|
|
|
|
|
class JLexer(RegexLexer): |
|
""" |
|
For J source code. |
|
""" |
|
|
|
name = 'J' |
|
url = 'http://jsoftware.com/' |
|
aliases = ['j'] |
|
filenames = ['*.ijs'] |
|
mimetypes = ['text/x-j'] |
|
version_added = '2.1' |
|
|
|
validName = r'\b[a-zA-Z]\w*' |
|
|
|
tokens = { |
|
'root': [ |
|
|
|
(r'#!.*$', Comment.Preproc), |
|
|
|
|
|
(r'NB\..*', Comment.Single), |
|
(r'(\n+\s*)(Note)', bygroups(Whitespace, Comment.Multiline), |
|
'comment'), |
|
(r'(\s*)(Note.*)', bygroups(Whitespace, Comment.Single)), |
|
|
|
|
|
(r'\s+', Whitespace), |
|
|
|
|
|
(r"'", String, 'singlequote'), |
|
|
|
|
|
(r'0\s+:\s*0', Name.Entity, 'nounDefinition'), |
|
(r'(noun)(\s+)(define)(\s*)$', bygroups(Name.Entity, Whitespace, |
|
Name.Entity, Whitespace), 'nounDefinition'), |
|
(r'([1-4]|13)\s+:\s*0\b', |
|
Name.Function, 'explicitDefinition'), |
|
(r'(adverb|conjunction|dyad|monad|verb)(\s+)(define)\b', |
|
bygroups(Name.Function, Whitespace, Name.Function), |
|
'explicitDefinition'), |
|
|
|
|
|
(words(('for_', 'goto_', 'label_'), suffix=validName+r'\.'), Name.Label), |
|
(words(( |
|
'assert', 'break', 'case', 'catch', 'catchd', |
|
'catcht', 'continue', 'do', 'else', 'elseif', |
|
'end', 'fcase', 'for', 'if', 'return', |
|
'select', 'throw', 'try', 'while', 'whilst', |
|
), suffix=r'\.'), Name.Label), |
|
|
|
|
|
(validName, Name.Variable), |
|
|
|
|
|
(words(( |
|
'ARGV', 'CR', 'CRLF', 'DEL', 'Debug', |
|
'EAV', 'EMPTY', 'FF', 'JVERSION', 'LF', |
|
'LF2', 'Note', 'TAB', 'alpha17', 'alpha27', |
|
'apply', 'bind', 'boxopen', 'boxxopen', 'bx', |
|
'clear', 'cutLF', 'cutopen', 'datatype', 'def', |
|
'dfh', 'drop', 'each', 'echo', 'empty', |
|
'erase', 'every', 'evtloop', 'exit', 'expand', |
|
'fetch', 'file2url', 'fixdotdot', 'fliprgb', 'getargs', |
|
'getenv', 'hfd', 'inv', 'inverse', 'iospath', |
|
'isatty', 'isutf8', 'items', 'leaf', 'list', |
|
'nameclass', 'namelist', 'names', 'nc', |
|
'nl', 'on', 'pick', 'rows', |
|
'script', 'scriptd', 'sign', 'sminfo', 'smoutput', |
|
'sort', 'split', 'stderr', 'stdin', 'stdout', |
|
'table', 'take', 'timespacex', 'timex', 'tmoutput', |
|
'toCRLF', 'toHOST', 'toJ', 'tolower', 'toupper', |
|
'type', 'ucp', 'ucpcount', 'usleep', 'utf8', |
|
'uucp', |
|
)), Name.Function), |
|
|
|
|
|
(r'=[.:]', Operator), |
|
|
|
|
|
(r'[-=+*#$%@!~`^&";:.,<>{}\[\]\\|/?]', Operator), |
|
|
|
|
|
(r'[abCdDeEfHiIjLMoprtT]\.', Keyword.Reserved), |
|
(r'[aDiLpqsStux]\:', Keyword.Reserved), |
|
(r'(_[0-9])\:', Keyword.Constant), |
|
|
|
|
|
(r'\(', Punctuation, 'parentheses'), |
|
|
|
|
|
include('numbers'), |
|
], |
|
|
|
'comment': [ |
|
(r'[^)]', Comment.Multiline), |
|
(r'^\)', Comment.Multiline, '#pop'), |
|
(r'[)]', Comment.Multiline), |
|
], |
|
|
|
'explicitDefinition': [ |
|
(r'\b[nmuvxy]\b', Name.Decorator), |
|
include('root'), |
|
(r'[^)]', Name), |
|
(r'^\)', Name.Label, '#pop'), |
|
(r'[)]', Name), |
|
], |
|
|
|
'numbers': [ |
|
(r'\b_{1,2}\b', Number), |
|
(r'_?\d+(\.\d+)?(\s*[ejr]\s*)_?\d+(\.?=\d+)?', Number), |
|
(r'_?\d+\.(?=\d+)', Number.Float), |
|
(r'_?\d+x', Number.Integer.Long), |
|
(r'_?\d+', Number.Integer), |
|
], |
|
|
|
'nounDefinition': [ |
|
(r'[^)]+', String), |
|
(r'^\)', Name.Label, '#pop'), |
|
(r'[)]', String), |
|
], |
|
|
|
'parentheses': [ |
|
(r'\)', Punctuation, '#pop'), |
|
|
|
include('explicitDefinition'), |
|
include('root'), |
|
], |
|
|
|
'singlequote': [ |
|
(r"[^']+", String), |
|
(r"''", String), |
|
(r"'", String, '#pop'), |
|
], |
|
} |
|
|