Show More
brainfuck.js
85 lines
| 2.1 KiB
| application/javascript
|
JavascriptLexer
r1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others | |||
// Distributed under an MIT license: http://codemirror.net/LICENSE | ||||
// Brainfuck mode created by Michael Kaminsky https://github.com/mkaminsky11 | ||||
(function(mod) { | ||||
if (typeof exports == "object" && typeof module == "object") | ||||
mod(require("../../lib/codemirror")) | ||||
else if (typeof define == "function" && define.amd) | ||||
define(["../../lib/codemirror"], mod) | ||||
else | ||||
mod(CodeMirror) | ||||
})(function(CodeMirror) { | ||||
"use strict" | ||||
var reserve = "><+-.,[]".split(""); | ||||
/* | ||||
comments can be either: | ||||
placed behind lines | ||||
+++ this is a comment | ||||
where reserved characters cannot be used | ||||
or in a loop | ||||
[ | ||||
this is ok to use [ ] and stuff | ||||
] | ||||
or preceded by # | ||||
*/ | ||||
CodeMirror.defineMode("brainfuck", function() { | ||||
return { | ||||
startState: function() { | ||||
return { | ||||
commentLine: false, | ||||
left: 0, | ||||
right: 0, | ||||
commentLoop: false | ||||
} | ||||
}, | ||||
token: function(stream, state) { | ||||
if (stream.eatSpace()) return null | ||||
if(stream.sol()){ | ||||
state.commentLine = false; | ||||
} | ||||
var ch = stream.next().toString(); | ||||
if(reserve.indexOf(ch) !== -1){ | ||||
if(state.commentLine === true){ | ||||
if(stream.eol()){ | ||||
state.commentLine = false; | ||||
} | ||||
return "comment"; | ||||
} | ||||
if(ch === "]" || ch === "["){ | ||||
if(ch === "["){ | ||||
state.left++; | ||||
} | ||||
else{ | ||||
state.right++; | ||||
} | ||||
return "bracket"; | ||||
} | ||||
else if(ch === "+" || ch === "-"){ | ||||
return "keyword"; | ||||
} | ||||
else if(ch === "<" || ch === ">"){ | ||||
return "atom"; | ||||
} | ||||
else if(ch === "." || ch === ","){ | ||||
return "def"; | ||||
} | ||||
} | ||||
else{ | ||||
state.commentLine = true; | ||||
if(stream.eol()){ | ||||
state.commentLine = false; | ||||
} | ||||
return "comment"; | ||||
} | ||||
if(stream.eol()){ | ||||
state.commentLine = false; | ||||
} | ||||
} | ||||
}; | ||||
}); | ||||
CodeMirror.defineMIME("text/x-brainfuck","brainfuck") | ||||
}); | ||||