1 CodeMirror.defineMode('ocaml', function() {
21 'function': 'keyword',
35 'print_string': 'builtin',
36 'print_endline': 'builtin'
39 function tokenBase(stream, state) {
40 var ch = stream.next();
43 state.tokenize = tokenString;
44 return state.tokenize(stream, state);
47 if (stream.eat('*')) {
49 state.tokenize = tokenComment;
50 return state.tokenize(stream, state);
54 stream.eatWhile(/\w/);
58 stream.eatWhile(/\w/);
62 stream.eatWhile(/[\d]/);
63 if (stream.eat('.')) {
64 stream.eatWhile(/[\d]/);
68 if ( /[+\-*&%=<>!?|]/.test(ch)) {
71 stream.eatWhile(/\w/);
72 var cur = stream.current();
73 return words[cur] || 'variable';
76 function tokenString(stream, state) {
77 var next, end = false, escaped = false;
78 while ((next = stream.next()) != null) {
79 if (next === '"' && !escaped) {
83 escaped = !escaped && next === '\\';
85 if (end && !escaped) {
86 state.tokenize = tokenBase;
91 function tokenComment(stream, state) {
93 while(state.commentLevel > 0 && (next = stream.next()) != null) {
94 if (prev === '(' && next === '*') state.commentLevel++;
95 if (prev === '*' && next === ')') state.commentLevel--;
98 if (state.commentLevel <= 0) {
99 state.tokenize = tokenBase;
105 startState: function() {return {tokenize: tokenBase, commentLevel: 0};},
106 token: function(stream, state) {
107 if (stream.eatSpace()) return null;
108 return state.tokenize(stream, state);
111 blockCommentStart: "(*",
112 blockCommentEnd: "*)"
116 CodeMirror.defineMIME('text/x-ocaml', 'ocaml');