123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358 |
- // CodeMirror, copyright (c) by Marijn Haverbeke and others
- // Distributed under an MIT license: https://codemirror.net/LICENSE
- ;(function (mod) {
- if (typeof exports == 'object' && typeof module == 'object')
- // CommonJS
- mod(require('../../lib/codemirror'))
- else if (typeof define == 'function' && define.amd)
- // AMD
- define(['../../lib/codemirror'], mod)
- // Plain browser env
- else mod(CodeMirror)
- })(function (CodeMirror) {
- 'use strict'
- CodeMirror.defineMode('gas', function (_config, parserConfig) {
- 'use strict'
- // If an architecture is specified, its initialization function may
- // populate this array with custom parsing functions which will be
- // tried in the event that the standard functions do not find a match.
- var custom = []
- // The symbol used to start a line comment changes based on the target
- // architecture.
- // If no architecture is pased in "parserConfig" then only multiline
- // comments will have syntax support.
- var lineCommentStartSymbol = ''
- // These directives are architecture independent.
- // Machine specific directives should go in their respective
- // architecture initialization function.
- // Reference:
- // http://sourceware.org/binutils/docs/as/Pseudo-Ops.html#Pseudo-Ops
- var directives = {
- '.abort': 'builtin',
- '.align': 'builtin',
- '.altmacro': 'builtin',
- '.ascii': 'builtin',
- '.asciz': 'builtin',
- '.balign': 'builtin',
- '.balignw': 'builtin',
- '.balignl': 'builtin',
- '.bundle_align_mode': 'builtin',
- '.bundle_lock': 'builtin',
- '.bundle_unlock': 'builtin',
- '.byte': 'builtin',
- '.cfi_startproc': 'builtin',
- '.comm': 'builtin',
- '.data': 'builtin',
- '.def': 'builtin',
- '.desc': 'builtin',
- '.dim': 'builtin',
- '.double': 'builtin',
- '.eject': 'builtin',
- '.else': 'builtin',
- '.elseif': 'builtin',
- '.end': 'builtin',
- '.endef': 'builtin',
- '.endfunc': 'builtin',
- '.endif': 'builtin',
- '.equ': 'builtin',
- '.equiv': 'builtin',
- '.eqv': 'builtin',
- '.err': 'builtin',
- '.error': 'builtin',
- '.exitm': 'builtin',
- '.extern': 'builtin',
- '.fail': 'builtin',
- '.file': 'builtin',
- '.fill': 'builtin',
- '.float': 'builtin',
- '.func': 'builtin',
- '.global': 'builtin',
- '.gnu_attribute': 'builtin',
- '.hidden': 'builtin',
- '.hword': 'builtin',
- '.ident': 'builtin',
- '.if': 'builtin',
- '.incbin': 'builtin',
- '.include': 'builtin',
- '.int': 'builtin',
- '.internal': 'builtin',
- '.irp': 'builtin',
- '.irpc': 'builtin',
- '.lcomm': 'builtin',
- '.lflags': 'builtin',
- '.line': 'builtin',
- '.linkonce': 'builtin',
- '.list': 'builtin',
- '.ln': 'builtin',
- '.loc': 'builtin',
- '.loc_mark_labels': 'builtin',
- '.local': 'builtin',
- '.long': 'builtin',
- '.macro': 'builtin',
- '.mri': 'builtin',
- '.noaltmacro': 'builtin',
- '.nolist': 'builtin',
- '.octa': 'builtin',
- '.offset': 'builtin',
- '.org': 'builtin',
- '.p2align': 'builtin',
- '.popsection': 'builtin',
- '.previous': 'builtin',
- '.print': 'builtin',
- '.protected': 'builtin',
- '.psize': 'builtin',
- '.purgem': 'builtin',
- '.pushsection': 'builtin',
- '.quad': 'builtin',
- '.reloc': 'builtin',
- '.rept': 'builtin',
- '.sbttl': 'builtin',
- '.scl': 'builtin',
- '.section': 'builtin',
- '.set': 'builtin',
- '.short': 'builtin',
- '.single': 'builtin',
- '.size': 'builtin',
- '.skip': 'builtin',
- '.sleb128': 'builtin',
- '.space': 'builtin',
- '.stab': 'builtin',
- '.string': 'builtin',
- '.struct': 'builtin',
- '.subsection': 'builtin',
- '.symver': 'builtin',
- '.tag': 'builtin',
- '.text': 'builtin',
- '.title': 'builtin',
- '.type': 'builtin',
- '.uleb128': 'builtin',
- '.val': 'builtin',
- '.version': 'builtin',
- '.vtable_entry': 'builtin',
- '.vtable_inherit': 'builtin',
- '.warning': 'builtin',
- '.weak': 'builtin',
- '.weakref': 'builtin',
- '.word': 'builtin',
- }
- var registers = {}
- function x86(_parserConfig) {
- lineCommentStartSymbol = '#'
- registers.al = 'variable'
- registers.ah = 'variable'
- registers.ax = 'variable'
- registers.eax = 'variable-2'
- registers.rax = 'variable-3'
- registers.bl = 'variable'
- registers.bh = 'variable'
- registers.bx = 'variable'
- registers.ebx = 'variable-2'
- registers.rbx = 'variable-3'
- registers.cl = 'variable'
- registers.ch = 'variable'
- registers.cx = 'variable'
- registers.ecx = 'variable-2'
- registers.rcx = 'variable-3'
- registers.dl = 'variable'
- registers.dh = 'variable'
- registers.dx = 'variable'
- registers.edx = 'variable-2'
- registers.rdx = 'variable-3'
- registers.si = 'variable'
- registers.esi = 'variable-2'
- registers.rsi = 'variable-3'
- registers.di = 'variable'
- registers.edi = 'variable-2'
- registers.rdi = 'variable-3'
- registers.sp = 'variable'
- registers.esp = 'variable-2'
- registers.rsp = 'variable-3'
- registers.bp = 'variable'
- registers.ebp = 'variable-2'
- registers.rbp = 'variable-3'
- registers.ip = 'variable'
- registers.eip = 'variable-2'
- registers.rip = 'variable-3'
- registers.cs = 'keyword'
- registers.ds = 'keyword'
- registers.ss = 'keyword'
- registers.es = 'keyword'
- registers.fs = 'keyword'
- registers.gs = 'keyword'
- }
- function armv6(_parserConfig) {
- // Reference:
- // http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001l/QRC0001_UAL.pdf
- // http://infocenter.arm.com/help/topic/com.arm.doc.ddi0301h/DDI0301H_arm1176jzfs_r0p7_trm.pdf
- lineCommentStartSymbol = '@'
- directives.syntax = 'builtin'
- registers.r0 = 'variable'
- registers.r1 = 'variable'
- registers.r2 = 'variable'
- registers.r3 = 'variable'
- registers.r4 = 'variable'
- registers.r5 = 'variable'
- registers.r6 = 'variable'
- registers.r7 = 'variable'
- registers.r8 = 'variable'
- registers.r9 = 'variable'
- registers.r10 = 'variable'
- registers.r11 = 'variable'
- registers.r12 = 'variable'
- registers.sp = 'variable-2'
- registers.lr = 'variable-2'
- registers.pc = 'variable-2'
- registers.r13 = registers.sp
- registers.r14 = registers.lr
- registers.r15 = registers.pc
- custom.push(function (ch, stream) {
- if (ch === '#') {
- stream.eatWhile(/\w/)
- return 'number'
- }
- })
- }
- var arch = (parserConfig.architecture || 'x86').toLowerCase()
- if (arch === 'x86') {
- x86(parserConfig)
- } else if (arch === 'arm' || arch === 'armv6') {
- armv6(parserConfig)
- }
- function nextUntilUnescaped(stream, end) {
- var escaped = false,
- next
- while ((next = stream.next()) != null) {
- if (next === end && !escaped) {
- return false
- }
- escaped = !escaped && next === '\\'
- }
- return escaped
- }
- function clikeComment(stream, state) {
- var maybeEnd = false,
- ch
- while ((ch = stream.next()) != null) {
- if (ch === '/' && maybeEnd) {
- state.tokenize = null
- break
- }
- maybeEnd = ch === '*'
- }
- return 'comment'
- }
- return {
- startState: function () {
- return {
- tokenize: null,
- }
- },
- token: function (stream, state) {
- if (state.tokenize) {
- return state.tokenize(stream, state)
- }
- if (stream.eatSpace()) {
- return null
- }
- var style,
- cur,
- ch = stream.next()
- if (ch === '/') {
- if (stream.eat('*')) {
- state.tokenize = clikeComment
- return clikeComment(stream, state)
- }
- }
- if (ch === lineCommentStartSymbol) {
- stream.skipToEnd()
- return 'comment'
- }
- if (ch === '"') {
- nextUntilUnescaped(stream, '"')
- return 'string'
- }
- if (ch === '.') {
- stream.eatWhile(/\w/)
- cur = stream.current().toLowerCase()
- style = directives[cur]
- return style || null
- }
- if (ch === '=') {
- stream.eatWhile(/\w/)
- return 'tag'
- }
- if (ch === '{') {
- return 'bracket'
- }
- if (ch === '}') {
- return 'bracket'
- }
- if (/\d/.test(ch)) {
- if (ch === '0' && stream.eat('x')) {
- stream.eatWhile(/[0-9a-fA-F]/)
- return 'number'
- }
- stream.eatWhile(/\d/)
- return 'number'
- }
- if (/\w/.test(ch)) {
- stream.eatWhile(/\w/)
- if (stream.eat(':')) {
- return 'tag'
- }
- cur = stream.current().toLowerCase()
- style = registers[cur]
- return style || null
- }
- for (var i = 0; i < custom.length; i++) {
- style = custom[i](ch, stream, state)
- if (style) {
- return style
- }
- }
- },
- lineComment: lineCommentStartSymbol,
- blockCommentStart: '/*',
- blockCommentEnd: '*/',
- }
- })
- })
|