1284 lines
38 KiB
JavaScript
1284 lines
38 KiB
JavaScript
// 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";
|
|
|
|
CodeMirror.defineMode("prolog", function(cmConfig, modeConfig) {
|
|
|
|
function chain(stream, state, f) {
|
|
state.tokenize = f;
|
|
return f(stream, state);
|
|
}
|
|
|
|
/*******************************
|
|
* CONFIG DATA *
|
|
*******************************/
|
|
|
|
var config = { quasiQuotations: false, /* {|Syntax||Quotation|} */
|
|
dicts: false, /* tag{k:v, ...} */
|
|
unicodeEscape: true, /* \uXXXX and \UXXXXXXXX */
|
|
multiLineQuoted: true, /* "...\n..." */
|
|
groupedIntegers: false /* 10 000 or 10_000 */
|
|
};
|
|
|
|
var quoteType = { '"': "string",
|
|
"'": "qatom",
|
|
"`": "bqstring"
|
|
};
|
|
|
|
var isSingleEscChar = /[abref\\'"nrtsv]/;
|
|
var isOctalDigit = /[0-7]/;
|
|
var isHexDigit = /[0-9a-fA-F]/;
|
|
|
|
var isSymbolChar = /[-#$&*+./:<=>?@\\^~]/; /* Prolog glueing symbols chars */
|
|
var isSoloChar = /[[\]{}(),;|!]/; /* Prolog solo chars */
|
|
var isNeck = /^(:-|-->)$/;
|
|
var isControlOp = /^(,|;|->|\*->|\\+|\|)$/;
|
|
|
|
|
|
/*******************************
|
|
* CHARACTER ESCAPES *
|
|
*******************************/
|
|
|
|
function readDigits(stream, re, count) {
|
|
if ( count > 0 ) {
|
|
while( count-- > 0 ) {
|
|
if ( !re.test(stream.next()) )
|
|
return false;
|
|
}
|
|
} else {
|
|
while ( re.test(stream.peek()) )
|
|
stream.next();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function readEsc(stream) {
|
|
var next = stream.next();
|
|
if ( isSingleEscChar.test(next) )
|
|
return true;
|
|
switch( next )
|
|
{ case "u":
|
|
if ( config.unicodeEscape )
|
|
return readDigits(stream, isHexDigit, 4); /* SWI */
|
|
return false;
|
|
case "U":
|
|
if ( config.unicodeEscape )
|
|
return readDigits(stream, isHexDigit, 8); /* SWI */
|
|
return false;
|
|
case null: return true; /* end of line */
|
|
case "c": stream.eatSpace(); return true;
|
|
case "x": return readDigits(stream, isHexDigit, 2);
|
|
}
|
|
if ( isOctalDigit.test(next) ) {
|
|
if ( !readDigits(stream, isOctalDigit, -1) )
|
|
return false;
|
|
if ( stream.peek() == "\\" ) /* SWI: optional closing \ */
|
|
stream.next();
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function nextUntilUnescaped(stream, state, end) {
|
|
var next;
|
|
while ((next = stream.next()) != null) {
|
|
if ( next == end && end != stream.peek() )
|
|
{ state.nesting.pop();
|
|
return false;
|
|
}
|
|
if ( next == "\\" )
|
|
{ if ( !readEsc(stream) )
|
|
return false;
|
|
}
|
|
}
|
|
return config.multiLineQuoted;
|
|
}
|
|
|
|
/*******************************
|
|
* CONTEXT NESTING *
|
|
*******************************/
|
|
|
|
function nesting(state) {
|
|
return state.nesting.slice(-1)[0];
|
|
}
|
|
|
|
/* Called on every non-comment token */
|
|
function setArg1(state) {
|
|
var nest = nesting(state);
|
|
if ( nest ) {
|
|
if ( nest.arg == 0 ) /* nested in a compound */
|
|
nest.arg = 1;
|
|
else if ( nest.type == "control" )
|
|
state.goalStart = false;
|
|
} else
|
|
state.goalStart = false;
|
|
}
|
|
|
|
function setArgAlignment(state) {
|
|
var nest = nesting(state);
|
|
if ( nest && !nest.alignment && nest.arg != undefined ) {
|
|
if ( nest.arg == 0 )
|
|
nest.alignment = nest.leftCol ? nest.leftCol+4 : nest.column+4;
|
|
else
|
|
nest.alignment = nest.column+1;
|
|
}
|
|
}
|
|
|
|
function nextArg(state) {
|
|
var nest = nesting(state);
|
|
if ( nest ) {
|
|
if ( nest.arg ) /* nested in a compound */
|
|
nest.arg++;
|
|
else if ( nest.type == "control" )
|
|
state.goalStart = true; /* FIXME: also needed for ; and -> */
|
|
} else
|
|
state.goalStart = true;
|
|
}
|
|
|
|
function isControl(state) { /* our terms are goals */
|
|
var nest = nesting(state);
|
|
if ( nest ) {
|
|
if ( nest.type == "control" ) {
|
|
return true;
|
|
}
|
|
return false;
|
|
} else
|
|
return state.inBody;
|
|
}
|
|
|
|
// Used as scratch variables to communicate multiple values without
|
|
// consing up tons of objects.
|
|
var type, content;
|
|
function ret(tp, style, cont) {
|
|
type = tp; content = cont;
|
|
return style;
|
|
}
|
|
|
|
function peekSpace(stream) { /* TBD: handle block comment as space */
|
|
if ( stream.eol() ||
|
|
/[\s%]/.test(stream.peek()) )
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
|
|
/*******************************
|
|
* SUB TOKENISERS *
|
|
*******************************/
|
|
|
|
function plTokenBase(stream, state) {
|
|
var ch = stream.next();
|
|
|
|
if ( ch == "(" ) {
|
|
if ( state.lastType == "functor" ) {
|
|
state.nesting.push({ functor: state.functorName,
|
|
column: stream.column(),
|
|
leftCol: state.functorColumn,
|
|
arg: 0
|
|
});
|
|
delete state.functorName;
|
|
delete state.functorColumn;
|
|
} else {
|
|
state.nesting.push({ type: "control",
|
|
closeColumn: stream.column(),
|
|
alignment: stream.column()+4
|
|
});
|
|
}
|
|
return ret("solo", null, "(");
|
|
}
|
|
|
|
if ( ch == "{" && state.lastType == "tag" ) {
|
|
state.nesting.push({ tag: state.tagName,
|
|
column: stream.column(),
|
|
leftCol: state.tagColumn,
|
|
arg: 0
|
|
});
|
|
delete state.tagName;
|
|
delete state.tagColumn;
|
|
return ret("dict_open", null);
|
|
}
|
|
|
|
if ( ch == "/" && stream.eat("*") )
|
|
return chain(stream, state, plTokenComment);
|
|
|
|
if ( ch == "%" ) {
|
|
stream.skipToEnd();
|
|
return ret("comment", "comment");
|
|
}
|
|
|
|
setArg1(state);
|
|
|
|
if ( isSoloChar.test(ch) ) {
|
|
switch ( ch )
|
|
{ case ")":
|
|
state.nesting.pop();
|
|
break;
|
|
case "]":
|
|
state.nesting.pop();
|
|
return ret("list_close", null);
|
|
case "}":
|
|
{ var nest = nesting(state);
|
|
var type = (nest && nest.tag) ? "dict_close" : "brace_term_close";
|
|
|
|
state.nesting.pop();
|
|
return ret(type, null);
|
|
}
|
|
case ",":
|
|
if ( stream.eol() )
|
|
state.commaAtEOL = true;
|
|
nextArg(state);
|
|
/*FALLTHROUGH*/
|
|
case ";":
|
|
if ( isControl(state) )
|
|
state.goalStart = true;
|
|
break;
|
|
case "[":
|
|
state.nesting.push({ type: "list",
|
|
closeColumn: stream.column(),
|
|
alignment: stream.column()+2
|
|
});
|
|
return ret("list_open", null);
|
|
break;
|
|
case "{":
|
|
if ( config.quasiQuotations && stream.eat("|") ) {
|
|
state.nesting.push({ type: "quasi-quotation",
|
|
alignment: stream.column()+1
|
|
});
|
|
return ret("qq_open", "qq_open");
|
|
} else {
|
|
state.nesting.push({ type: "curly",
|
|
closeColumn: stream.column(),
|
|
alignment: stream.column()+2
|
|
});
|
|
return ret("brace_term_open", null);
|
|
}
|
|
break;
|
|
case "|":
|
|
if ( config.quasiQuotations ) {
|
|
if ( stream.eat("|") ) {
|
|
state.tokenize = plTokenQuasiQuotation;
|
|
return ret("qq_sep", "qq_sep");
|
|
} else if ( stream.eat("}") ) {
|
|
state.nesting.pop();
|
|
return ret("qq_close", "qq_close");
|
|
}
|
|
}
|
|
if ( isControl(state) )
|
|
state.goalStart = true;
|
|
break;
|
|
}
|
|
return ret("solo", null, ch);
|
|
}
|
|
|
|
if (ch == '"' || ch == "'" || ch == "`")
|
|
{ state.nesting.push({ type: "quoted",
|
|
alignment: stream.column()+1
|
|
});
|
|
return chain(stream, state, plTokenString(ch));
|
|
}
|
|
|
|
if ( ch == "0" ) {
|
|
if ( stream.eat(/x/i)) {
|
|
stream.eatWhile(/[\da-f]/i);
|
|
return ret("number", "number");
|
|
}
|
|
if ( stream.eat(/o/i)) {
|
|
stream.eatWhile(/[0-7]/i);
|
|
return ret("number", "number");
|
|
}
|
|
if ( stream.eat(/'/) ) { /* 0' */
|
|
var next = stream.next();
|
|
if ( next == "\\" ) {
|
|
if ( !readEsc(stream) )
|
|
return ret("error", "error");
|
|
}
|
|
return ret("code", "code");
|
|
}
|
|
}
|
|
|
|
if ( /\d/.test(ch) || /[+-]/.test(ch) && stream.eat(/\d/)) {
|
|
if ( config.groupedIntegers )
|
|
stream.match(/^\d*((_|\s+)\d+)*(?:\.\d+)?(?:[eE][+\-]?\d+)?/);
|
|
else
|
|
stream.match(/^\d*(?:\.\d+)?(?:[eE][+\-]?\d+)?/);
|
|
return ret(ch == "-" ? "neg-number" :
|
|
ch == "+" ? "pos-number" :
|
|
"number");
|
|
}
|
|
|
|
if ( isSymbolChar.test(ch) ) {
|
|
stream.eatWhile(isSymbolChar);
|
|
var atom = stream.current();
|
|
if ( atom == "." && peekSpace(stream) ) {
|
|
if ( nesting(state) ) {
|
|
return ret("fullstop", "error", atom);
|
|
} else {
|
|
} return ret("fullstop", "fullstop", atom);
|
|
} else if ( isNeck.test(atom) ) {
|
|
return ret("neck", "neck", atom);
|
|
} else if ( isControl(state) && isControlOp.test(atom) ) {
|
|
state.goalStart = true;
|
|
return ret("symbol", "operator", atom);
|
|
} else
|
|
return ret("symbol", "operator", atom);
|
|
}
|
|
|
|
stream.eatWhile(/[\w_]/);
|
|
var word = stream.current();
|
|
if ( stream.peek() == "{" && config.dicts ) {
|
|
state.tagName = word; /* tmp state extension */
|
|
state.tagColumn = stream.column();
|
|
return ret("tag", "tag", word);
|
|
} else if ( ch == "_" ) {
|
|
if ( word.length == 1 ) {
|
|
return ret("var", "anon", word);
|
|
} else {
|
|
var sec = word.charAt(1);
|
|
if ( sec == sec.toUpperCase() )
|
|
return ret("var", "var-2", word);
|
|
}
|
|
return ret("var", "var", word);
|
|
} else if ( ch == ch.toUpperCase() ) {
|
|
return ret("var", "var", word);
|
|
} else if ( stream.peek() == "(" ) {
|
|
state.functorName = word; /* tmp state extension */
|
|
state.functorColumn = stream.column();
|
|
return ret("functor", "functor", word);
|
|
} else
|
|
return ret("atom", "atom", word);
|
|
}
|
|
|
|
function plTokenString(quote) {
|
|
return function(stream, state) {
|
|
if (!nextUntilUnescaped(stream, state, quote)) {
|
|
state.tokenize = plTokenBase;
|
|
if ( stream.peek() == "(" ) { /* 'quoted functor'() */
|
|
var word = stream.current();
|
|
state.functorName = word; /* tmp state extension */
|
|
return ret("functor", "functor", word);
|
|
}
|
|
if ( stream.peek() == "{" && config.dicts ) { /* 'quoted tag'{} */
|
|
var word = stream.current();
|
|
state.tagName = word; /* tmp state extension */
|
|
return ret("tag", "tag", word);
|
|
}
|
|
}
|
|
return ret(quoteType[quote], quoteType[quote]);
|
|
};
|
|
}
|
|
|
|
function plTokenQuasiQuotation(stream, state) {
|
|
var maybeEnd = false, ch;
|
|
while (ch = stream.next()) {
|
|
if (ch == "}" && maybeEnd) {
|
|
state.tokenize = plTokenBase;
|
|
stream.backUp(2);
|
|
break;
|
|
}
|
|
maybeEnd = (ch == "|");
|
|
}
|
|
return ret("qq_content", "qq_content");
|
|
}
|
|
|
|
function plTokenComment(stream, state) {
|
|
var maybeEnd = false, ch;
|
|
while (ch = stream.next()) {
|
|
if (ch == "/" && maybeEnd) {
|
|
state.tokenize = plTokenBase;
|
|
break;
|
|
}
|
|
maybeEnd = (ch == "*");
|
|
}
|
|
return ret("comment", "comment");
|
|
}
|
|
|
|
|
|
// /*******************************
|
|
// * ACTIVE KEYS *
|
|
// *******************************/
|
|
|
|
// /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
// Support if-then-else layout like this:
|
|
|
|
// goal :-
|
|
// ( Condition
|
|
// -> IfTrue
|
|
// ; IfFalse
|
|
// ).
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
|
|
|
|
|
// CodeMirror.commands.prologStartIfThenElse = function(cm) {
|
|
// var start = cm.getCursor("start");
|
|
// var token = cm.getTokenAt(start, true);
|
|
|
|
// if ( token.state.goalStart == true )
|
|
// { cm.replaceSelection("( ", "end");
|
|
// return;
|
|
// }
|
|
|
|
// return CodeMirror.Pass;
|
|
// }
|
|
|
|
// CodeMirror.commands.prologStartThen = function(cm) {
|
|
// var start = cm.getCursor("start");
|
|
// var token = cm.getTokenAt(start, true);
|
|
|
|
// /* FIXME: These functions are copied from prolog.js. How
|
|
// can we reuse these?
|
|
// */
|
|
// function nesting(state) {
|
|
// var len = state.nesting.length;
|
|
// if ( len > 0 )
|
|
// return state.nesting[len-1];
|
|
// return null;
|
|
// }
|
|
|
|
// function isControl(state) { /* our terms are goals */
|
|
// var nest = nesting(state);
|
|
// if ( nest ) {
|
|
// if ( nest.type == "control" ) {
|
|
// return true;
|
|
// }
|
|
// return false;
|
|
// } else
|
|
// return state.inBody;
|
|
// }
|
|
|
|
// if ( start.ch == token.end &&
|
|
// token.type == "operator" &&
|
|
// token.string == "-" &&
|
|
// isControl(token.state) )
|
|
// { cm.replaceSelection("> ", "end");
|
|
// return;
|
|
// }
|
|
|
|
// return CodeMirror.Pass;
|
|
// }
|
|
|
|
// CodeMirror.commands.prologStartElse = function(cm) {
|
|
// var start = cm.getCursor("start");
|
|
// var token = cm.getTokenAt(start, true);
|
|
|
|
// if ( token.start == 0 && start.ch == token.end &&
|
|
// !/\S/.test(token.string) )
|
|
// { cm.replaceSelection("; ", "end");
|
|
// return;
|
|
// }
|
|
|
|
// return CodeMirror.Pass;
|
|
// }
|
|
|
|
// CodeMirror.defineOption("prologKeys", null, function(cm, val, prev) {
|
|
// if (prev && prev != CodeMirror.Init)
|
|
// cm.removeKeyMap("prolog");
|
|
// if ( val ) {
|
|
// var map = { name: "prolog",
|
|
// "'('": "prologStartIfThenElse",
|
|
// "'>'": "prologStartThen",
|
|
// "';'": "prologStartElse",
|
|
// "Ctrl-L": "refreshHighlight"
|
|
// };
|
|
// cm.addKeyMap(map);
|
|
// }
|
|
// });
|
|
|
|
// });
|
|
//Default (SWI-)Prolog operator table. To be used later to enhance the
|
|
//offline experience.
|
|
|
|
var ops = { "-->": { p:1200, t:"xfx" },
|
|
":-": [ { p:1200, t:"xfx" },
|
|
{ p:1200, t:"fx" }
|
|
],
|
|
"?-": { p:1200, t:"fx" },
|
|
|
|
"dynamic": { p:1150, t:"fx" },
|
|
"discontiguous": { p:1150, t:"fx" },
|
|
"initialization": { p:1150, t:"fx" },
|
|
"meta_predicate": { p:1150, t:"fx" },
|
|
"module_transparent": { p:1150, t:"fx" },
|
|
"multifile": { p:1150, t:"fx" },
|
|
"thread_local": { p:1150, t:"fx" },
|
|
"volatile": { p:1150, t:"fx" },
|
|
|
|
";": { p:1100, t:"xfy" },
|
|
"|": { p:1100, t:"xfy" },
|
|
|
|
"->": { p:1050, t:"xfy" },
|
|
"*->": { p:1050, t:"xfy" },
|
|
|
|
",": { p:1000, t:"xfy" },
|
|
|
|
"\\+": { p:900, t:"fy" },
|
|
|
|
"~": { p:900, t:"fx" },
|
|
|
|
"<": { p:700, t:"xfx" },
|
|
"=": { p:700, t:"xfx" },
|
|
"=..": { p:700, t:"xfx" },
|
|
"=@=": { p:700, t:"xfx" },
|
|
"=:=": { p:700, t:"xfx" },
|
|
"=<": { p:700, t:"xfx" },
|
|
"==": { p:700, t:"xfx" },
|
|
"=\\=": { p:700, t:"xfx" },
|
|
">": { p:700, t:"xfx" },
|
|
">=": { p:700, t:"xfx" },
|
|
"@<": { p:700, t:"xfx" },
|
|
"@=<": { p:700, t:"xfx" },
|
|
"@>": { p:700, t:"xfx" },
|
|
"@>=": { p:700, t:"xfx" },
|
|
"\\=": { p:700, t:"xfx" },
|
|
"\\==": { p:700, t:"xfx" },
|
|
"is": { p:700, t:"xfx" },
|
|
|
|
":": { p:600, t:"xfy" },
|
|
|
|
"+": [ { p:500, t:"yfx" },
|
|
{ p:200, t:"fy" }
|
|
],
|
|
"-": [ { p:500, t:"yfx" },
|
|
{ p:200, t:"fy" }
|
|
],
|
|
"/\\": { p:500, t:"yfx" },
|
|
"\\/": { p:500, t:"yfx" },
|
|
"xor": { p:500, t:"yfx" },
|
|
|
|
"?": { p:500, t:"fx" },
|
|
|
|
"*": { p:400, t:"yfx" },
|
|
"/": { p:400, t:"yfx" },
|
|
"//": { p:400, t:"yfx" },
|
|
"rdiv": { p:400, t:"yfx" },
|
|
"<<": { p:400, t:"yfx" },
|
|
">>": { p:400, t:"yfx" },
|
|
"mod": { p:400, t:"yfx" },
|
|
"rem": { p:400, t:"yfx" },
|
|
|
|
"**": { p:200, t:"xfx" },
|
|
"^": { p:200, t:"xfy" },
|
|
|
|
"\\": { p:200, t:"fy" }
|
|
};
|
|
|
|
var translType = {
|
|
"comment": "comment",
|
|
"var": "variable-2", /* JavaScript Types */
|
|
"atom": "atom",
|
|
"qatom": "atom",
|
|
"bqstring": "string",
|
|
"symbol": "atom",
|
|
"functor": "keyword",
|
|
"tag": "tag",
|
|
"number": "number",
|
|
"string": "string",
|
|
"code": "number",
|
|
"neg-number": "number",
|
|
"pos-number": "number",
|
|
"list_open": "bracket",
|
|
"list_close": "bracket",
|
|
"qq_open": "bracket",
|
|
"qq_sep": "operator",
|
|
"qq_close": "bracket",
|
|
"dict_open": "bracket",
|
|
"dict_close": "bracket",
|
|
"brace_term_open": "bracket",
|
|
"brace_term_close": "bracket",
|
|
"neck": "keyword",
|
|
"fullstop": "keyword"
|
|
};
|
|
|
|
var builtins = {
|
|
"asserta": "prolog",
|
|
"atomic_list_concat": "prolog",
|
|
"char_type": "prolog",
|
|
"compile_expressions": "prolog",
|
|
"compile": "prolog",
|
|
"create_prolog_flag": "prolog",
|
|
"current_module": "prolog",
|
|
"current_op": "prolog",
|
|
"del_attrs": "prolog",
|
|
"depth_bound_call": "prolog",
|
|
"dule": "prolog",
|
|
"exo_files": "prolog",
|
|
"export_list": "prolog",
|
|
"foreign_directory": "prolog",
|
|
"garbage_collect_atoms": "prolog",
|
|
"garbage_collect": "prolog",
|
|
"get_attrs": "prolog",
|
|
"hread_signal": "prolog",
|
|
"ignore": "prolog",
|
|
"incore": "prolog",
|
|
"initialization": "prolog",
|
|
"int_message": "prolog",
|
|
"message_to_string": "prolog",
|
|
"module_property": "prolog",
|
|
"msort": "prolog",
|
|
"mutex_unlock_all": "prolog",
|
|
"no_style_check": "prolog",
|
|
"nospy": "prolog",
|
|
"notrace": "prolog",
|
|
"ortray_clause": "prolog",
|
|
"otherwise": "prolog",
|
|
"predsort": "prolog",
|
|
"prolog_initialization": "prolog",
|
|
"qend_program": "prolog",
|
|
"qsave_file": "prolog",
|
|
"recordaifnot": "prolog",
|
|
"set_base_module": "prolog",
|
|
"sformat": "prolog",
|
|
"source_file": "prolog",
|
|
"split_path_file": "prolog",
|
|
"stream_position": "prolog",
|
|
"system_error": "prolog",
|
|
"system_module": "prolog",
|
|
"t_head": "prolog",
|
|
"table_statistics": "prolog",
|
|
"tabling_mode": "prolog",
|
|
"tabling_statistics": "prolog",
|
|
"thread_defaults": "prolog",
|
|
"thread_local": "prolog",
|
|
"thread_set_defaults": "prolog",
|
|
"thread_statistics": "prolog",
|
|
"unix": "prolog",
|
|
"use_system_module": "prolog",
|
|
"user_defined_directive": "prolog",
|
|
"version": "prolog",
|
|
"C": "prolog",
|
|
"abolish_all_tables": "prolog",
|
|
"abolish_frozen_choice_points": "prolog",
|
|
"abolish_module": "prolog",
|
|
"abolish_table": "prolog",
|
|
"abolish": "prolog",
|
|
"abort": "prolog",
|
|
"absolute_file_name": "prolog",
|
|
"absolute_file_system_path": "prolog",
|
|
"access_file": "prolog",
|
|
"access": "prolog",
|
|
"acyclic_term": "prolog",
|
|
"add_import_module": "prolog",
|
|
"add_to_array_element": "prolog",
|
|
"add_to_path": "prolog",
|
|
"alarm": "prolog",
|
|
"all": "prolog",
|
|
"always_prompt_user": "prolog",
|
|
"arena_size": "prolog",
|
|
"arg": "prolog",
|
|
"array_element": "prolog",
|
|
"array": "prolog",
|
|
"assert_static": "prolog",
|
|
"asserta_static": "prolog",
|
|
"assertz_static": "prolog",
|
|
"assertz": "prolog",
|
|
"assert": "prolog",
|
|
"at_end_of_line": "prolog",
|
|
"at_end_of_stream_0": "prolog",
|
|
"at_end_of_stream": "prolog",
|
|
"at_halt": "prolog",
|
|
"atom_chars": "prolog",
|
|
"atom_codes": "prolog",
|
|
"atom_concat": "prolog",
|
|
"atom_length": "prolog",
|
|
"atom_number": "prolog",
|
|
"atom_string": "prolog",
|
|
"atom_to_term": "prolog",
|
|
"atomic_concat": "prolog",
|
|
"atomic_length": "prolog",
|
|
"atomic_list_concat": "prolog",
|
|
"atomics_to_string": "prolog",
|
|
"atomic": "prolog",
|
|
"atom": "prolog",
|
|
"attvar": "prolog",
|
|
"b_getval": "prolog",
|
|
"b_setval": "prolog",
|
|
"bagof": "prolog",
|
|
"bb_delete": "prolog",
|
|
"bb_get": "prolog",
|
|
"bb_put": "prolog",
|
|
"bb_update": "prolog",
|
|
"between": "prolog",
|
|
"bootstrap": "prolog",
|
|
"break": "prolog",
|
|
"call_cleanup": "prolog",
|
|
"call_count_data": "prolog",
|
|
"call_count_reset": "prolog",
|
|
"call_count": "prolog",
|
|
"call_residue_vars": "prolog",
|
|
"call_residue": "prolog",
|
|
"call_shared_object_function": "prolog",
|
|
"call_with_args": "prolog",
|
|
"callable": "prolog",
|
|
"call": "prolog",
|
|
"catch_ball": "prolog",
|
|
"catch": "prolog",
|
|
"cd": "prolog",
|
|
"cfile_search_path": "prolog",
|
|
"char_code": "prolog",
|
|
"char_conversion": "prolog",
|
|
"char_type": "prolog",
|
|
"clause_property": "prolog",
|
|
"clause": "prolog",
|
|
"close_shared_object": "prolog",
|
|
"close_static_array": "prolog",
|
|
"close": "prolog",
|
|
"code_type": "prolog",
|
|
"commons_directory": "prolog",
|
|
"commons_library": "prolog",
|
|
"compare": "prolog",
|
|
"compile_expressions": "prolog",
|
|
"compile_predicates": "prolog",
|
|
"compile": "prolog",
|
|
"compound": "prolog",
|
|
"consult_depth": "prolog",
|
|
"consult": "prolog",
|
|
"context_module": "prolog",
|
|
"copy_term_nat": "prolog",
|
|
"copy_term": "prolog",
|
|
"create_mutable": "prolog",
|
|
"create_prolog_flag": "prolog",
|
|
"creep_allowed": "prolog",
|
|
"current_atom": "prolog",
|
|
"current_char_conversion": "prolog",
|
|
"current_host": "prolog",
|
|
"current_input": "prolog",
|
|
"current_key": "prolog",
|
|
"current_line_number": "prolog",
|
|
"current_module": "prolog",
|
|
"current_mutex": "prolog",
|
|
"current_op": "prolog",
|
|
"current_output": "prolog",
|
|
"current_predicate": "prolog",
|
|
"current_prolog_flag": "prolog",
|
|
"current_reference_count": "prolog",
|
|
"current_stream": "prolog",
|
|
"current_thread": "prolog",
|
|
"db_files": "prolog",
|
|
"db_reference": "prolog",
|
|
"debugging": "prolog",
|
|
"debug": "prolog",
|
|
"decrease_reference_count": "prolog",
|
|
"del_attrs": "prolog",
|
|
"del_attr": "prolog",
|
|
"delete_import_module": "prolog",
|
|
"depth_bound_call": "prolog",
|
|
"dif": "prolog",
|
|
"discontiguous": "prolog",
|
|
"display": "prolog",
|
|
"do_c_built_in": "prolog",
|
|
"do_c_built_metacall": "prolog",
|
|
"do_not_compile_expressions": "prolog",
|
|
"dump_active_goals": "prolog",
|
|
"dum": "prolog",
|
|
"duplicate_term": "prolog",
|
|
"dynamic_predicate": "prolog",
|
|
"dynamic_update_array": "prolog",
|
|
"dynamic": "prolog",
|
|
"eamconsult": "prolog",
|
|
"eamtrans": "prolog",
|
|
"end_of_file": "prolog",
|
|
"ensure_loaded": "prolog",
|
|
"eraseall": "prolog",
|
|
"erased": "prolog",
|
|
"erase": "prolog",
|
|
"exists_directory": "prolog",
|
|
"exists_file": "prolog",
|
|
"exists_source": "prolog",
|
|
"exists": "prolog",
|
|
"exo_files": "prolog",
|
|
"expand_exprs": "prolog",
|
|
"expand_expr": "prolog",
|
|
"expand_file_name": "prolog",
|
|
"expand_goal": "prolog",
|
|
"expand_term": "prolog",
|
|
"expects_dialect": "prolog",
|
|
"export_list": "prolog",
|
|
"export_resource": "prolog",
|
|
"export": "prolog",
|
|
"extend": "prolog",
|
|
"fail": "prolog",
|
|
"false": "prolog",
|
|
"file_base_name": "prolog",
|
|
"file_directory_name": "prolog",
|
|
"file_exists": "prolog",
|
|
"file_name_extension": "prolog",
|
|
"file_search_path": "prolog",
|
|
"file_size": "prolog",
|
|
"fileerrors": "prolog",
|
|
"findall": "prolog",
|
|
"float": "prolog",
|
|
"flush_output": "prolog",
|
|
"forall": "prolog",
|
|
"foreign_directory": "prolog",
|
|
"format": "prolog",
|
|
"freeze_choice_point": "prolog",
|
|
"freeze": "prolog",
|
|
"frozen": "prolog",
|
|
"functor": "prolog",
|
|
"garbage_collect_atoms": "prolog",
|
|
"garbage_collect": "prolog",
|
|
"gc": "prolog",
|
|
"get0": "prolog",
|
|
"get_attr": "prolog",
|
|
"get_byte": "prolog",
|
|
"get_char": "prolog",
|
|
"get_code": "prolog",
|
|
"get_depth_limit": "prolog",
|
|
"get_mutable": "prolog",
|
|
"get_string_code": "prolog",
|
|
"get_value": "prolog",
|
|
"getcwd": "prolog",
|
|
"getenv": "prolog",
|
|
"get": "prolog",
|
|
"global_trie_statistics": "prolog",
|
|
"ground": "prolog",
|
|
"grow_heap": "prolog",
|
|
"grow_stack": "prolog",
|
|
"halt": "prolog",
|
|
"heap_space_info": "prolog",
|
|
"hide_atom": "prolog",
|
|
"hide_predicate": "prolog",
|
|
"hostname_address": "prolog",
|
|
"hread_get_message": "prolog",
|
|
"if": "prolog",
|
|
"ignore": "prolog",
|
|
"import_module": "prolog",
|
|
"incore": "prolog",
|
|
"increase_reference_count": "prolog",
|
|
"init_random_state": "prolog",
|
|
"initialization": "prolog",
|
|
"instance_property": "prolog",
|
|
"instance": "prolog",
|
|
"integer": "prolog",
|
|
"is_absolute_file_name": "prolog",
|
|
"is_list": "prolog",
|
|
"is_mutable": "prolog",
|
|
"is_tabled": "prolog",
|
|
"isinf": "prolog",
|
|
"isnan": "prolog",
|
|
"is": "prolog",
|
|
"key_erased_statistics": "prolog",
|
|
"key_statistics": "prolog",
|
|
"keysort": "prolog",
|
|
"leash": "prolog",
|
|
"length": "prolog",
|
|
"libraries_directories": "prolog",
|
|
"line_count": "prolog",
|
|
"listing": "prolog",
|
|
"load_absolute_foreign_files": "prolog",
|
|
"load_db": "prolog",
|
|
"load_files": "prolog",
|
|
"load_foreign_files": "prolog",
|
|
"log_event": "prolog",
|
|
"logsum": "prolog",
|
|
"ls_imports": "prolog",
|
|
"ls": "prolog",
|
|
"make_directory": "prolog",
|
|
"make_library_index": "prolog",
|
|
"make": "prolog",
|
|
"message_queue_create": "prolog",
|
|
"message_queue_destroy": "prolog",
|
|
"message_queue_property": "prolog",
|
|
"message_to_string": "prolog",
|
|
"mmapped_array": "prolog",
|
|
"module_property": "prolog",
|
|
"module_state": "prolog",
|
|
"module": "prolog",
|
|
"msort": "prolog",
|
|
"multifile": "prolog",
|
|
"must_be_of_type": "prolog",
|
|
"mutex_create": "prolog",
|
|
"mutex_property": "prolog",
|
|
"mutex_unlock_all": "prolog",
|
|
"name": "prolog",
|
|
"nb_create": "prolog",
|
|
"nb_current": "prolog",
|
|
"nb_delete": "prolog",
|
|
"nb_getval": "prolog",
|
|
"nb_linkarg": "prolog",
|
|
"nb_linkval": "prolog",
|
|
"nb_set_bit": "prolog",
|
|
"nb_set_shared_arg": "prolog",
|
|
"nb_set_shared_val": "prolog",
|
|
"nb_setarg": "prolog",
|
|
"nb_setval": "prolog",
|
|
"new_system_module": "prolog",
|
|
"nl": "prolog",
|
|
"no_source": "prolog",
|
|
"no_style_check": "prolog",
|
|
"nodebug": "prolog",
|
|
"nofileeleerrors": "prolog",
|
|
"nogc": "prolog",
|
|
"nonvar": "prolog",
|
|
"nospyall": "prolog",
|
|
"nospy": "prolog",
|
|
"notrace": "prolog",
|
|
"not": "prolog",
|
|
"nth_clause": "prolog",
|
|
"nth_instance": "prolog",
|
|
"number_atom": "prolog",
|
|
"number_chars": "prolog",
|
|
"number_codes": "prolog",
|
|
"number_string": "prolog",
|
|
"numbervars": "prolog",
|
|
"number": "prolog",
|
|
"on_exception": "prolog",
|
|
"on_signal": "prolog",
|
|
"once": "prolog",
|
|
"opaque": "prolog",
|
|
"open_pipe_stream": "prolog",
|
|
"open_shared_object": "prolog",
|
|
"open": "prolog",
|
|
"opt_statistics": "prolog",
|
|
"op": "prolog",
|
|
"or_statistics": "prolog",
|
|
"otherwise": "prolog",
|
|
"parallel_findall": "prolog",
|
|
"parallel_findfirst": "prolog",
|
|
"parallel_once": "prolog",
|
|
"parallel": "prolog",
|
|
"path": "prolog",
|
|
"peek_byte": "prolog",
|
|
"peek_char": "prolog",
|
|
"peek_code": "prolog",
|
|
"peek": "prolog",
|
|
"phrase": "prolog",
|
|
"plus": "prolog",
|
|
"portray_clause": "prolog",
|
|
"predicate_erased_statistics": "prolog",
|
|
"predicate_property": "prolog",
|
|
"predicate_statistics": "prolog",
|
|
"predmerge": "prolog",
|
|
"predsort": "prolog",
|
|
"primitive": "prolog",
|
|
"print_message_lines": "prolog",
|
|
"print_message": "prolog",
|
|
"print": "prolog",
|
|
"private": "prolog",
|
|
"profalt": "prolog",
|
|
"profend": "prolog",
|
|
"profile_data": "prolog",
|
|
"profile_reset": "prolog",
|
|
"profinit": "prolog",
|
|
"profoff": "prolog",
|
|
"profon": "prolog",
|
|
"prolog_current_frame": "prolog",
|
|
"prolog_file_name": "prolog",
|
|
"prolog_file_type": "prolog",
|
|
"prolog_flag_property": "prolog",
|
|
"prolog_flag": "prolog",
|
|
"prolog_initialization": "prolog",
|
|
"prolog_load_context": "prolog",
|
|
"prolog_to_os_filename": "prolog",
|
|
"prolog": "prolog",
|
|
"prompt1": "prolog",
|
|
"prompt": "prolog",
|
|
"put_attrs": "prolog",
|
|
"put_attr": "prolog",
|
|
"put_byte": "prolog",
|
|
"put_char1": "prolog",
|
|
"put_char": "prolog",
|
|
"put_code": "prolog",
|
|
"putenv": "prolog",
|
|
"put": "prolog",
|
|
"pwd": "prolog",
|
|
"qend_program": "prolog",
|
|
"qload_file": "prolog",
|
|
"qload_module": "prolog",
|
|
"qpack_clean_up_to_disjunction": "prolog",
|
|
"qsave_file": "prolog",
|
|
"qsave_module": "prolog",
|
|
"qsave_program": "prolog",
|
|
"raise_exception": "prolog",
|
|
"rational_term_to_tree": "prolog",
|
|
"rational": "prolog",
|
|
"read_clause": "prolog",
|
|
"read_sig": "prolog",
|
|
"read_term_from_atomic": "prolog",
|
|
"read_term_from_atom": "prolog",
|
|
"read_term_from_string": "prolog",
|
|
"read_term": "prolog",
|
|
"read": "prolog",
|
|
"real_path": "prolog",
|
|
"reconsult": "prolog",
|
|
"recorda_at": "prolog",
|
|
"recordaifnot": "prolog",
|
|
"recorda": "prolog",
|
|
"recorded": "prolog",
|
|
"recordz_at": "prolog",
|
|
"recordzifnot": "prolog",
|
|
"recordz": "prolog",
|
|
"release_random_state": "prolog",
|
|
"remove_from_path": "prolog",
|
|
"rename": "prolog",
|
|
"repeat": "prolog",
|
|
"reset_static_array": "prolog",
|
|
"reset_total_choicepoints": "prolog",
|
|
"resize_static_array": "prolog",
|
|
"restore": "prolog",
|
|
"retractall": "prolog",
|
|
"retract": "prolog",
|
|
"rmdir": "prolog",
|
|
"same_file": "prolog",
|
|
"save_program": "prolog",
|
|
"seeing": "prolog",
|
|
"seen": "prolog",
|
|
"see": "prolog",
|
|
"set_base_module": "prolog",
|
|
"set_input": "prolog",
|
|
"set_output": "prolog",
|
|
"set_prolog_flag": "prolog",
|
|
"set_random_state": "prolog",
|
|
"set_stream_position": "prolog",
|
|
"set_stream": "prolog",
|
|
"set_value": "prolog",
|
|
"setarg": "prolog",
|
|
"setenv": "prolog",
|
|
"setof": "prolog",
|
|
"setup_call_catcher_cleanup": "prolog",
|
|
"setup_call_cleanup": "prolog",
|
|
"sformat": "prolog",
|
|
"show_all_local_tables": "prolog",
|
|
"show_all_tables": "prolog",
|
|
"show_global_trieshow_tabled_predicates": "prolog",
|
|
"show_global_trie": "prolog",
|
|
"show_low_level_trace": "prolog",
|
|
"show_tabled_predicates": "prolog",
|
|
"show_table": "prolog",
|
|
"showprofres": "prolog",
|
|
"sh": "prolog",
|
|
"simple": "prolog",
|
|
"skip1": "prolog",
|
|
"skip": "prolog",
|
|
"socket_accept": "prolog",
|
|
"socket_bind": "prolog",
|
|
"socket_close": "prolog",
|
|
"socket_connect": "prolog",
|
|
"socket_listen": "prolog",
|
|
"socket": "prolog",
|
|
"sort2": "prolog",
|
|
"sort": "prolog",
|
|
"source_file_property": "prolog",
|
|
"source_file": "prolog",
|
|
"source_location": "prolog",
|
|
"source_mode": "prolog",
|
|
"source_module": "prolog",
|
|
"source": "prolog",
|
|
"split_path_file": "prolog",
|
|
"spy": "prolog",
|
|
"srandom": "prolog",
|
|
"start_low_level_trace": "prolog",
|
|
"stash_predicate": "prolog",
|
|
"static_array_location": "prolog",
|
|
"static_array_properties": "prolog",
|
|
"static_array_to_term": "prolog",
|
|
"static_array": "prolog",
|
|
"statistics": "prolog",
|
|
"stop_low_level_trace": "prolog",
|
|
"stream_position_data": "prolog",
|
|
"stream_position": "prolog",
|
|
"stream_property": "prolog",
|
|
"stream_select": "prolog",
|
|
"string_chars": "prolog",
|
|
"string_codes": "prolog",
|
|
"string_code": "prolog",
|
|
"string_concat": "prolog",
|
|
"string_length": "prolog",
|
|
"string_number": "prolog",
|
|
"string_to_atomic": "prolog",
|
|
"string_to_atom": "prolog",
|
|
"string_to_list": "prolog",
|
|
"string": "prolog",
|
|
"strip_module": "prolog",
|
|
"style_check": "prolog",
|
|
"sub_atom": "prolog",
|
|
"sub_string": "prolog",
|
|
"subsumes_term": "prolog",
|
|
"succ": "prolog",
|
|
"sys_debug": "prolog",
|
|
"system_error": "prolog",
|
|
"system_library": "prolog",
|
|
"system_module": "prolog",
|
|
"system_predicate": "prolog",
|
|
"system": "prolog",
|
|
"t_body": "prolog",
|
|
"t_head": "prolog",
|
|
"t_hgoal": "prolog",
|
|
"t_hlist": "prolog",
|
|
"t_tidy": "prolog",
|
|
"tab1": "prolog",
|
|
"table_statistics": "prolog",
|
|
"table": "prolog",
|
|
"tabling_mode": "prolog",
|
|
"tabling_statistics": "prolog",
|
|
"tab": "prolog",
|
|
"telling": "prolog",
|
|
"tell": "prolog",
|
|
"term_attvars": "prolog",
|
|
"term_factorized": "prolog",
|
|
"term_to_atom": "prolog",
|
|
"term_to_string": "prolog",
|
|
"term_variables": "prolog",
|
|
"thread_at_exit": "prolog",
|
|
"thread_cancel": "prolog",
|
|
"thread_create": "prolog",
|
|
"thread_defaults": "prolog",
|
|
"thread_default": "prolog",
|
|
"thread_detach": "prolog",
|
|
"thread_exit": "prolog",
|
|
"thread_get_message": "prolog",
|
|
"thread_join": "prolog",
|
|
"thread_local": "prolog",
|
|
"thread_peek_message": "prolog",
|
|
"thread_property": "prolog",
|
|
"thread_self": "prolog",
|
|
"thread_send_message": "prolog",
|
|
"thread_set_defaults": "prolog",
|
|
"thread_set_default": "prolog",
|
|
"thread_signal": "prolog",
|
|
"thread_sleep": "prolog",
|
|
"thread_statistics": "prolog",
|
|
"threads": "prolog",
|
|
"throw": "prolog",
|
|
"time_file64": "prolog",
|
|
"time_file": "prolog",
|
|
"time": "prolog",
|
|
"told": "prolog",
|
|
"tolower": "prolog",
|
|
"total_choicepoints": "prolog",
|
|
"total_erased": "prolog",
|
|
"toupper": "prolog",
|
|
"trace": "prolog",
|
|
"true_file_name": "prolog",
|
|
"true": "prolog",
|
|
"tthread_peek_message": "prolog",
|
|
"ttyget0": "prolog",
|
|
"ttyget": "prolog",
|
|
"ttynl": "prolog",
|
|
"ttyput": "prolog",
|
|
"ttyskip": "prolog",
|
|
"udi": "prolog",
|
|
"unhide_atom": "prolog",
|
|
"unify_with_occurs_check": "prolog",
|
|
"unix": "prolog",
|
|
"unknown": "prolog",
|
|
"unload_file": "prolog",
|
|
"unload_module": "prolog",
|
|
"unnumbervars": "prolog",
|
|
"update_array": "prolog",
|
|
"update_mutable": "prolog",
|
|
"use_module": "prolog",
|
|
"use_system_module": "prolog",
|
|
"user_defined_directive": "prolog",
|
|
"var": "prolog",
|
|
"version": "prolog",
|
|
"volatile": "prolog",
|
|
"wake_choice_point": "prolog",
|
|
"when": "prolog",
|
|
"with_mutex": "prolog",
|
|
"with_output_to": "prolog",
|
|
"working_directory": "prolog",
|
|
"write_canonical": "prolog",
|
|
"write_depth": "prolog",
|
|
"write_term": "prolog",
|
|
"writeln": "prolog",
|
|
"writeq": "prolog",
|
|
"write": "prolog",
|
|
"yap_flag": "prolog"
|
|
};
|
|
|
|
/*******************************
|
|
* RETURN OBJECT *
|
|
*******************************/
|
|
|
|
return {
|
|
startState: function() {
|
|
return {
|
|
tokenize: plTokenBase,
|
|
inBody: false,
|
|
goalStart: false,
|
|
lastType: null,
|
|
nesting: new Array(), /* ([{}]) nesting FIXME: copy this */
|
|
curTerm: null, /* term index in metainfo */
|
|
curToken: null /* token in term */
|
|
};
|
|
},
|
|
|
|
|
|
token: function(stream, state) {
|
|
var nest;
|
|
|
|
if ( state.curTerm == null && mode
|
|
Config.metainfo ) {
|
|
state.curTerm = 0;
|
|
state.curToken = 0;
|
|
}
|
|
|
|
if ( stream.sol() )
|
|
delete state.commaAtEOL;
|
|
|
|
if ( state.tokenize == plTokenBase && stream.eatSpace() ) {
|
|
if ( stream.eol() )
|
|
setArgAlignment(state);
|
|
return null;
|
|
}
|
|
|
|
var style = state.tokenize(stream, state);
|
|
|
|
if ( stream.eol() )
|
|
setArgAlignment(state);
|
|
|
|
if ( type == "neck" ) {
|
|
state.inBody = true;
|
|
state.goalStart = true;
|
|
} else if ( type == "fullstop" ) {
|
|
state.inBody = false;
|
|
state.goalStart = false;
|
|
}
|
|
|
|
state.lastType = type;
|
|
|
|
|
|
if ( builtins[state.curToken] == "prolog")
|
|
return "builtin";
|
|
if ( ops[state.curToken])
|
|
return "operator";
|
|
return translType[type];
|
|
},
|
|
|
|
indent: function(state, textAfter) {
|
|
if (state.tokenize == plTokenComment) return CodeMirror.Pass;
|
|
|
|
var nest;
|
|
if ( (nest=nesting(state)) ) {
|
|
if ( nest.closeColumn && !state.commaAtEOL )
|
|
return nest.closeColumn;
|
|
return nest.alignment;
|
|
}
|
|
if ( !state.inBody )
|
|
return 0;
|
|
|
|
return 4;
|
|
},
|
|
|
|
// theme: "prolog",
|
|
|
|
blockCommentStart: "/*", /* continuecomment.js support */
|
|
blockCommentEnd: "*/",
|
|
blockCommentContinue: " * ",
|
|
lineComment: "%",
|
|
};
|
|
|
|
});
|
|
|
|
CodeMirror.defineMIME("text/x-prolog", "prolog");
|
|
});
|