diff --git a/src/codemirror/bataribasic.js b/src/codemirror/bataribasic.js deleted file mode 100644 index 6e05ef50..00000000 --- a/src/codemirror/bataribasic.js +++ /dev/null @@ -1,96 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://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); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -// bataribasic DASM syntax - -CodeMirror.defineMode('bataribasic', function(_config, parserConfig) { - var keywords1, keywords2; - - var directives_list = [ - 'rem','if','else','then','goto', - //'end', - 'includesfile','include','inline','function', - 'bank','sdata','data', - 'on','off', - 'up','down', - 'const','dim','for','next','gosub', - 'pfpixel','pfhline','pfclear','pfvline','pfscroll', - 'drawscreen','asm','pop','set','return','reboot','vblank', - 'pfcolors','pfheights','playfield','lives', - 'player0','player1','player2','player3','player4','player5', - 'player0color','player1color', - 'let', - "switchreset","switchselect","switchleftb","switchrightb","switchbw", - "joy0up","joy0down","joy0left","joy0right","joy1up","joy1down","joy1left","joy1right","joy0fire","joy1fire", - "size","2k","8k","8kSC","16k","16kSC","32k","32kSC","4k", - "thisbank","otherbank","flip", - "collision","missile0","missile1","ball", - "stackpull","rand","score","scorec","Areg", - "smartbranching","romsize","optimization","speed","size", - "noinlinedata","inlinerand","none","kernal","kernel_options", - "readpaddle","player1colors","playercolors","no_blank_lines", - "kernel","multisprite","multisprite_no_include","debug", - "cyclescore","cycles","legacy" - ]; - var directives = new Map(); - directives_list.forEach(function(s) { directives.set(s, 'keyword'); }); - - var numbers = /^([$][0-9a-f]+|[%][01]+|[0-9.]+)/i; - - return { - startState: function() { - return { - context: 0 - }; - }, - token: function(stream, state) { - if (!stream.column()) { - state.context = 0; - if (stream.eatWhile(/[\w.]/)) { - if (stream.current().toLowerCase() == 'end') - return 'keyword'; - else - return 'tag'; - } - } - if (stream.eatSpace()) - return null; - - var w; - if (stream.eatWhile(/[$%A-Z0-9]/i)) { - w = stream.current(); - var cur = w.toLowerCase(); - var style = directives.get(cur); - if (cur == 'rem') { - stream.eatWhile(/./); - return 'comment'; - } - if (style) - return style; - - if (numbers.test(w)) { - return 'number'; - } else { - return null; - } - } else { - stream.next(); - } - return null; - } - }; -}); - -CodeMirror.defineMIME("text/x-bataribasic", "bataribasic"); - -}); diff --git a/src/parser/lang-bataribasic.ts b/src/parser/lang-bataribasic.ts new file mode 100644 index 00000000..f05a1d9e --- /dev/null +++ b/src/parser/lang-bataribasic.ts @@ -0,0 +1,99 @@ +// CodeMirror 6 language support for Batari Basic +// Migrated from CodeMirror 5 mode +// Original copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/5/LICENSE + +import { StreamLanguage, StreamParser } from "@codemirror/language"; +import { LanguageSupport } from "@codemirror/language"; + +interface BatariBasicState { + context: number; +} + +// TODO: Migrate to CodeMirror 6 Lezer parser. +function createBatariBasicParser(): StreamParser { + const directives_list = [ + 'rem', 'if', 'else', 'then', 'goto', + 'includesfile', 'include', 'inline', 'function', + 'bank', 'sdata', 'data', + 'on', 'off', + 'up', 'down', + 'const', 'dim', 'for', 'next', 'gosub', + 'pfpixel', 'pfhline', 'pfclear', 'pfvline', 'pfscroll', + 'drawscreen', 'asm', 'pop', 'set', 'return', 'reboot', 'vblank', + 'pfcolors', 'pfheights', 'playfield', 'lives', + 'player0', 'player1', 'player2', 'player3', 'player4', 'player5', + 'player0color', 'player1color', + 'let', + 'switchreset', 'switchselect', 'switchleftb', 'switchrightb', 'switchbw', + 'joy0up', 'joy0down', 'joy0left', 'joy0right', 'joy1up', 'joy1down', 'joy1left', 'joy1right', 'joy0fire', 'joy1fire', + 'size', '2k', '8k', '8kSC', '16k', '16kSC', '32k', '32kSC', '4k', + 'thisbank', 'otherbank', 'flip', + 'collision', 'missile0', 'missile1', 'ball', + 'stackpull', 'rand', 'score', 'scorec', 'Areg', + 'smartbranching', 'romsize', 'optimization', 'speed', 'size', + 'noinlinedata', 'inlinerand', 'none', 'kernal', 'kernel_options', + 'readpaddle', 'player1colors', 'playercolors', 'no_blank_lines', + 'kernel', 'multisprite', 'multisprite_no_include', 'debug', + 'cyclescore', 'cycles', 'legacy' + ]; + + const directives = new Map(); + directives_list.forEach(s => directives.set(s, 'keyword')); + + const numbers = /^([$][0-9a-f]+|[%][01]+|[0-9.]+)/i; + + return { + startState(): BatariBasicState { + return { + context: 0 + }; + }, + + token(stream, state) { + if (!stream.column()) { + state.context = 0; + if (stream.eatWhile(/[\w.]/)) { + if (stream.current().toLowerCase() == 'end') + return 'keyword'; + else + return 'meta'; + } + } + + if (stream.eatSpace()) + return null; + + let w; + if (stream.eatWhile(/[$%A-Z0-9]/i)) { + w = stream.current(); + const cur = w.toLowerCase(); + const style = directives.get(cur); + + if (cur == 'rem') { + stream.eatWhile(/./); + return 'comment'; + } + + if (style) + return style; + + if (numbers.test(w)) { + return 'number'; + } else { + return null; + } + } else { + stream.next(); + } + return null; + } + }; +} + +/** + * Language support for Batari Basic + */ +export function batariBasic(): LanguageSupport { + return new LanguageSupport(StreamLanguage.define(createBatariBasicParser())); +}