UNPKG

4.27 kBJavaScriptView Raw
1/*
2Language: Erlang
3Description: Erlang is a general-purpose functional language, with strict evaluation, single assignment, and dynamic typing.
4Author: Nikolay Zakharov <nikolay.desh@gmail.com>, Dmitry Kovega <arhibot@gmail.com>
5Website: https://www.erlang.org
6Category: functional
7*/
8
9/** @type LanguageFn */
10function 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 // "contains" defined later
47 }
48 ]
49 };
50 const TUPLE = {
51 begin: /\{/,
52 end: /\}/,
53 relevance: 0
54 // "contains" defined later
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 // "contains" defined later
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 } // relevance booster
195 ]
196 };
197}
198
199export { erlang as default };