1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 | function erlang(hljs) {
|
11 | const BASIC_ATOM_RE = '[a-z\'][a-zA-Z0-9_\']*';
|
12 | const FUNCTION_NAME_RE = '(' + BASIC_ATOM_RE + ':' + BASIC_ATOM_RE + '|' + BASIC_ATOM_RE + ')';
|
13 | const ERLANG_RESERVED = {
|
14 | keyword:
|
15 | 'after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if ' +
|
16 | 'let not of orelse|10 query receive rem try when xor',
|
17 | literal:
|
18 | 'false true'
|
19 | };
|
20 |
|
21 | const COMMENT = hljs.COMMENT('%', '$');
|
22 | const NUMBER = {
|
23 | className: 'number',
|
24 | begin: '\\b(\\d+(_\\d+)*#[a-fA-F0-9]+(_[a-fA-F0-9]+)*|\\d+(_\\d+)*(\\.\\d+(_\\d+)*)?([eE][-+]?\\d+)?)',
|
25 | relevance: 0
|
26 | };
|
27 | const NAMED_FUN = {
|
28 | begin: 'fun\\s+' + BASIC_ATOM_RE + '/\\d+'
|
29 | };
|
30 | const FUNCTION_CALL = {
|
31 | begin: FUNCTION_NAME_RE + '\\(',
|
32 | end: '\\)',
|
33 | returnBegin: true,
|
34 | relevance: 0,
|
35 | contains: [
|
36 | {
|
37 | begin: FUNCTION_NAME_RE,
|
38 | relevance: 0
|
39 | },
|
40 | {
|
41 | begin: '\\(',
|
42 | end: '\\)',
|
43 | endsWithParent: true,
|
44 | returnEnd: true,
|
45 | relevance: 0
|
46 |
|
47 | }
|
48 | ]
|
49 | };
|
50 | const TUPLE = {
|
51 | begin: /\{/,
|
52 | end: /\}/,
|
53 | relevance: 0
|
54 |
|
55 | };
|
56 | const VAR1 = {
|
57 | begin: '\\b_([A-Z][A-Za-z0-9_]*)?',
|
58 | relevance: 0
|
59 | };
|
60 | const VAR2 = {
|
61 | begin: '[A-Z][a-zA-Z0-9_]*',
|
62 | relevance: 0
|
63 | };
|
64 | const RECORD_ACCESS = {
|
65 | begin: '#' + hljs.UNDERSCORE_IDENT_RE,
|
66 | relevance: 0,
|
67 | returnBegin: true,
|
68 | contains: [
|
69 | {
|
70 | begin: '#' + hljs.UNDERSCORE_IDENT_RE,
|
71 | relevance: 0
|
72 | },
|
73 | {
|
74 | begin: /\{/,
|
75 | end: /\}/,
|
76 | relevance: 0
|
77 |
|
78 | }
|
79 | ]
|
80 | };
|
81 |
|
82 | const BLOCK_STATEMENTS = {
|
83 | beginKeywords: 'fun receive if try case',
|
84 | end: 'end',
|
85 | keywords: ERLANG_RESERVED
|
86 | };
|
87 | BLOCK_STATEMENTS.contains = [
|
88 | COMMENT,
|
89 | NAMED_FUN,
|
90 | hljs.inherit(hljs.APOS_STRING_MODE, {
|
91 | className: ''
|
92 | }),
|
93 | BLOCK_STATEMENTS,
|
94 | FUNCTION_CALL,
|
95 | hljs.QUOTE_STRING_MODE,
|
96 | NUMBER,
|
97 | TUPLE,
|
98 | VAR1,
|
99 | VAR2,
|
100 | RECORD_ACCESS
|
101 | ];
|
102 |
|
103 | const BASIC_MODES = [
|
104 | COMMENT,
|
105 | NAMED_FUN,
|
106 | BLOCK_STATEMENTS,
|
107 | FUNCTION_CALL,
|
108 | hljs.QUOTE_STRING_MODE,
|
109 | NUMBER,
|
110 | TUPLE,
|
111 | VAR1,
|
112 | VAR2,
|
113 | RECORD_ACCESS
|
114 | ];
|
115 | FUNCTION_CALL.contains[1].contains = BASIC_MODES;
|
116 | TUPLE.contains = BASIC_MODES;
|
117 | RECORD_ACCESS.contains[1].contains = BASIC_MODES;
|
118 |
|
119 | const DIRECTIVES = [
|
120 | "-module",
|
121 | "-record",
|
122 | "-undef",
|
123 | "-export",
|
124 | "-ifdef",
|
125 | "-ifndef",
|
126 | "-author",
|
127 | "-copyright",
|
128 | "-doc",
|
129 | "-vsn",
|
130 | "-import",
|
131 | "-include",
|
132 | "-include_lib",
|
133 | "-compile",
|
134 | "-define",
|
135 | "-else",
|
136 | "-endif",
|
137 | "-file",
|
138 | "-behaviour",
|
139 | "-behavior",
|
140 | "-spec"
|
141 | ];
|
142 |
|
143 | const PARAMS = {
|
144 | className: 'params',
|
145 | begin: '\\(',
|
146 | end: '\\)',
|
147 | contains: BASIC_MODES
|
148 | };
|
149 | return {
|
150 | name: 'Erlang',
|
151 | aliases: ['erl'],
|
152 | keywords: ERLANG_RESERVED,
|
153 | illegal: '(</|\\*=|\\+=|-=|/\\*|\\*/|\\(\\*|\\*\\))',
|
154 | contains: [
|
155 | {
|
156 | className: 'function',
|
157 | begin: '^' + BASIC_ATOM_RE + '\\s*\\(',
|
158 | end: '->',
|
159 | returnBegin: true,
|
160 | illegal: '\\(|#|//|/\\*|\\\\|:|;',
|
161 | contains: [
|
162 | PARAMS,
|
163 | hljs.inherit(hljs.TITLE_MODE, {
|
164 | begin: BASIC_ATOM_RE
|
165 | })
|
166 | ],
|
167 | starts: {
|
168 | end: ';|\\.',
|
169 | keywords: ERLANG_RESERVED,
|
170 | contains: BASIC_MODES
|
171 | }
|
172 | },
|
173 | COMMENT,
|
174 | {
|
175 | begin: '^-',
|
176 | end: '\\.',
|
177 | relevance: 0,
|
178 | excludeEnd: true,
|
179 | returnBegin: true,
|
180 | keywords: {
|
181 | $pattern: '-' + hljs.IDENT_RE,
|
182 | keyword: DIRECTIVES.map(x => `${x}|1.5`).join(" ")
|
183 | },
|
184 | contains: [PARAMS]
|
185 | },
|
186 | NUMBER,
|
187 | hljs.QUOTE_STRING_MODE,
|
188 | RECORD_ACCESS,
|
189 | VAR1,
|
190 | VAR2,
|
191 | TUPLE,
|
192 | {
|
193 | begin: /\.$/
|
194 | }
|
195 | ]
|
196 | };
|
197 | }
|
198 |
|
199 | export { erlang as default };
|