1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 | function 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 |
|
139 | module.exports = lisp;
|