UNPKG

2.61 kBJavaScriptView Raw
1/*
2Language: Lisp
3Description: Generic lisp syntax
4Author: Vasily Polovnyov <vast@whiteants.net>
5Category: lisp
6*/
7
8function lisp(hljs) {
9 const LISP_IDENT_RE = '[a-zA-Z_\\-+\\*\\/<=>&#][a-zA-Z0-9_\\-+*\\/<=>&#!]*';
10 const MEC_RE = '\\|[^]*?\\|';
11 const LISP_SIMPLE_NUMBER_RE = '(-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s|D|E|F|L|S)(\\+|-)?\\d+)?';
12 const LITERAL = {
13 className: 'literal',
14 begin: '\\b(t{1}|nil)\\b'
15 };
16 const NUMBER = {
17 className: 'number',
18 variants: [
19 {
20 begin: LISP_SIMPLE_NUMBER_RE,
21 relevance: 0
22 },
23 { begin: '#(b|B)[0-1]+(/[0-1]+)?' },
24 { begin: '#(o|O)[0-7]+(/[0-7]+)?' },
25 { begin: '#(x|X)[0-9a-fA-F]+(/[0-9a-fA-F]+)?' },
26 {
27 begin: '#(c|C)\\(' + LISP_SIMPLE_NUMBER_RE + ' +' + LISP_SIMPLE_NUMBER_RE,
28 end: '\\)'
29 }
30 ]
31 };
32 const STRING = hljs.inherit(hljs.QUOTE_STRING_MODE, { illegal: null });
33 const COMMENT = hljs.COMMENT(
34 ';', '$',
35 { relevance: 0 }
36 );
37 const VARIABLE = {
38 begin: '\\*',
39 end: '\\*'
40 };
41 const KEYWORD = {
42 className: 'symbol',
43 begin: '[:&]' + LISP_IDENT_RE
44 };
45 const IDENT = {
46 begin: LISP_IDENT_RE,
47 relevance: 0
48 };
49 const MEC = { begin: MEC_RE };
50 const QUOTED_LIST = {
51 begin: '\\(',
52 end: '\\)',
53 contains: [
54 'self',
55 LITERAL,
56 STRING,
57 NUMBER,
58 IDENT
59 ]
60 };
61 const QUOTED = {
62 contains: [
63 NUMBER,
64 STRING,
65 VARIABLE,
66 KEYWORD,
67 QUOTED_LIST,
68 IDENT
69 ],
70 variants: [
71 {
72 begin: '[\'`]\\(',
73 end: '\\)'
74 },
75 {
76 begin: '\\(quote ',
77 end: '\\)',
78 keywords: { name: 'quote' }
79 },
80 { begin: '\'' + MEC_RE }
81 ]
82 };
83 const QUOTED_ATOM = { variants: [
84 { begin: '\'' + LISP_IDENT_RE },
85 { begin: '#\'' + LISP_IDENT_RE + '(::' + LISP_IDENT_RE + ')*' }
86 ] };
87 const LIST = {
88 begin: '\\(\\s*',
89 end: '\\)'
90 };
91 const BODY = {
92 endsWithParent: true,
93 relevance: 0
94 };
95 LIST.contains = [
96 {
97 className: 'name',
98 variants: [
99 {
100 begin: LISP_IDENT_RE,
101 relevance: 0,
102 },
103 { begin: MEC_RE }
104 ]
105 },
106 BODY
107 ];
108 BODY.contains = [
109 QUOTED,
110 QUOTED_ATOM,
111 LIST,
112 LITERAL,
113 NUMBER,
114 STRING,
115 COMMENT,
116 VARIABLE,
117 KEYWORD,
118 MEC,
119 IDENT
120 ];
121
122 return {
123 name: 'Lisp',
124 illegal: /\S/,
125 contains: [
126 NUMBER,
127 hljs.SHEBANG(),
128 LITERAL,
129 STRING,
130 COMMENT,
131 QUOTED,
132 QUOTED_ATOM,
133 LIST,
134 IDENT
135 ]
136 };
137}
138
139module.exports = lisp;