| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 | // CodeMirror, copyright (c) by Marijn Haverbeke and others// Distributed under an MIT license: https://codemirror.net/LICENSE// Author: Aliaksei Chapyzhenka(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";  function toWordList(words) {    var ret = [];    words.split(' ').forEach(function(e){      ret.push({name: e});    });    return ret;  }  var coreWordList = toWordList('INVERT AND OR XOR\ 2* 2/ LSHIFT RSHIFT\ 0= = 0< < > U< MIN MAX\ 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP\ >R R> R@\ + - 1+ 1- ABS NEGATE\ S>D * M* UM*\ FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD\ HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2!\ ALIGN ALIGNED +! ALLOT\ CHAR [CHAR] [ ] BL\ FIND EXECUTE IMMEDIATE COUNT LITERAL STATE\ ; DOES> >BODY\ EVALUATE\ SOURCE >IN\ <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL\ FILL MOVE\ . CR EMIT SPACE SPACES TYPE U. .R U.R\ ACCEPT\ TRUE FALSE\ <> U> 0<> 0>\ NIP TUCK ROLL PICK\ 2>R 2R@ 2R>\ WITHIN UNUSED MARKER\ I J\ TO\ COMPILE, [COMPILE]\ SAVE-INPUT RESTORE-INPUT\ PAD ERASE\ 2LITERAL DNEGATE\ D- D+ D0< D0= D2* D2/ D< D= DMAX DMIN D>S DABS\ M+ M*/ D. D.R 2ROT DU<\ CATCH THROW\ FREE RESIZE ALLOCATE\ CS-PICK CS-ROLL\ GET-CURRENT SET-CURRENT FORTH-WORDLIST GET-ORDER SET-ORDER\ PREVIOUS SEARCH-WORDLIST WORDLIST FIND ALSO ONLY FORTH DEFINITIONS ORDER\ -TRAILING /STRING SEARCH COMPARE CMOVE CMOVE> BLANK SLITERAL');  var immediateWordList = toWordList('IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE [IF] [ELSE] [THEN] ?DO DO LOOP +LOOP UNLOOP LEAVE EXIT AGAIN CASE OF ENDOF ENDCASE');  CodeMirror.defineMode('forth', function() {    function searchWordList (wordList, word) {      var i;      for (i = wordList.length - 1; i >= 0; i--) {        if (wordList[i].name === word.toUpperCase()) {          return wordList[i];        }      }      return undefined;    }  return {    startState: function() {      return {        state: '',        base: 10,        coreWordList: coreWordList,        immediateWordList: immediateWordList,        wordList: []      };    },    token: function (stream, stt) {      var mat;      if (stream.eatSpace()) {        return null;      }      if (stt.state === '') { // interpretation        if (stream.match(/^(\]|:NONAME)(\s|$)/i)) {          stt.state = ' compilation';          return 'builtin compilation';        }        mat = stream.match(/^(\:)\s+(\S+)(\s|$)+/);        if (mat) {          stt.wordList.push({name: mat[2].toUpperCase()});          stt.state = ' compilation';          return 'def' + stt.state;        }        mat = stream.match(/^(VARIABLE|2VARIABLE|CONSTANT|2CONSTANT|CREATE|POSTPONE|VALUE|WORD)\s+(\S+)(\s|$)+/i);        if (mat) {          stt.wordList.push({name: mat[2].toUpperCase()});          return 'def' + stt.state;        }        mat = stream.match(/^(\'|\[\'\])\s+(\S+)(\s|$)+/);        if (mat) {          return 'builtin' + stt.state;        }        } else { // compilation        // ; [        if (stream.match(/^(\;|\[)(\s)/)) {          stt.state = '';          stream.backUp(1);          return 'builtin compilation';        }        if (stream.match(/^(\;|\[)($)/)) {          stt.state = '';          return 'builtin compilation';        }        if (stream.match(/^(POSTPONE)\s+\S+(\s|$)+/)) {          return 'builtin';        }      }      // dynamic wordlist      mat = stream.match(/^(\S+)(\s+|$)/);      if (mat) {        if (searchWordList(stt.wordList, mat[1]) !== undefined) {          return 'variable' + stt.state;        }        // comments        if (mat[1] === '\\') {          stream.skipToEnd();            return 'comment' + stt.state;          }          // core words          if (searchWordList(stt.coreWordList, mat[1]) !== undefined) {            return 'builtin' + stt.state;          }          if (searchWordList(stt.immediateWordList, mat[1]) !== undefined) {            return 'keyword' + stt.state;          }          if (mat[1] === '(') {            stream.eatWhile(function (s) { return s !== ')'; });            stream.eat(')');            return 'comment' + stt.state;          }          // // strings          if (mat[1] === '.(') {            stream.eatWhile(function (s) { return s !== ')'; });            stream.eat(')');            return 'string' + stt.state;          }          if (mat[1] === 'S"' || mat[1] === '."' || mat[1] === 'C"') {            stream.eatWhile(function (s) { return s !== '"'; });            stream.eat('"');            return 'string' + stt.state;          }          // numbers          if (mat[1] - 0xfffffffff) {            return 'number' + stt.state;          }          // if (mat[1].match(/^[-+]?[0-9]+\.[0-9]*/)) {          //     return 'number' + stt.state;          // }          return 'atom' + stt.state;        }      }    };  });  CodeMirror.defineMIME("text/x-forth", "forth");});
 |