scripts/CodeMirror/mode/gas/gas.js (view raw)
1// CodeMirror, copyright (c) by Marijn Haverbeke and others
2// Distributed under an MIT license: https://codemirror.net/LICENSE
3
4(function(mod) {
5 if (typeof exports == "object" && typeof module == "object") // CommonJS
6 mod(require("../../lib/codemirror"));
7 else if (typeof define == "function" && define.amd) // AMD
8 define(["../../lib/codemirror"], mod);
9 else // Plain browser env
10 mod(CodeMirror);
11})(function(CodeMirror) {
12"use strict";
13
14CodeMirror.defineMode("gas", function(_config, parserConfig) {
15 'use strict';
16
17 // If an architecture is specified, its initialization function may
18 // populate this array with custom parsing functions which will be
19 // tried in the event that the standard functions do not find a match.
20 var custom = [];
21
22 // The symbol used to start a line comment changes based on the target
23 // architecture.
24 // If no architecture is pased in "parserConfig" then only multiline
25 // comments will have syntax support.
26 var lineCommentStartSymbol = "";
27
28 // These directives are architecture independent.
29 // Machine specific directives should go in their respective
30 // architecture initialization function.
31 // Reference:
32 // http://sourceware.org/binutils/docs/as/Pseudo-Ops.html#Pseudo-Ops
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 // Reference:
193 // http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001l/QRC0001_UAL.pdf
194 // http://infocenter.arm.com/help/topic/com.arm.doc.ddi0301h/DDI0301H_arm1176jzfs_r0p7_trm.pdf
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});