File modules/editor/codemirror/mode/gas/gas.js

Last commit: Sun Dec 17 01:14:09 2017 +0100	Jan Dankert	Integration eines weiteren Code-Editors: Codemirror. Demnächst müssen wir hier mal aufräumen und andere Editoren rauswerfen.
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 // Distributed under an MIT license: http://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 14 CodeMirror.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 });
Download modules/editor/codemirror/mode/gas/gas.js
History Sun, 17 Dec 2017 01:14:09 +0100 Jan Dankert Integration eines weiteren Code-Editors: Codemirror. Demnächst müssen wir hier mal aufräumen und andere Editoren rauswerfen.