1 |
|
2 |
|
3 |
|
4 | (function(mod) {
|
5 | if (typeof exports == "object" && typeof module == "object")
|
6 | mod(require("../../lib/codemirror"));
|
7 | else if (typeof define == "function" && define.amd)
|
8 | define(["../../lib/codemirror"], mod);
|
9 | else
|
10 | mod(CodeMirror);
|
11 | })(function(CodeMirror) {
|
12 | "use strict";
|
13 |
|
14 | CodeMirror.defineMode("gas", function(_config, parserConfig) {
|
15 | 'use strict';
|
16 |
|
17 |
|
18 |
|
19 |
|
20 | var custom = [];
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 | var lineCommentStartSymbol = "";
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 | var directives = {
|
34 | ".abort" : "builtin",
|
35 | ".align" : "builtin",
|
36 | ".altmacro" : "builtin",
|
37 | ".ascii" : "builtin",
|
38 | ".asciz" : "builtin",
|
39 | ".balign" : "builtin",
|
40 | ".balignw" : "builtin",
|
41 | ".balignl" : "builtin",
|
42 | ".bundle_align_mode" : "builtin",
|
43 | ".bundle_lock" : "builtin",
|
44 | ".bundle_unlock" : "builtin",
|
45 | ".byte" : "builtin",
|
46 | ".cfi_startproc" : "builtin",
|
47 | ".comm" : "builtin",
|
48 | ".data" : "builtin",
|
49 | ".def" : "builtin",
|
50 | ".desc" : "builtin",
|
51 | ".dim" : "builtin",
|
52 | ".double" : "builtin",
|
53 | ".eject" : "builtin",
|
54 | ".else" : "builtin",
|
55 | ".elseif" : "builtin",
|
56 | ".end" : "builtin",
|
57 | ".endef" : "builtin",
|
58 | ".endfunc" : "builtin",
|
59 | ".endif" : "builtin",
|
60 | ".equ" : "builtin",
|
61 | ".equiv" : "builtin",
|
62 | ".eqv" : "builtin",
|
63 | ".err" : "builtin",
|
64 | ".error" : "builtin",
|
65 | ".exitm" : "builtin",
|
66 | ".extern" : "builtin",
|
67 | ".fail" : "builtin",
|
68 | ".file" : "builtin",
|
69 | ".fill" : "builtin",
|
70 | ".float" : "builtin",
|
71 | ".func" : "builtin",
|
72 | ".global" : "builtin",
|
73 | ".gnu_attribute" : "builtin",
|
74 | ".hidden" : "builtin",
|
75 | ".hword" : "builtin",
|
76 | ".ident" : "builtin",
|
77 | ".if" : "builtin",
|
78 | ".incbin" : "builtin",
|
79 | ".include" : "builtin",
|
80 | ".int" : "builtin",
|
81 | ".internal" : "builtin",
|
82 | ".irp" : "builtin",
|
83 | ".irpc" : "builtin",
|
84 | ".lcomm" : "builtin",
|
85 | ".lflags" : "builtin",
|
86 | ".line" : "builtin",
|
87 | ".linkonce" : "builtin",
|
88 | ".list" : "builtin",
|
89 | ".ln" : "builtin",
|
90 | ".loc" : "builtin",
|
91 | ".loc_mark_labels" : "builtin",
|
92 | ".local" : "builtin",
|
93 | ".long" : "builtin",
|
94 | ".macro" : "builtin",
|
95 | ".mri" : "builtin",
|
96 | ".noaltmacro" : "builtin",
|
97 | ".nolist" : "builtin",
|
98 | ".octa" : "builtin",
|
99 | ".offset" : "builtin",
|
100 | ".org" : "builtin",
|
101 | ".p2align" : "builtin",
|
102 | ".popsection" : "builtin",
|
103 | ".previous" : "builtin",
|
104 | ".print" : "builtin",
|
105 | ".protected" : "builtin",
|
106 | ".psize" : "builtin",
|
107 | ".purgem" : "builtin",
|
108 | ".pushsection" : "builtin",
|
109 | ".quad" : "builtin",
|
110 | ".reloc" : "builtin",
|
111 | ".rept" : "builtin",
|
112 | ".sbttl" : "builtin",
|
113 | ".scl" : "builtin",
|
114 | ".section" : "builtin",
|
115 | ".set" : "builtin",
|
116 | ".short" : "builtin",
|
117 | ".single" : "builtin",
|
118 | ".size" : "builtin",
|
119 | ".skip" : "builtin",
|
120 | ".sleb128" : "builtin",
|
121 | ".space" : "builtin",
|
122 | ".stab" : "builtin",
|
123 | ".string" : "builtin",
|
124 | ".struct" : "builtin",
|
125 | ".subsection" : "builtin",
|
126 | ".symver" : "builtin",
|
127 | ".tag" : "builtin",
|
128 | ".text" : "builtin",
|
129 | ".title" : "builtin",
|
130 | ".type" : "builtin",
|
131 | ".uleb128" : "builtin",
|
132 | ".val" : "builtin",
|
133 | ".version" : "builtin",
|
134 | ".vtable_entry" : "builtin",
|
135 | ".vtable_inherit" : "builtin",
|
136 | ".warning" : "builtin",
|
137 | ".weak" : "builtin",
|
138 | ".weakref" : "builtin",
|
139 | ".word" : "builtin"
|
140 | };
|
141 |
|
142 | var registers = {};
|
143 |
|
144 | function x86(_parserConfig) {
|
145 | lineCommentStartSymbol = "#";
|
146 |
|
147 | registers.ax = "variable";
|
148 | registers.eax = "variable-2";
|
149 | registers.rax = "variable-3";
|
150 |
|
151 | registers.bx = "variable";
|
152 | registers.ebx = "variable-2";
|
153 | registers.rbx = "variable-3";
|
154 |
|
155 | registers.cx = "variable";
|
156 | registers.ecx = "variable-2";
|
157 | registers.rcx = "variable-3";
|
158 |
|
159 | registers.dx = "variable";
|
160 | registers.edx = "variable-2";
|
161 | registers.rdx = "variable-3";
|
162 |
|
163 | registers.si = "variable";
|
164 | registers.esi = "variable-2";
|
165 | registers.rsi = "variable-3";
|
166 |
|
167 | registers.di = "variable";
|
168 | registers.edi = "variable-2";
|
169 | registers.rdi = "variable-3";
|
170 |
|
171 | registers.sp = "variable";
|
172 | registers.esp = "variable-2";
|
173 | registers.rsp = "variable-3";
|
174 |
|
175 | registers.bp = "variable";
|
176 | registers.ebp = "variable-2";
|
177 | registers.rbp = "variable-3";
|
178 |
|
179 | registers.ip = "variable";
|
180 | registers.eip = "variable-2";
|
181 | registers.rip = "variable-3";
|
182 |
|
183 | registers.cs = "keyword";
|
184 | registers.ds = "keyword";
|
185 | registers.ss = "keyword";
|
186 | registers.es = "keyword";
|
187 | registers.fs = "keyword";
|
188 | registers.gs = "keyword";
|
189 | }
|
190 |
|
191 | function armv6(_parserConfig) {
|
192 |
|
193 |
|
194 |
|
195 | lineCommentStartSymbol = "@";
|
196 | directives.syntax = "builtin";
|
197 |
|
198 | registers.r0 = "variable";
|
199 | registers.r1 = "variable";
|
200 | registers.r2 = "variable";
|
201 | registers.r3 = "variable";
|
202 | registers.r4 = "variable";
|
203 | registers.r5 = "variable";
|
204 | registers.r6 = "variable";
|
205 | registers.r7 = "variable";
|
206 | registers.r8 = "variable";
|
207 | registers.r9 = "variable";
|
208 | registers.r10 = "variable";
|
209 | registers.r11 = "variable";
|
210 | registers.r12 = "variable";
|
211 |
|
212 | registers.sp = "variable-2";
|
213 | registers.lr = "variable-2";
|
214 | registers.pc = "variable-2";
|
215 | registers.r13 = registers.sp;
|
216 | registers.r14 = registers.lr;
|
217 | registers.r15 = registers.pc;
|
218 |
|
219 | custom.push(function(ch, stream) {
|
220 | if (ch === '#') {
|
221 | stream.eatWhile(/\w/);
|
222 | return "number";
|
223 | }
|
224 | });
|
225 | }
|
226 |
|
227 | var arch = (parserConfig.architecture || "x86").toLowerCase();
|
228 | if (arch === "x86") {
|
229 | x86(parserConfig);
|
230 | } else if (arch === "arm" || arch === "armv6") {
|
231 | armv6(parserConfig);
|
232 | }
|
233 |
|
234 | function nextUntilUnescaped(stream, end) {
|
235 | var escaped = false, next;
|
236 | while ((next = stream.next()) != null) {
|
237 | if (next === end && !escaped) {
|
238 | return false;
|
239 | }
|
240 | escaped = !escaped && next === "\\";
|
241 | }
|
242 | return escaped;
|
243 | }
|
244 |
|
245 | function clikeComment(stream, state) {
|
246 | var maybeEnd = false, ch;
|
247 | while ((ch = stream.next()) != null) {
|
248 | if (ch === "/" && maybeEnd) {
|
249 | state.tokenize = null;
|
250 | break;
|
251 | }
|
252 | maybeEnd = (ch === "*");
|
253 | }
|
254 | return "comment";
|
255 | }
|
256 |
|
257 | return {
|
258 | startState: function() {
|
259 | return {
|
260 | tokenize: null
|
261 | };
|
262 | },
|
263 |
|
264 | token: function(stream, state) {
|
265 | if (state.tokenize) {
|
266 | return state.tokenize(stream, state);
|
267 | }
|
268 |
|
269 | if (stream.eatSpace()) {
|
270 | return null;
|
271 | }
|
272 |
|
273 | var style, cur, ch = stream.next();
|
274 |
|
275 | if (ch === "/") {
|
276 | if (stream.eat("*")) {
|
277 | state.tokenize = clikeComment;
|
278 | return clikeComment(stream, state);
|
279 | }
|
280 | }
|
281 |
|
282 | if (ch === lineCommentStartSymbol) {
|
283 | stream.skipToEnd();
|
284 | return "comment";
|
285 | }
|
286 |
|
287 | if (ch === '"') {
|
288 | nextUntilUnescaped(stream, '"');
|
289 | return "string";
|
290 | }
|
291 |
|
292 | if (ch === '.') {
|
293 | stream.eatWhile(/\w/);
|
294 | cur = stream.current().toLowerCase();
|
295 | style = directives[cur];
|
296 | return style || null;
|
297 | }
|
298 |
|
299 | if (ch === '=') {
|
300 | stream.eatWhile(/\w/);
|
301 | return "tag";
|
302 | }
|
303 |
|
304 | if (ch === '{') {
|
305 | return "braket";
|
306 | }
|
307 |
|
308 | if (ch === '}') {
|
309 | return "braket";
|
310 | }
|
311 |
|
312 | if (/\d/.test(ch)) {
|
313 | if (ch === "0" && stream.eat("x")) {
|
314 | stream.eatWhile(/[0-9a-fA-F]/);
|
315 | return "number";
|
316 | }
|
317 | stream.eatWhile(/\d/);
|
318 | return "number";
|
319 | }
|
320 |
|
321 | if (/\w/.test(ch)) {
|
322 | stream.eatWhile(/\w/);
|
323 | if (stream.eat(":")) {
|
324 | return 'tag';
|
325 | }
|
326 | cur = stream.current().toLowerCase();
|
327 | style = registers[cur];
|
328 | return style || null;
|
329 | }
|
330 |
|
331 | for (var i = 0; i < custom.length; i++) {
|
332 | style = custom[i](ch, stream, state);
|
333 | if (style) {
|
334 | return style;
|
335 | }
|
336 | }
|
337 | },
|
338 |
|
339 | lineComment: lineCommentStartSymbol,
|
340 | blockCommentStart: "/*",
|
341 | blockCommentEnd: "*/"
|
342 | };
|
343 | });
|
344 |
|
345 | });
|