summaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorkrangelov <kr.angelov@gmail.com>2019-06-24 12:14:15 +0200
committerkrangelov <kr.angelov@gmail.com>2019-06-24 12:14:15 +0200
commite2395335cb261d5215a97158620d560ec6adcea6 (patch)
tree02038307e2572c8280e5fd3f85b889beeeb2ab7d /src/runtime
parent2d9478b97332db11980ed12b1ab0b892ab95cfff (diff)
parent17e3f753fbae1e87ae4f7f5dcf65a81620c82bee (diff)
Merge branch 'master' of https://github.com/GrammaticalFramework/gf-core
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/javascript/DEPRECATED.md7
-rw-r--r--src/runtime/javascript/gflib.js802
-rw-r--r--src/runtime/typescript/.eslintrc18
-rw-r--r--src/runtime/typescript/README.md31
-rw-r--r--src/runtime/typescript/gflib.d.ts337
-rw-r--r--src/runtime/typescript/gflib.ts1619
-rw-r--r--src/runtime/typescript/js/gflib.js1164
-rw-r--r--src/runtime/typescript/js/gflib.js.map1
-rw-r--r--src/runtime/typescript/tsconfig.json12
9 files changed, 3253 insertions, 738 deletions
diff --git a/src/runtime/javascript/DEPRECATED.md b/src/runtime/javascript/DEPRECATED.md
new file mode 100644
index 000000000..a4a8993c6
--- /dev/null
+++ b/src/runtime/javascript/DEPRECATED.md
@@ -0,0 +1,7 @@
+# Deprecation notice
+
+As of June 2019, this JavaScript version of the GF runtime is considered deprecated,
+in favour of the TypeScript version in `../typescript/gflib.ts`.
+
+If you don't want/need TypeScript and are just looking for a ready-to-use JavaScript version,
+see `../typescript/js/gflib.js` which is generated directly from the TypeScript version.
diff --git a/src/runtime/javascript/gflib.js b/src/runtime/javascript/gflib.js
index 97e98aab2..0dc5a2ff3 100644
--- a/src/runtime/javascript/gflib.js
+++ b/src/runtime/javascript/gflib.js
@@ -1,38 +1,38 @@
function GFGrammar(abstract, concretes) {
- this.abstract = abstract;
- this.concretes = concretes;
+ this.abstract = abstract;
+ this.concretes = concretes;
}
-/* Translates a string from any concrete syntax to all concrete syntaxes.
+/* Translates a string from any concrete syntax to all concrete syntaxes.
Uses the start category of the grammar.
*/
GFGrammar.prototype.translate = function (input, fromLang, toLang) {
- var outputs = new Object();
- var fromConcs = this.concretes;
- if (fromLang) {
- fromConcs = new Object();
- fromConcs[fromLang] = this.concretes[fromLang];
- }
- var toConcs = this.concretes;
- if (toLang) {
- toConcs = new Object();
- toConcs[toLang] = this.concretes[toLang];
- }
- for (var c1 in fromConcs) {
- var concrete = this.concretes[c1];
- var trees = concrete.parseString(input, this.abstract.startcat);
- if (trees.length > 0) {
- outputs[c1] = new Array();
- for (var i in trees) {
- outputs[c1][i] = new Object();
- for (var c2 in toConcs) {
- outputs[c1][i][c2] = this.concretes[c2].linearize(trees[i]);
- }
- }
- }
- }
- return outputs;
+ var outputs = new Object();
+ var fromConcs = this.concretes;
+ if (fromLang) {
+ fromConcs = new Object();
+ fromConcs[fromLang] = this.concretes[fromLang];
+ }
+ var toConcs = this.concretes;
+ if (toLang) {
+ toConcs = new Object();
+ toConcs[toLang] = this.concretes[toLang];
+ }
+ for (var c1 in fromConcs) {
+ var concrete = this.concretes[c1];
+ var trees = concrete.parseString(input, this.abstract.startcat);
+ if (trees.length > 0) {
+ outputs[c1] = new Array();
+ for (var i in trees) {
+ outputs[c1][i] = new Object();
+ for (var c2 in toConcs) {
+ outputs[c1][i][c2] = this.concretes[c2].linearize(trees[i]);
+ }
+ }
+ }
+ }
+ return outputs;
}
@@ -47,56 +47,56 @@ String.prototype.setTag = function (tag) { this.tag = tag; };
/* Abstract syntax trees */
function Fun(name) {
- this.name = name;
- this.args = new Array();
- for (var i = 1; i < arguments.length; i++) {
- this.args[i-1] = arguments[i];
- }
+ this.name = name;
+ this.args = new Array();
+ for (var i = 1; i < arguments.length; i++) {
+ this.args[i-1] = arguments[i];
+ }
}
Fun.prototype.print = function () { return this.show(0); } ;
Fun.prototype.show = function (prec) {
- if (this.isMeta()) {
- if (isUndefined(this.type)) {
- return '?';
- } else {
- var s = '?:' + this.type;
- if (prec > 0) {
- s = "(" + s + ")" ;
- }
- return s;
- }
- } else {
- var s = this.name;
- var cs = this.args;
- for (var i in cs) {
- s += " " + (isUndefined(cs[i]) ? "undefined" : cs[i].show(1));
- }
- if (prec > 0 && cs.length > 0) {
- s = "(" + s + ")" ;
- }
- return s;
- }
+ if (this.isMeta()) {
+ if (isUndefined(this.type)) {
+ return '?';
+ } else {
+ var s = '?:' + this.type;
+ if (prec > 0) {
+ s = "(" + s + ")" ;
+ }
+ return s;
+ }
+ } else {
+ var s = this.name;
+ var cs = this.args;
+ for (var i in cs) {
+ s += " " + (isUndefined(cs[i]) ? "undefined" : cs[i].show(1));
+ }
+ if (prec > 0 && cs.length > 0) {
+ s = "(" + s + ")" ;
+ }
+ return s;
+ }
};
Fun.prototype.getArg = function (i) {
- return this.args[i];
+ return this.args[i];
};
Fun.prototype.setArg = function (i,c) {
- this.args[i] = c;
+ this.args[i] = c;
};
Fun.prototype.isMeta = function() {
- return this.name == '?';
+ return this.name == '?';
} ;
Fun.prototype.isComplete = function() {
- if (this.isMeta()) {
- return false;
- } else {
- for (var i in this.args) {
- if (!this.args[i].isComplete()) {
- return false;
- }
- }
- return true;
- }
+ if (this.isMeta()) {
+ return false;
+ } else {
+ for (var i in this.args) {
+ if (!this.args[i].isComplete()) {
+ return false;
+ }
+ }
+ return true;
+ }
} ;
Fun.prototype.isLiteral = function() {
return (/^[\"\-\d]/).test(this.name);
@@ -120,146 +120,146 @@ Fun.prototype.isEqual = function(obj) {
if (!this.args[i].isEqual(obj.args[i]))
return false;
}
-
+
return true;
}
/* Type annotation */
function GFAbstract(startcat, types) {
- this.startcat = startcat;
- this.types = types;
+ this.startcat = startcat;
+ this.types = types;
}
GFAbstract.prototype.addType = function(fun, args, cat) {
- this.types[fun] = new Type(args, cat);
+ this.types[fun] = new Type(args, cat);
} ;
GFAbstract.prototype.getArgs = function(fun) {
- return this.types[fun].args;
+ return this.types[fun].args;
}
GFAbstract.prototype.getCat = function(fun) {
- return this.types[fun].cat;
+ return this.types[fun].cat;
};
GFAbstract.prototype.annotate = function(tree, type) {
- if (tree.name == '?') {
- tree.type = type;
- } else {
- var typ = this.types[tree.name];
- for (var i in tree.args) {
- this.annotate(tree.args[i], typ.args[i]);
- }
- }
- return tree;
+ if (tree.name == '?') {
+ tree.type = type;
+ } else {
+ var typ = this.types[tree.name];
+ for (var i in tree.args) {
+ this.annotate(tree.args[i], typ.args[i]);
+ }
+ }
+ return tree;
} ;
GFAbstract.prototype.handleLiterals = function(tree, type) {
- if (tree.name != '?') {
- if (type == "String" || type == "Int" || type == "Float") {
- tree.name = type + "_Literal_" + tree.name;
- } else {
- var typ = this.types[tree.name];
- for (var i in tree.args) {
- this.handleLiterals(tree.args[i], typ.args[i]);
- }
- }
- }
- return tree;
+ if (tree.name != '?') {
+ if (type == "String" || type == "Int" || type == "Float") {
+ tree.name = type + "_Literal_" + tree.name;
+ } else {
+ var typ = this.types[tree.name];
+ for (var i in tree.args) {
+ this.handleLiterals(tree.args[i], typ.args[i]);
+ }
+ }
+ }
+ return tree;
} ;
/* Hack to get around the fact that our SISR doesn't build real Fun objects. */
GFAbstract.prototype.copyTree = function(x) {
- var t = new Fun(x.name);
- if (!isUndefined(x.type)) {
- t.type = x.type;
- }
- var cs = x.args;
- if (!isUndefined(cs)) {
- for (var i in cs) {
- t.setArg(i, this.copyTree(cs[i]));
- }
- }
- return t;
+ var t = new Fun(x.name);
+ if (!isUndefined(x.type)) {
+ t.type = x.type;
+ }
+ var cs = x.args;
+ if (!isUndefined(cs)) {
+ for (var i in cs) {
+ t.setArg(i, this.copyTree(cs[i]));
+ }
+ }
+ return t;
} ;
-GFAbstract.prototype.parseTree = function(str, type) {
- return this.annotate(this.parseTree_(str.match(/[\w\'\.\"]+|\(|\)|\?|\:/g), 0), type);
+GFAbstract.prototype.parseTree = function(str, type) {
+ return this.annotate(this.parseTree_(str.match(/[\w\'\.\"]+|\(|\)|\?|\:/g), 0), type);
} ;
GFAbstract.prototype.parseTree_ = function(tokens, prec) {
- if (tokens.length == 0 || tokens[0] == ")") { return null; }
- var t = tokens.shift();
- if (t == "(") {
- var tree = this.parseTree_(tokens, 0);
- tokens.shift();
- return tree;
- } else if (t == '?') {
- var tree = this.parseTree_(tokens, 0);
- return new Fun('?');
- } else {
- var tree = new Fun(t);
- if (prec == 0) {
- var c, i;
- for (i = 0; (c = this.parseTree_(tokens, 1)) !== null; i++) {
- tree.setArg(i,c);
- }
- }
- return tree;
- }
+ if (tokens.length == 0 || tokens[0] == ")") { return null; }
+ var t = tokens.shift();
+ if (t == "(") {
+ var tree = this.parseTree_(tokens, 0);
+ tokens.shift();
+ return tree;
+ } else if (t == '?') {
+ var tree = this.parseTree_(tokens, 0);
+ return new Fun('?');
+ } else {
+ var tree = new Fun(t);
+ if (prec == 0) {
+ var c, i;
+ for (i = 0; (c = this.parseTree_(tokens, 1)) !== null; i++) {
+ tree.setArg(i,c);
+ }
+ }
+ return tree;
+ }
} ;
function Type(args, cat) {
- this.args = args;
- this.cat = cat;
+ this.args = args;
+ this.cat = cat;
}
/* Linearization */
function GFConcrete(flags, productions, functions, sequences, startCats, totalFIds) {
- this.flags = flags;
- this.productions = productions;
- this.functions = functions;
- this.sequences = sequences;
- this.startCats = startCats;
- this.totalFIds = totalFIds;
+ this.flags = flags;
+ this.productions = productions;
+ this.functions = functions;
+ this.sequences = sequences;
+ this.startCats = startCats;
+ this.totalFIds = totalFIds;
- this.pproductions = productions;
- this.lproductions = new Object();
+ this.pproductions = productions;
+ this.lproductions = new Object();
for (var fid in productions) {
for (var i in productions[fid]) {
var rule = productions[fid][i];
-
+
if (rule.id == "Apply") {
var fun = this.functions[rule.fun];
var lproductions = this.lproductions;
-
+
rule.fun = fun;
var register = function (args, key, i) {
- if (i < args.length) {
- var c = 0;
- var arg = args[i].fid;
-
- for (var k in productions[arg]) {
+ if (i < args.length) {
+ var c = 0;
+ var arg = args[i].fid;
+
+ for (var k in productions[arg]) {
var rule = productions[arg][k];
if (rule.id == "Coerce") {
register(args,key + "_" + rule.arg,i+1);
c++;
}
}
-
+
if (c == 0)
register(args,key + "_" + arg,i+1);
- } else {
- var set = lproductions[key];
+ } else {
+ var set = lproductions[key];
if (set == null) {
set = new Array();
lproductions[key] = set;
}
- set.push({fun: fun, fid: fid});
- }
- }
+ set.push({fun: fun, fid: fid});
+ }
+ }
register(rule.args,rule.fun.name,0);
- }
+ }
}
}
-
+
for (var i in functions) {
var fun = functions[i];
for (var j in fun.lins) {
@@ -267,30 +267,30 @@ function GFConcrete(flags, productions, functions, sequences, startCats, totalFI
}
}
}
-GFConcrete.prototype.linearizeSyms = function (tree, tag) {
+GFConcrete.prototype.linearizeSyms = function (tree, tag) {
var res = new Array();
-
+
if (tree.isString()) {
- var sym = new SymKS(tree.name);
- sym.tag = tag;
- res.push({fid: -1, table: [[sym]]});
+ var sym = new SymKS(tree.name);
+ sym.tag = tag;
+ res.push({fid: -1, table: [[sym]]});
} else if (tree.isInt()) {
- var sym = new SymKS(tree.name);
- sym.tag = tag;
- res.push({fid: -2, table: [[sym]]});
+ var sym = new SymKS(tree.name);
+ sym.tag = tag;
+ res.push({fid: -2, table: [[sym]]});
} else if (tree.isFloat()) {
- var sym = new SymKS(tree.name);
- sym.tag = tag;
- res.push({fid: -3, table: [[sym]]});
+ var sym = new SymKS(tree.name);
+ sym.tag = tag;
+ res.push({fid: -3, table: [[sym]]});
} else if (tree.isMeta()) {
- // TODO: Use lindef here
+ // TODO: Use lindef here
var cat = this.startCats[tree.type];
-
+
var sym = new SymKS(tree.name);
- sym.tag = tag;
-
- for (var fid = cat.s; fid <= cat.e; fid++) {
- res.push({fid: fid, table: [[sym]]});
+ sym.tag = tag;
+
+ for (var fid = cat.s; fid <= cat.e; fid++) {
+ res.push({fid: fid, table: [[sym]]});
}
} else {
var cs = new Array();
@@ -310,7 +310,7 @@ GFConcrete.prototype.linearizeSyms = function (tree, tag) {
var lin = rule.fun.lins[j];
var toks = new Array();
row.table[j] = toks;
-
+
for (var k in lin) {
var sym = lin[k];
switch (sym.id) {
@@ -331,7 +331,7 @@ GFConcrete.prototype.linearizeSyms = function (tree, tag) {
res.push(row);
}
}
-
+
return res;
};
GFConcrete.prototype.syms2toks = function (syms) {
@@ -347,7 +347,7 @@ GFConcrete.prototype.syms2toks = function (syms) {
case "KP":
for (var j in sym.tokens) {
ts.push(this.tagIt(sym.tokens[j],sym.tag));
- }
+ }
break;
}
}
@@ -365,37 +365,37 @@ GFConcrete.prototype.linearize = function (tree) {
var res = this.linearizeSyms(tree,"0");
return this.unlex(this.syms2toks(res[0].table[0]));
}
-GFConcrete.prototype.tagAndLinearize = function (tree) {
+GFConcrete.prototype.tagAndLinearize = function (tree) {
var res = this.linearizeSyms(tree,"0");
return this.syms2toks(res[0].table[0]);
}
GFConcrete.prototype.unlex = function (ts) {
- if (ts.length == 0) {
- return "";
- }
-
- var noSpaceAfter = /^[\(\-\[]/;
- var noSpaceBefore = /^[\.\,\?\!\)\:\;\-\]]/;
-
- var s = "";
- for (var i = 0; i < ts.length; i++) {
- var t = ts[i];
- var after = i < ts.length-1 ? ts[i+1] : null;
- s += t;
- if (after != null && !t.match(noSpaceAfter)
- && !after.match(noSpaceBefore)) {
- s += " ";
- }
- }
- return s;
+ if (ts.length == 0) {
+ return "";
+ }
+
+ var noSpaceAfter = /^[\(\-\[]/;
+ var noSpaceBefore = /^[\.\,\?\!\)\:\;\-\]]/;
+
+ var s = "";
+ for (var i = 0; i < ts.length; i++) {
+ var t = ts[i];
+ var after = i < ts.length-1 ? ts[i+1] : null;
+ s += t;
+ if (after != null && !t.match(noSpaceAfter)
+ && !after.match(noSpaceBefore)) {
+ s += " ";
+ }
+ }
+ return s;
};
GFConcrete.prototype.tagIt = function (obj, tag) {
if (isString(obj)) {
- var o = new String(obj);
- o.setTag(tag);
- return o;
+ var o = new String(obj);
+ o.setTag(tag);
+ return o;
} else {
- var me = arguments.callee;
+ var me = arguments.callee;
if (arguments.length == 2) {
me.prototype = obj;
var o = new me();
@@ -416,28 +416,28 @@ function isNumber(a) { return typeof a == 'number' && isFinite(a); }
function isFunction(a) { return typeof a == 'function'; }
function dumpObject (obj) {
- if (isUndefined(obj)) {
- return "undefined";
- } else if (isString(obj)) {
- return '"' + obj.toString() + '"'; // FIXME: escape
- } else if (isBoolean(obj) || isNumber(obj)) {
- return obj.toString();
- } else if (isArray(obj)) {
- var x = "[";
- for (var i in obj) {
- x += dumpObject(obj[i]);
- if (i < obj.length-1) {
- x += ",";
- }
- }
- return x + "]";
- } else {
- var x = "{";
- for (var y in obj) {
- x += y + "=" + dumpObject(obj[y]) + ";" ;
- }
- return x + "}";
- }
+ if (isUndefined(obj)) {
+ return "undefined";
+ } else if (isString(obj)) {
+ return '"' + obj.toString() + '"'; // FIXME: escape
+ } else if (isBoolean(obj) || isNumber(obj)) {
+ return obj.toString();
+ } else if (isArray(obj)) {
+ var x = "[";
+ for (var i in obj) {
+ x += dumpObject(obj[i]);
+ if (i < obj.length-1) {
+ x += ",";
+ }
+ }
+ return x + "]";
+ } else {
+ var x = "{";
+ for (var y in obj) {
+ x += y + "=" + dumpObject(obj[y]) + ";" ;
+ }
+ return x + "}";
+ }
}
/* ------------------------------------------------------------------------- */
@@ -447,11 +447,11 @@ function dumpObject (obj) {
GFConcrete.prototype.showRules = function () {
var ruleStr = new Array();
- ruleStr.push("");
- for (var i = 0, j = this.rules.length; i < j; i++) {
- ruleStr.push(this.rules[i].show());
- }
- return ruleStr.join("");
+ ruleStr.push("");
+ for (var i = 0, j = this.rules.length; i < j; i++) {
+ ruleStr.push(this.rules[i].show());
+ }
+ return ruleStr.join("");
};
GFConcrete.prototype.tokenize = function (string) {
var inToken = false;
@@ -460,125 +460,125 @@ GFConcrete.prototype.tokenize = function (string) {
for (var i = 0; i < string.length; i++) {
if ( string.charAt(i) == ' ' // space
- || string.charAt(i) == '\f' // form feed
- || string.charAt(i) == '\n' // newline
- || string.charAt(i) == '\r' // return
- || string.charAt(i) == '\t' // horizontal tab
- || string.charAt(i) == '\v' // vertical tab
+ || string.charAt(i) == '\f' // form feed
+ || string.charAt(i) == '\n' // newline
+ || string.charAt(i) == '\r' // return
+ || string.charAt(i) == '\t' // horizontal tab
+ || string.charAt(i) == '\v' // vertical tab
|| string.charAt(i) == String.fromCharCode(160) // &nbsp;
) {
- if (inToken) {
+ if (inToken) {
end = i-1;
inToken = false;
-
+
tokens.push(string.substr(start,end-start+1));
}
- } else {
+ } else {
if (!inToken) {
start = i;
inToken = true;
}
}
}
-
+
if (inToken) {
end = i-1;
inToken = false;
-
+
tokens.push(string.substr(start,end-start+1));
}
return tokens;
};
GFConcrete.prototype.parseString = function (string, cat) {
- var tokens = this.tokenize(string);
-
- var ps = new ParseState(this, cat);
- for (var i in tokens) {
- if (!ps.next(tokens[i]))
+ var tokens = this.tokenize(string);
+
+ var ps = new ParseState(this, cat);
+ for (var i in tokens) {
+ if (!ps.next(tokens[i]))
return new Array();
- }
- return ps.extractTrees();
+ }
+ return ps.extractTrees();
};
/**
* Generate list of suggestions given an input string
*/
GFConcrete.prototype.complete = function (input, cat) {
- // Parameter defaults
- if (input == null) input = "";
- if (cat == null) cat = grammar.abstract.startcat;
-
- // Tokenise input string & remove empty tokens
- tokens = input.trim().split(' ');
- for (var i = tokens.length - 1; i >= 0; i--) {
- if (tokens[i] == "") { tokens.splice(i, 1); }
- }
-
- // Capture last token as it may be partial
- current = tokens.pop();
- if (current == null) current = "";
-
- // Init parse state objects.
- // ps2 is used for testing whether the final token is parsable or not.
- var ps = new ParseState(this, cat);
- var ps2 = new ParseState(this, cat);
-
- // Iterate over tokens, feed one by one to parser
- for (var i = 0; i < tokens.length ; i++) {
- if (!ps.next(tokens[i])) {
- return new Array(); // Incorrect parse, nothing to suggest
- }
- ps2.next(tokens[i]); // also consume token in ps2
- }
-
- // Attempt to also parse current, knowing it may be incomplete
- if (ps2.next(current)) {
- ps.next(current);
- tokens.push(current);
- current = "";
- }
- delete(ps2); // don't need this anymore
-
- // Parse is successful so far, now get suggestions
- var acc = ps.complete(current);
-
- // Format into just a list of strings & return
- // (I know the multiple nesting looks horrible)
- var suggs = new Array();
- if (acc.value) {
- // Iterate over all acc.value[]
- for (var v = 0; v < acc.value.length; v++) {
- // Iterate over all acc.value[].seq[]
- for (var s = 0; s < acc.value[v].seq.length; s++) {
- if (acc.value[v].seq[s].tokens == null) continue;
- // Iterate over all acc.value[].seq[].tokens
- for (var t = 0; t < acc.value[v].seq[s].tokens.length; t++) {
- suggs.push( acc.value[v].seq[s].tokens[t] );
- }
- }
- }
- }
-
- // Note: return used tokens too
- return { 'consumed' : tokens, 'suggestions' : suggs };
+ // Parameter defaults
+ if (input == null) input = "";
+ if (cat == null) cat = grammar.abstract.startcat;
+
+ // Tokenise input string & remove empty tokens
+ tokens = input.trim().split(' ');
+ for (var i = tokens.length - 1; i >= 0; i--) {
+ if (tokens[i] == "") { tokens.splice(i, 1); }
+ }
+
+ // Capture last token as it may be partial
+ current = tokens.pop();
+ if (current == null) current = "";
+
+ // Init parse state objects.
+ // ps2 is used for testing whether the final token is parsable or not.
+ var ps = new ParseState(this, cat);
+ var ps2 = new ParseState(this, cat);
+
+ // Iterate over tokens, feed one by one to parser
+ for (var i = 0; i < tokens.length ; i++) {
+ if (!ps.next(tokens[i])) {
+ return new Array(); // Incorrect parse, nothing to suggest
+ }
+ ps2.next(tokens[i]); // also consume token in ps2
+ }
+
+ // Attempt to also parse current, knowing it may be incomplete
+ if (ps2.next(current)) {
+ ps.next(current);
+ tokens.push(current);
+ current = "";
+ }
+ delete(ps2); // don't need this anymore
+
+ // Parse is successful so far, now get suggestions
+ var acc = ps.complete(current);
+
+ // Format into just a list of strings & return
+ // (I know the multiple nesting looks horrible)
+ var suggs = new Array();
+ if (acc.value) {
+ // Iterate over all acc.value[]
+ for (var v = 0; v < acc.value.length; v++) {
+ // Iterate over all acc.value[].seq[]
+ for (var s = 0; s < acc.value[v].seq.length; s++) {
+ if (acc.value[v].seq[s].tokens == null) continue;
+ // Iterate over all acc.value[].seq[].tokens
+ for (var t = 0; t < acc.value[v].seq[s].tokens.length; t++) {
+ suggs.push( acc.value[v].seq[s].tokens[t] );
+ }
+ }
+ }
+ }
+
+ // Note: return used tokens too
+ return { 'consumed' : tokens, 'suggestions' : suggs };
}
// Apply Object Definition
function Apply(fun, args) {
- this.id = "Apply";
- this.fun = fun;
- this.args = args;
+ this.id = "Apply";
+ this.fun = fun;
+ this.args = args;
}
Apply.prototype.show = function (cat) {
- var recStr = new Array();
- recStr.push(cat, " -> ", fun.name, " [", this.args, "]");
- return recStr.join("");
+ var recStr = new Array();
+ recStr.push(cat, " -> ", fun.name, " [", this.args, "]");
+ return recStr.join("");
};
Apply.prototype.isEqual = function (obj) {
- if (this.id != obj.id || this.fun != obj.fun || this.args.length != obj.args.length)
+ if (this.id != obj.id || this.fun != obj.fun || this.args.length != obj.args.length)
return false;
-
+
for (var i in this.args) {
if (this.args[i] != obj.args[i])
return false;
@@ -588,39 +588,39 @@ Apply.prototype.isEqual = function (obj) {
};
function PArg() {
- this.fid = arguments[arguments.length-1];
- if (arguments.length > 1)
- this.hypos = arguments.slice(0,arguments.length-1);
+ this.fid = arguments[arguments.length-1];
+ if (arguments.length > 1)
+ this.hypos = arguments.slice(0,arguments.length-1);
}
// Coerce Object Definition
function Coerce(arg) {
this.id = "Coerce";
- this.arg = arg;
+ this.arg = arg;
}
Coerce.prototype.show = function (cat) {
- var recStr = new Array();
- recStr.push(cat, " -> _ [", this.args, "]");
- return recStr.join("");
+ var recStr = new Array();
+ recStr.push(cat, " -> _ [", this.args, "]");
+ return recStr.join("");
};
// Const Object Definition
function Const(lit, toks) {
this.id = "Const";
- this.lit = lit;
- this.toks = toks;
+ this.lit = lit;
+ this.toks = toks;
}
Const.prototype.show = function (cat) {
- var recStr = new Array();
- recStr.push(cat, " -> ", lit.print());
- return recStr.join("");
+ var recStr = new Array();
+ recStr.push(cat, " -> ", lit.print());
+ return recStr.join("");
};
Const.prototype.isEqual = function (obj) {
- if (this.id != obj.id || this.lit.isEqual(obj.lit) || this.toks.length != obj.toks.length)
+ if (this.id != obj.id || this.lit.isEqual(obj.lit) || this.toks.length != obj.toks.length)
return false;
-
+
for (var i in this.toks) {
if (this.toks[i] != obj.toks[i])
return false;
@@ -638,41 +638,41 @@ function CncFun(name,lins) {
// Object to represent argument projections in grammar rules
function SymCat(i, label) {
- this.id = "Arg";
- this.i = i;
- this.label = label;
+ this.id = "Arg";
+ this.i = i;
+ this.label = label;
}
SymCat.prototype.getId = function () { return this.id; };
SymCat.prototype.getArgNum = function () { return this.i };
SymCat.prototype.show = function () {
- var argStr = new Array();
- argStr.push(this.i, this.label);
- return argStr.join(".");
+ var argStr = new Array();
+ argStr.push(this.i, this.label);
+ return argStr.join(".");
};
// Object to represent terminals in grammar rules
function SymKS() {
- this.id = "KS";
- this.tokens = arguments;
+ this.id = "KS";
+ this.tokens = arguments;
}
SymKS.prototype.getId = function () { return this.id; };
SymKS.prototype.show = function () {
- var terminalStr = new Array();
- terminalStr.push('"', this.tokens, '"');
- return terminalStr.join("");
+ var terminalStr = new Array();
+ terminalStr.push('"', this.tokens, '"');
+ return terminalStr.join("");
};
// Object to represent pre in grammar rules
function SymKP(tokens,alts) {
- this.id = "KP";
- this.tokens = tokens;
+ this.id = "KP";
+ this.tokens = tokens;
this.alts = alts;
}
SymKP.prototype.getId = function () { return this.id; };
SymKP.prototype.show = function () {
- var terminalStr = new Array();
- terminalStr.push('"', this.tokens, '"');
- return terminalStr.join("");
+ var terminalStr = new Array();
+ terminalStr.push('"', this.tokens, '"');
+ return terminalStr.join("");
};
function Alt(tokens, prefixes) {
@@ -682,15 +682,15 @@ function Alt(tokens, prefixes) {
// Object to represent pre in grammar rules
function SymLit(i,label) {
- this.id = "Lit";
- this.i = i;
- this.label = label;
+ this.id = "Lit";
+ this.i = i;
+ this.label = label;
}
SymLit.prototype.getId = function () { return this.id; };
SymLit.prototype.show = function () {
- var argStr = new Array();
- argStr.push(this.i, this.label);
- return argStr.join(".");
+ var argStr = new Array();
+ argStr.push(this.i, this.label);
+ return argStr.join(".");
};
// Parsing
@@ -732,11 +732,11 @@ Trie.prototype.lookup = function(key,obj) {
Trie.prototype.isEmpty = function() {
if (this.value != null)
return false;
-
+
for (var i in this.items) {
return false;
}
-
+
return true;
}
@@ -747,7 +747,7 @@ function ParseState(concrete, startCat) {
this.chart = new Chart(concrete);
var items = new Array();
-
+
var fids = concrete.startCats[startCat];
if (fids != null) {
var fid;
@@ -762,7 +762,7 @@ function ParseState(concrete, startCat) {
}
}
}
-
+
this.items.insertChain(new Array(), items);
}
ParseState.prototype.next = function (token) {
@@ -785,7 +785,7 @@ ParseState.prototype.next = function (token) {
else
return null;
}
-
+
return null;
}
, function (tokens, item) {
@@ -802,7 +802,7 @@ ParseState.prototype.next = function (token) {
this.items = acc;
this.chart.shift();
-
+
return !this.items.isEmpty();
}
/**
@@ -812,35 +812,35 @@ ParseState.prototype.next = function (token) {
*/
ParseState.prototype.complete = function (currentToken) {
- // Initialise accumulator for suggestions
- var acc = this.items.lookup(currentToken);
- if (acc == null)
- acc = new Trie();
-
- this.process(
- // Items
- this.items.value,
-
- // Deal with literal categories
- function (fid) {
- // Always return null, as suggested by Krasimir
- return null;
- },
-
- // Takes an array of tokens and populates the accumulator
- function (tokens, item) {
- if (currentToken == "" || tokens[0].indexOf(currentToken) == 0) { //if begins with...
- var tokens1 = new Array();
- for (var i = 1; i < tokens.length; i++) {
- tokens1[i-1] = tokens[i];
- }
- acc.insertChain1(tokens1, item);
- }
- }
- );
-
- // Return matches
- return acc;
+ // Initialise accumulator for suggestions
+ var acc = this.items.lookup(currentToken);
+ if (acc == null)
+ acc = new Trie();
+
+ this.process(
+ // Items
+ this.items.value,
+
+ // Deal with literal categories
+ function (fid) {
+ // Always return null, as suggested by Krasimir
+ return null;
+ },
+
+ // Takes an array of tokens and populates the accumulator
+ function (tokens, item) {
+ if (currentToken == "" || tokens[0].indexOf(currentToken) == 0) { //if begins with...
+ var tokens1 = new Array();
+ for (var i = 1; i < tokens.length; i++) {
+ tokens1[i-1] = tokens[i];
+ }
+ acc.insertChain1(tokens1, item);
+ }
+ }
+ );
+
+ // Return matches
+ return acc;
}
ParseState.prototype.extractTrees = function() {
this.process( this.items.value
@@ -850,11 +850,11 @@ ParseState.prototype.extractTrees = function() {
, function (tokens, item) {
}
);
-
-
+
+
var totalFIds = this.concrete.totalFIds;
var forest = this.chart.forest;
-
+
function go(fid) {
if (fid < totalFIds) {
return [new Fun("?")];
@@ -864,24 +864,24 @@ ParseState.prototype.extractTrees = function() {
var rules = forest[fid];
for (var j in rules) {
var rule = rules[j];
-
+
if (rule.id == "Const") {
trees.push(rule.lit);
- } else {
+ } else {
var arg_ix = new Array();
var arg_ts = new Array();
for (var k in rule.args) {
arg_ix[k] = 0;
arg_ts[k] = go(rule.args[k].fid);
}
-
+
while (true) {
var t = new Fun(rule.fun.name);
for (var k in arg_ts) {
t.setArg(k,arg_ts[k][arg_ix[k]]);
}
trees.push(t);
-
+
var i = 0;
while (i < arg_ts.length) {
arg_ix[i]++;
@@ -889,26 +889,26 @@ ParseState.prototype.extractTrees = function() {
break;
arg_ix[i] = 0;
- i++;
+ i++;
}
-
+
if (i >= arg_ts.length)
break;
}
}
}
-
+
return trees;
}
}
-
+
var trees = new Array();
var fids = this.concrete.startCats[this.startCat];
if (fids != null) {
var fid0;
for (fid0 = fids.s; fid0 <= fids.e; fid0++) {
-
+
var labels = new Object();
var rules = this.chart.expandForest(fid0);
for (var i in rules) {
@@ -916,7 +916,7 @@ ParseState.prototype.extractTrees = function() {
labels[lbl] = true;
}
}
-
+
for (var lbl in labels) {
var fid = this.chart.lookupPC(fid0,lbl,0);
var arg_ts = go(fid);
@@ -928,14 +928,14 @@ ParseState.prototype.extractTrees = function() {
break;
}
}
-
+
if (!isMember)
trees.push(arg_ts[i]);
}
}
}
- }
-
+ }
+
return trees;
}
ParseState.prototype.process = function (agenda,literalCallback,tokenCallback) {
@@ -966,10 +966,10 @@ ParseState.prototype.process = function (agenda,literalCallback,tokenCallback) {
break;
}
}
-
+
if (!isMember) {
items.push(item);
-
+
var fid2 = this.chart.lookupPC(fid,label,this.chart.offset);
if (fid2 != null) {
agenda.push(item.shiftOverArg(sym.i,fid2));
@@ -1004,7 +1004,7 @@ ParseState.prototype.process = function (agenda,literalCallback,tokenCallback) {
var fid = this.chart.lookupPC(item.fid,item.lbl,item.offset);
if (fid == null) {
fid = this.chart.nextId++;
-
+
var items = this.chart.lookupACo(item.offset,item.fid,item.lbl);
if (items != null) {
for (var j in items) {
@@ -1013,7 +1013,7 @@ ParseState.prototype.process = function (agenda,literalCallback,tokenCallback) {
agenda.push(pitem.shiftOverArg(i,fid));
}
}
-
+
this.chart.insertPC(item.fid,item.lbl,item.offset,fid);
this.chart.forest[fid] = [new Apply(item.fun,item.args)];
} else {
@@ -1023,16 +1023,16 @@ ParseState.prototype.process = function (agenda,literalCallback,tokenCallback) {
agenda.push(new ActiveItem(this.chart.offset,0,item.fun,item.fun.lins[lbl],item.args,fid,lbl));
}
}
-
+
var rules = this.chart.forest[fid];
var rule = new Apply(item.fun,item.args);
-
+
var isMember = false;
for (var j in rules) {
if (rules[j].isEqual(rule))
isMember = true;
}
-
+
if (!isMember)
rules.push(rule);
}
@@ -1048,7 +1048,7 @@ function Chart(concrete) {
this.forest = new Object();
this.nextId = concrete.totalFIds;
this.offset = 0;
-
+
for (var fid in concrete.pproductions) {
this.forest[fid] = concrete.pproductions[fid];
}
@@ -1061,7 +1061,7 @@ Chart.prototype.lookupAC = function (fid,label) {
}
Chart.prototype.lookupACo = function (offset,fid,label) {
var tmp;
-
+
if (offset == this.offset)
tmp = this.active[fid];
else
@@ -1094,15 +1094,15 @@ Chart.prototype.insertPC = function (fid1,label,offset,fid2) {
Chart.prototype.shift = function () {
this.actives.push(this.active);
this.active = new Object();
-
+
this.passive = new Object();
-
+
this.offset++;
}
Chart.prototype.expandForest = function (fid) {
var rules = new Array();
var forest = this.forest;
-
+
var go = function (rules0) {
for (var i in rules0) {
var rule = rules0[i];
diff --git a/src/runtime/typescript/.eslintrc b/src/runtime/typescript/.eslintrc
new file mode 100644
index 000000000..c0fa0b95e
--- /dev/null
+++ b/src/runtime/typescript/.eslintrc
@@ -0,0 +1,18 @@
+{
+ "parser": "@typescript-eslint/parser",
+ "plugins": ["@typescript-eslint"],
+ "extends": ["plugin:@typescript-eslint/recommended"],
+ "rules": {
+ "indent": "off",
+ "@typescript-eslint/indent": ["warn", 2],
+ "@typescript-eslint/no-use-before-define": ["error", {
+ "functions": false,
+ "classes": false
+ }],
+ "semi": "off",
+ "@typescript-eslint/semi": ["warn", "never"],
+ "quotes": ["warn", "single"],
+ "@typescript-eslint/camelcase": "off",
+ "@typescript-eslint/no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }],
+ }
+}
diff --git a/src/runtime/typescript/README.md b/src/runtime/typescript/README.md
new file mode 100644
index 000000000..e7905af89
--- /dev/null
+++ b/src/runtime/typescript/README.md
@@ -0,0 +1,31 @@
+# GF TypeScript Runtime
+
+`gflib.ts` is a TypeScript implementation of the GF runtime.
+It is ported from an older JavaScript implementation [`gflib.js`](../javascript/gflib.js),
+with some improvements.
+
+Importantly, all **future** updates will only be made to this TypeScript version.
+
+## Applicability
+
+This runtime allows you use GF in pure JavaScript, and thus have GF-powered apps without the need for a server backend.
+However, it has not been actively maintained as the other runtimes have been.
+So its features are limited and it is not efficient, making it really only useful for smaller grammars.
+
+## Using
+
+`gflib.ts` can be transpiled to JavaScript by running `tsc` in this folder (of course you need TypeScript installed).
+It has no module dependencies.
+You can then include the generated `js/gflib.js` file in your application as usual.
+
+_This generated JavaScript version is also included under version control,
+to make it easy for someone to use without having to install TypeScript._
+
+Your GF grammar should be compiled with: `gf --make --output-format=js`
+
+For an example of a working web application using the JavaScript runtime, see `../javascript`.
+
+## What happened to `gflib.d.ts`?
+
+There was once a file here called `gflib.d.ts`, which contained TypeScript type definitions for the **old** `gflib.js`.
+Since the runtime is now ported to TypeScript, those type definitions are no longer necessary (plus they contained many errors).
diff --git a/src/runtime/typescript/gflib.d.ts b/src/runtime/typescript/gflib.d.ts
deleted file mode 100644
index 4249e66d2..000000000
--- a/src/runtime/typescript/gflib.d.ts
+++ /dev/null
@@ -1,337 +0,0 @@
-/**
- * gflib.dt.s
- *
- * by John J. Camilleri
- *
- * TypeScript type definitions for the "original" JS GF runtime (GF:src/runtime/javascript/gflib.js)
- */
-
-// Note: the String prototype is extended with:
-// String.prototype.tag = "";
-// String.prototype.setTag = function (tag) { this.tag = tag; };
-
-/**
- * A GF grammar is one abstract and multiple concretes
- */
-declare class GFGrammar {
- abstract: GFAbstract
- concretes: {[key: string]: GFConcrete}
-
- constructor(abstract: GFAbstract, concretes: {[key: string]: GFConcrete})
-
- translate(
- input: string,
- fromLang: string,
- toLang: string
- ): {[key: string]: {[key: string]: string}}
-}
-
-/**
- * Abstract Syntax Tree
- */
-declare class Fun {
- name: string
- args: Fun[]
-
- constructor(name: string, ...args: Fun[])
-
- print(): string
- show(): string
- getArg(i: number): Fun
- setArg(i: number, c: Fun): void
- isMeta(): boolean
- isComplete(): boolean
- isLiteral(): boolean
- isString(): boolean
- isInt(): boolean
- isFloat(): boolean
- isEqual(obj: any): boolean
-}
-
-/**
- * Abstract syntax
- */
-declare class GFAbstract {
- startcat: string
- types: {[key: string]: Type} // key is function name
-
- constructor(startcat: string, types: {[key: string]: Type})
-
- addType(fun: string, args: string[], cat: string): void
- getArgs(fun: string): string[]
- getCat(fun: string): string
- annotate(tree: Fun, type: string): Fun
- handleLiterals(tree: Fun, type: Type): Fun
- copyTree(x: Fun): Fun
- parseTree(str: string, type: string): Fun
- parseTree_(tokens: string[], prec: number): Fun
-}
-
-/**
- * Type
- */
-declare class Type {
- args: string[]
- cat: string
-
- constructor(args: string[], cat: string)
-}
-
-type ApplyOrCoerce = Apply | Coerce
-
-/**
- * Concrete syntax
- */
-declare class GFConcrete {
- flags: {[key: string]: string}
- productions: {[key: number]: ApplyOrCoerce[]}
- functions: CncFun[]
- sequences: Array<Array<Sym>>
- startCats: {[key: string]: {s: number, e: number}}
- totalFIds: number
- pproductions: {[key: number]: ApplyOrCoerce[]}
- lproductions: {[key: string]: {fid: FId, fun: CncFun}}
-
- constructor(
- flags: {[key: string]: string},
- productions: {[key: number]: ApplyOrCoerce[]},
- functions: CncFun[],
- sequences: Array<Array<Sym>>,
- startCats: {[key: string]: {s: number, e: number}},
- totalFIds: number
- )
-
- linearizeSyms(tree: Fun, tag: string): Array<{fid: FId, table: any}>
- syms2toks(syms: Sym[]): string[]
- linearizeAll(tree: Fun): string[]
- linearize(tree: Fun): string
- tagAndLinearize(tree: Fun): string[]
- unlex(ts: string): string
- tagIt(obj: any, tag: string): any
- // showRules(): string // Uncaught TypeError: Cannot read property 'length' of undefined at gflib.js:451
- tokenize(string: string): string[]
- parseString(string: string, cat: string): Fun[]
- complete(
- input: string,
- cat: string
- ): {consumed: string[], suggestions: string[]}
-}
-
-/**
- * Function ID
- */
-type FId = number
-
-/**
- * Apply
- */
-declare class Apply {
- id: string
- fun: FId
- args: PArg[]
-
- constructor(fun: FId, args: PArg[])
-
- show(cat: string): string
- isEqual(obj: any): boolean
-}
-
-/**
- * PArg
- */
-declare class PArg {
- fid: FId
- hypos: any[]
-
- constructor(fid: FId, ...hypos: any[])
-}
-
-/**
- * Coerce
- */
-declare class Coerce {
- id: string
- arg: FId
-
- constructor(arg: FId)
-
- show(cat: string): string
-}
-
-/**
- * Const
- */
-declare class Const {
- id: string
- lit: Fun
- toks: any[]
-
- constructor(lit: Fun, toks: any[])
-
- show(cat: string): string
- isEqual(obj: any): boolean
-}
-
-/**
- * CncFun
- */
-declare class CncFun {
- name: string
- lins: FId[]
-
- constructor(name: string, lins: FId[])
-}
-
-type Sym = SymCat | SymKS | SymKP | SymLit
-
-/**
- * SymCat
- */
-declare class SymCat {
- id: string
- i: number
- label: number
-
- constructor(i: number, label: number)
-
- getId(): string
- getArgNum(): number
- show(): string
-}
-
-/**
- * SymKS
- */
-declare class SymKS {
- id: string
- tokens: string[]
-
- constructor(...tokens: string[])
-
- getId(): string
- show(): string
-}
-
-/**
- * SymKP
- */
-declare class SymKP {
- id: string
- tokens: string[]
- alts: Alt[]
-
- constructor(tokens: string[], alts: Alt[])
-
- getId(): string
- show(): string
-}
-
-/**
- * Alt
- */
-declare class Alt {
- tokens: string[]
- prefixes: string[]
-
- constructor(tokens: string[], prefixes: string[])
-}
-
-/**
- * SymLit
- */
-declare class SymLit {
- id: string
- i: number
- label: number
-
- constructor(i: number, label: number)
-
- getId(): string
- show(): string
-}
-
-/**
- * Trie
- */
-declare class Trie {
- value: any
- items: Trie[]
-
- insertChain(keys, obj): void
- insertChain1(keys, obj): void
- lookup(key, obj): any
- isEmpty(): boolean
-}
-
-/**
- * ParseState
- */
-declare class ParseState {
- concrete: GFConcrete
- startCat: string
- items: Trie
- chart: Chart
-
- constructor(concrete: GFConcrete, startCat: string)
-
- next(token: string): boolean
- complete(correntToken: string): Trie
- extractTrees(): any[]
- process(
- agenda,
- literalCallback: (fid: FId) => any,
- tokenCallback: (tokens: string[], item: any) => any
- ): void
-}
-
-/**
- * Chart
- */
-declare class Chart {
- active: any
- actives: {[key: number]: any}
- passive: any
- forest: {[key: number]: ApplyOrCoerce[]}
- nextId: number
- offset: number
-
- constructor(concrete: GFConcrete)
-
- lookupAC(fid: FId,label)
- lookupACo(offset, fid: FId, label)
-
- labelsAC(fid: FId)
- insertAC(fid: FId, label, items): void
-
- lookupPC(fid: FId, label, offset)
- insertPC(fid1: FId, label, offset, fid2: FId): void
- shift(): void
- expandForest(fid: FId): any[]
-}
-
-/**
- * ActiveItem
- */
-declare class ActiveItem {
- offset: number
- dot: number
- fun: CncFun
- seq: Array<Sym>
- args: PArg[]
- fid: FId
- lbl: number
-
- constructor(
- offset: number,
- dot: number,
- fun: CncFun,
- seq: Array<Sym>,
- args: PArg[],
- fid: FId,
- lbl: number
- )
-
- isEqual(obj: any): boolean
- shiftOverArg(i: number, fid: FId): ActiveItem
- shiftOverTokn(): ActiveItem
-}
diff --git a/src/runtime/typescript/gflib.ts b/src/runtime/typescript/gflib.ts
new file mode 100644
index 000000000..52865e969
--- /dev/null
+++ b/src/runtime/typescript/gflib.ts
@@ -0,0 +1,1619 @@
+/**
+ * gflib.ts
+ *
+ * by John J. Camilleri
+ *
+ * A port of the pure JavaScript runtime (/src/runtime/javascript/gflib.js) into TypeScript
+ */
+
+/**
+ * A GF grammar is one abstract and multiple concretes
+ */
+class GFGrammar { // eslint-disable-line @typescript-eslint/no-unused-vars
+ public abstract: GFAbstract
+ public concretes: {[key: string]: GFConcrete}
+
+ public constructor(abstract: GFAbstract, concretes: {[key: string]: GFConcrete}) {
+ this.abstract = abstract
+ this.concretes = concretes
+ }
+
+ public translate(
+ input: string,
+ fromLang: string,
+ toLang: string
+ ): {[key: string]: {[key: string]: string}[]} {
+ let outputs: {[key: string]: {[key: string]: string}[]} = {}
+ let fromConcs = this.concretes
+ if (fromLang) {
+ fromConcs = {}
+ fromConcs[fromLang] = this.concretes[fromLang]
+ }
+ let toConcs = this.concretes
+ if (toLang) {
+ toConcs = {}
+ toConcs[toLang] = this.concretes[toLang]
+ }
+ for (let c1 in fromConcs) {
+ let concrete = this.concretes[c1]
+ let trees = concrete.parseString(input, this.abstract.startcat)
+ if (trees.length > 0) {
+ outputs[c1] = []
+ for (let i in trees) {
+ outputs[c1][i] = {}
+ for (let c2 in toConcs) {
+ outputs[c1][i][c2] = this.concretes[c2].linearize(trees[i])
+ }
+ }
+ }
+ }
+ return outputs
+ }
+}
+
+/**
+ * Abstract Syntax Tree
+ */
+class Fun {
+ public name: string
+ public args: Fun[]
+ public type?: string // only used for meta variables
+
+ public constructor(name: string, ...args: Fun[]) {
+ this.name = name
+ this.args = []
+ for (let i = 1; i < args.length; i++) {
+ this.args[i-1] = args[i]
+ }
+ }
+
+ public print(): string {
+ return this.show(0)
+ }
+
+ public show(prec: number): string {
+ if (this.isMeta()) {
+ if (isUndefined(this.type)) {
+ return '?'
+ } else {
+ let s = '?:' + this.type
+ if (prec > 0) {
+ s = '(' + s + ')'
+ }
+ return s
+ }
+ } else {
+ let s = this.name
+ let cs = this.args
+ for (let i in cs) {
+ s += ' ' + (isUndefined(cs[i]) ? 'undefined' : cs[i].show(1))
+ }
+ if (prec > 0 && cs.length > 0) {
+ s = '(' + s + ')'
+ }
+ return s
+ }
+ }
+
+ public getArg(i: number): Fun {
+ return this.args[i]
+ }
+
+ public setArg(i: number, c: Fun): void {
+ this.args[i] = c
+ }
+
+ public isMeta(): boolean {
+ return this.name == '?'
+ }
+
+ public isComplete(): boolean {
+ if (this.isMeta()) {
+ return false
+ } else {
+ for (let i in this.args) {
+ if (!this.args[i].isComplete()) {
+ return false
+ }
+ }
+ return true
+ }
+ }
+
+ public isLiteral(): boolean {
+ return (/^[\"\-\d]/).test(this.name)
+ }
+
+ public isString(): boolean {
+ return (/^\".*\"$/).test(this.name)
+ }
+
+ public isInt(): boolean {
+ return (/^\-?\d+$/).test(this.name)
+ }
+
+ public isFloat(): boolean {
+ return (/^\-?\d*(\.\d*)?$/).test(this.name) && this.name != '.' && this.name != '-.'
+ }
+
+ public isEqual(obj: Fun): boolean {
+ if (this.name != obj.name)
+ return false
+
+ for (let i in this.args) {
+ if (!this.args[i].isEqual(obj.args[i]))
+ return false
+ }
+
+ return true
+ }
+}
+
+/**
+ * Abstract syntax
+ */
+class GFAbstract {
+ public startcat: string
+ private types: {[key: string]: Type} // key is function name
+
+ public constructor(startcat: string, types: {[key: string]: Type}) {
+ this.startcat = startcat
+ this.types = types
+ }
+
+ public addType(fun: string, args: string[], cat: string): void {
+ this.types[fun] = new Type(args, cat)
+ }
+
+ public getArgs(fun: string): string[] {
+ return this.types[fun].args
+ }
+
+ public getCat(fun: string): string {
+ return this.types[fun].cat
+ }
+
+ // Annotate (only) meta variables
+ private annotate(tree: Fun, type?: string): Fun {
+ let typ: Type | undefined = this.types[tree.name]
+ if (tree.isMeta()) {
+ tree.type = type
+ } else if (!isUndefined(typ)) {
+ for (let i in tree.args) {
+ this.annotate(tree.args[i], typ.args[i])
+ }
+ }
+ return tree
+ }
+
+ public handleLiterals(tree: Fun, type: string): Fun {
+ if (tree.name != '?') {
+ if (type == 'String' || type == 'Int' || type == 'Float') {
+ tree.name = type + '_Literal_' + tree.name
+ } else {
+ let typ = this.types[tree.name]
+ for (let i in tree.args) {
+ this.handleLiterals(tree.args[i], typ.args[i])
+ }
+ }
+ }
+ return tree
+ }
+
+ // Hack to get around the fact that our SISR doesn't build real Fun objects.
+ public copyTree(x: Fun): Fun {
+ let t = new Fun(x.name)
+ if (!isUndefined(x.type)) {
+ t.type = x.type
+ }
+ let cs = x.args
+ if (!isUndefined(cs)) {
+ for (let i = 0; i < cs.length; i++) {
+ t.setArg(i, this.copyTree(cs[i]))
+ }
+ }
+ return t
+ }
+
+ public parseTree(str: string, type?: string): Fun | null {
+ let pt = this.parseTree_(str.match(/[\w\u00C0-\u00FF\'\.\"]+|\(|\)|\?|\:/g) || [], 0)
+ return pt ? this.annotate(pt, type) : null
+ }
+
+ private parseTree_(tokens: string[], prec: number): Fun | null {
+ if (tokens.length == 0 || tokens[0] == ')') {
+ return null
+ }
+ let t = tokens.shift()
+ if (!t) return null
+ if (t == '(') {
+ let tree = this.parseTree_(tokens, 0)
+ tokens.shift()
+ return tree
+ } else if (t == '?') {
+ // let tree = this.parseTree_(tokens, 0)
+ return new Fun('?')
+ } else {
+ let tree = new Fun(t)
+ if (prec == 0) {
+ let c: Fun | null
+ let i: number
+ for (i = 0; (c = this.parseTree_(tokens, 1)) !== null; i++) {
+ tree.setArg(i,c)
+ }
+ }
+ return tree
+ }
+ }
+}
+
+/**
+ * Type
+ */
+class Type {
+ public args: string[]
+ public cat: string
+
+ public constructor(args: string[], cat: string) {
+ this.args = args
+ this.cat = cat
+ }
+}
+
+/**
+ * Concrete syntax
+ */
+class GFConcrete {
+ public flags: {[key: string]: string}
+ // private productions: {[key: number]: Rule[]}
+ private functions: CncFun[]
+ // private sequences: Sym[][]
+ public startCats: {[key: string]: {s: number; e: number}}
+ public totalFIds: number
+ public pproductions: {[key: number]: Rule[]}
+ private lproductions: {[key: string]: {fid: FId; fun: CncFun}[]}
+
+ public constructor(
+ flags: {[key: string]: string},
+ productions: {[key: number]: Rule[]},
+ functions: CncFun[],
+ sequences: Sym[][],
+ startCats: {[key: string]: {s: number; e: number}},
+ totalFIds: number
+ ) {
+ this.flags = flags
+ // this.productions = productions
+ this.functions = functions
+ // this.sequences = sequences
+ this.startCats = startCats
+ this.totalFIds = totalFIds
+
+ this.pproductions = productions
+ this.lproductions = {}
+
+ for (let fid0 in productions) {
+ let fid: number = parseInt(fid0)
+ for (let i in productions[fid]) {
+ let rule = productions[fid][i]
+
+ if (rule.id == 'Apply') {
+ rule = rule as Apply
+ let fun: CncFun = this.functions[rule.fun as FId]
+ let lproductions = this.lproductions
+
+ rule.fun = fun
+
+ let register = function (args: PArg[], key: string, i: number): void {
+ if (i < args.length) {
+ let c = 0
+ let arg = args[i].fid
+
+ for (let k in productions[arg]) {
+ let rule = productions[arg][k]
+ if (rule.id == 'Coerce') {
+ rule = rule as Coerce
+ register(args, key + '_' + rule.arg, i+1)
+ c++
+ }
+ }
+
+ if (c == 0) {
+ register(args, key + '_' + arg, i+1)
+ }
+ } else {
+ let set = lproductions[key]
+ if (set == null) {
+ set = []
+ lproductions[key] = set
+ }
+ set.push({fun: fun, fid: fid})
+ }
+ }
+ register(rule.args, rule.fun.name, 0)
+ }
+ }
+ }
+
+ for (let fun of functions) {
+ for (let j in fun.lins) {
+ fun.lins[j] = sequences[fun.lins[j] as number]
+ }
+ }
+
+ }
+
+ private linearizeSyms(tree: Fun, tag: string): {fid: FId; table: Sym[][]}[] {
+ let res = []
+
+ if (tree.isString()) {
+ let sym = new SymKS(tree.name)
+ sym.tag = tag
+ res.push({fid: -1, table: [[sym]]})
+ } else if (tree.isInt()) {
+ let sym = new SymKS(tree.name)
+ sym.tag = tag
+ res.push({fid: -2, table: [[sym]]})
+ } else if (tree.isFloat()) {
+ let sym = new SymKS(tree.name)
+ sym.tag = tag
+ res.push({fid: -3, table: [[sym]]})
+ } else if (tree.isMeta()) {
+ // TODO: Use lindef here
+ let cat = this.startCats[tree.type as string]
+
+ let sym = new SymKS(tree.name)
+ sym.tag = tag
+
+ for (let fid = cat.s; fid <= cat.e; fid++) {
+ res.push({fid: fid, table: [[sym]]})
+ }
+ } else {
+ let cs: {fid: FId; table: Sym[][]}[] = []
+ for (let i in tree.args) {
+ // TODO: we should handle the case for nondeterministic linearization
+ cs.push(this.linearizeSyms(tree.args[i],tag + '-' + i)[0])
+ }
+ let key = tree.name
+ for (let i in cs) {
+ if (isUndefined(cs[i])) {
+ // Some arguments into this function are undefined
+ console.warn(`${tree.args[i].name} is undefined`)
+ return [{
+ fid: -5, // signal to parent that I cannot lin properly
+ table: [[new SymKS(`[${tree.name}]`).tagWith(tag)]]
+ }]
+ } else if (cs[i].fid === -5) {
+ // My child cannot lin properly, just find first matching rule for me
+ // TODO probably not general enough
+ for (let k in this.lproductions) {
+ if (k.includes(tree.name)) {
+ key = k
+ break
+ }
+ }
+ break
+ } else {
+ key = key + '_' + cs[i].fid
+ }
+ }
+
+ for (let i in this.lproductions[key]) {
+ let rule = this.lproductions[key][i]
+ let row: {fid: FId; table: Sym[][]} = {
+ fid: rule.fid,
+ table: []
+ }
+ for (let j in rule.fun.lins) {
+ let lin = rule.fun.lins[j] as Sym[]
+ let toks: Sym[] = []
+ row.table[j] = toks
+
+ lin.forEach((sym0: Sym): void => {
+ switch (sym0.id) {
+ case 'Arg':
+ case 'Lit': {
+ let sym = sym0 as SymCat | SymLit
+ let ts = cs[sym.i].table[sym.label]
+ for (let l in ts) {
+ toks.push(ts[l])
+ }
+ break
+ }
+ case 'KS':
+ case 'KP': {
+ let sym = sym0 as SymKS | SymKP
+ toks.push(sym.tagWith(tag))
+ break
+ }
+ }
+ })
+ }
+ res.push(row)
+ }
+ }
+
+ return res
+ }
+
+ private syms2toks(syms: Sym[]): TaggedString[] {
+ let ts: TaggedString[] = []
+ for (let i = 0; i < syms.length; i++) {
+ let sym0 = syms[i]
+ switch (sym0.id) {
+ case 'KS': {
+ let sym = sym0 as SymKS
+ for (let j in sym.tokens) {
+ ts.push(new TaggedString(sym.tokens[j], sym.tag as string))
+ }
+ break
+ }
+ case 'KP': {
+ let sym = sym0 as SymKP
+ let addedAlt = false
+ if (i < syms.length-1) {
+ let nextSym = syms[i+1]
+ if (nextSym.id == 'KS') {
+ let nextToken = (nextSym as SymKS).tokens[0]
+ sym.alts.forEach((alt: Alt): void => {
+ // consider alts here (for handling pre)
+ if (alt.prefixes.some((p: string): boolean => nextToken.startsWith(p))) {
+ alt.tokens.forEach((symks: SymKS): void => {
+ symks.tokens.forEach((t: string): void => {
+ ts.push(new TaggedString(t, sym.tag as string))
+ })
+ })
+ addedAlt = true
+ return
+ }
+ })
+ }
+ }
+ if (addedAlt) break
+ // Fall through here when no alts (or none apply)
+ sym.tokens.forEach((symks: SymKS): void => {
+ symks.tokens.forEach((t: string): void => {
+ ts.push(new TaggedString(t, sym.tag as string))
+ })
+ })
+ break
+ }
+ }
+ }
+ return ts
+ }
+
+ public linearizeAll(tree: Fun): string[] {
+ return this.linearizeSyms(tree,'0').map((r): string => {
+ return this.unlex(this.syms2toks(r.table[0]))
+ })
+ }
+
+ public linearize(tree: Fun): string {
+ let res = this.linearizeSyms(tree,'0')
+ if (res.length > 0)
+ return this.unlex(this.syms2toks(res[0].table[0]))
+ else
+ return ''
+ }
+
+ public tagAndLinearize(tree: Fun): TaggedString[] {
+ let res = this.linearizeSyms(tree,'0')
+ if (res.length > 0)
+ return this.syms2toks(res[0].table[0])
+ else
+ return []
+ }
+
+ private unlex(ts: TaggedString[]): string {
+ if (ts.length == 0) {
+ return ''
+ }
+
+ let noSpaceAfter = /^[\(\-\[]/
+ let noSpaceBefore = /^[\.\,\?\!\)\:\;\-\]]/
+
+ let s = ''
+ for (let i = 0; i < ts.length; i++) {
+ let t: string = ts[i].s
+ let after: string | null = i < ts.length-1 ? ts[i+1].s : null
+ s += t
+ if (after != null
+ && !t.match(noSpaceAfter)
+ && !after.match(noSpaceBefore)
+ ) {
+ s += ' '
+ }
+ }
+ return s
+ }
+
+ // private tagIt(obj: Taggable, tag: string): Taggable {
+ // if (isString(obj)) {
+ // let o = new String(obj)
+ // o.setTag(tag)
+ // return o
+ // } else {
+ // let me = arguments.callee
+ // if (arguments.length == 2) {
+ // me.prototype = obj
+ // let o = new me()
+ // o.tag = tag
+ // return o
+ // }
+ // }
+ // }
+
+ // public showRules(): string {
+ // let ruleStr = []
+ // ruleStr.push('')
+ // for (let i = 0, j = this.rules.length; i < j; i++) {
+ // ruleStr.push(this.rules[i].show())
+ // }
+ // return ruleStr.join('')
+ // }
+
+ private tokenize(string: string): string[] {
+ let inToken = false
+ let start = 0
+ let end: number
+ let tokens = []
+
+ let i: number
+ for (i = 0; i < string.length; i++) {
+ if (string.charAt(i) == ' ' // space
+ || string.charAt(i) == '\f' // form feed
+ || string.charAt(i) == '\n' // newline
+ || string.charAt(i) == '\r' // return
+ || string.charAt(i) == '\t' // horizontal tab
+ || string.charAt(i) == '\v' // vertical tab
+ || string.charAt(i) == String.fromCharCode(160) // &nbsp;
+ ) {
+ if (inToken) {
+ end = i-1
+ inToken = false
+ tokens.push(string.substr(start,end-start+1))
+ }
+ } else {
+ if (!inToken) {
+ start = i
+ inToken = true
+ }
+ }
+ }
+
+ if (inToken) {
+ end = i-1
+ inToken = false
+ tokens.push(string.substr(start,end-start+1))
+ }
+
+ return tokens
+ }
+
+ public parseString(string: string, cat: string): Fun[] {
+ let tokens = this.tokenize(string)
+
+ let ps = new ParseState(this, cat)
+ for (let i in tokens) {
+ if (!ps.next(tokens[i]))
+ return []
+ }
+ return ps.extractTrees()
+ }
+
+ public complete(
+ input: string,
+ cat: string
+ ): {consumed: string[]; suggestions: string[]} {
+ // Parameter defaults
+ if (input == null) input = ''
+ // if (cat == null) cat = grammar.abstract.startcat
+
+ // Tokenise input string & remove empty tokens
+ let tokens = input.trim().split(' ')
+ for (let i = tokens.length - 1; i >= 0; i--) {
+ if (tokens[i] == '') {
+ tokens.splice(i, 1)
+ }
+ }
+
+ // Capture last token as it may be partial
+ let current = tokens.pop()
+ if (current == null) current = ''
+
+ // Init parse state objects.
+ // ps2 is used for testing whether the final token is parsable or not.
+ let ps = new ParseState(this, cat)
+ let ps2 = new ParseState(this, cat)
+
+ // Iterate over tokens, feed one by one to parser
+ for (let i = 0; i < tokens.length ; i++) {
+ if (!ps.next(tokens[i])) {
+ return { 'consumed': [], 'suggestions': [] } // Incorrect parse, nothing to suggest
+ }
+ ps2.next(tokens[i]) // also consume token in ps2
+ }
+
+ // Attempt to also parse current, knowing it may be incomplete
+ if (ps2.next(current)) {
+ ps.next(current)
+ tokens.push(current)
+ current = ''
+ }
+
+ // Parse is successful so far, now get suggestions
+ let acc = ps.complete(current)
+
+ // Format into just a list of strings & return
+ let suggs: string[] = []
+ if (acc.value) {
+ acc.value.forEach((a: ActiveItem): void =>{
+ a.seq.forEach((s: Sym): void => {
+ switch (s.id) {
+ case 'KS': {
+ (s as SymKS).tokens.forEach((t: string): void => {
+ suggs.push(t)
+ })
+ break
+ }
+ case 'KP': {
+ (s as SymKP).tokens.forEach((symks: SymKS): void => {
+ symks.tokens.forEach((t: string): void => {
+ suggs.push(t)
+ })
+ })
+ break
+ }
+ }
+ })
+ })
+ }
+
+ // Note: return used tokens too
+ return { 'consumed' : tokens, 'suggestions' : suggs }
+ }
+}
+
+/**
+ * A string with a tag
+ * This avoids modifying the String prototype, which was messy
+ */
+class TaggedString {
+ public s: string
+ public tag: string
+
+ public constructor(s: string, tag: string) {
+ this.s = s
+ this.tag = tag
+ }
+}
+
+/**
+ * Function ID
+ */
+type FId = number
+
+/**
+ * Rule
+ */
+type Rule = Apply | Coerce | Const
+
+/**
+ * Apply
+ */
+class Apply {
+ public id: string
+ public fun: FId | CncFun
+ public args: PArg[]
+
+ public constructor(fun: FId | CncFun, args: PArg[]) {
+ this.id = 'Apply'
+ this.fun = fun
+ this.args = args
+ }
+
+ public show(cat: string): string {
+ let recStr = []
+ recStr.push(cat, ' -> ', (this.fun as CncFun).name, ' [', this.args, ']')
+ return recStr.join('')
+ }
+
+ public isEqual(obj: Apply): boolean {
+ if (this.id != obj.id || this.fun != obj.fun || this.args.length != obj.args.length)
+ return false
+
+ for (let i in this.args) {
+ if (this.args[i] != obj.args[i])
+ return false
+ }
+
+ return true
+ }
+}
+
+/**
+ * Coerce
+ */
+class Coerce {
+ public id: string
+ public arg: FId
+
+ public constructor(arg: FId) {
+ this.id = 'Coerce'
+ this.arg = arg
+ }
+
+ public show(cat: string): string {
+ let recStr = []
+ recStr.push(cat, ' -> _ [', this.arg, ']')
+ return recStr.join('')
+ }
+}
+
+/**
+ * PArg
+ */
+class PArg {
+ public fid: FId
+ public hypos: FId[]
+
+ public constructor(...hypos: FId[]) {
+ this.fid = hypos[hypos.length-1]
+ if (hypos.length > 1)
+ this.hypos = hypos.slice(0, hypos.length-1)
+ else
+ this.hypos = []
+ }
+}
+
+/**
+ * Const
+ */
+class Const {
+ public id: string
+ public lit: Fun
+ public toks: string[]
+
+ public constructor(lit: Fun, toks: string[]) {
+ this.id = 'Const'
+ this.lit = lit
+ this.toks = toks
+ }
+
+ public show(cat: string): string {
+ let recStr = []
+ recStr.push(cat, ' -> ', this.lit.print())
+ return recStr.join('')
+ }
+
+ public isEqual(obj: Const): boolean {
+ if (this.id != obj.id || this.lit.isEqual(obj.lit) || this.toks.length != obj.toks.length)
+ return false
+
+ for (let i in this.toks) {
+ if (this.toks[i] != obj.toks[i])
+ return false
+ }
+
+ return true
+ }
+}
+
+/**
+ * CncFun
+ */
+class CncFun {
+ public name: string
+ public lins: number[] | Sym[][]
+
+ public constructor(name: string, lins: FId[]) {
+ this.name = name
+ this.lins = lins
+ }
+}
+
+/**
+ * Sym: Definition of symbols present in linearization records
+ */
+type Sym = SymCat | SymKS | SymKP | SymLit
+
+/**
+ * SymCat: Object to represent argument projections in grammar rules
+ */
+class SymCat {
+ public id: string
+ public i: number
+ public label: number
+
+ public constructor(i: number, label: number) {
+ this.id = 'Arg'
+ this.i = i
+ this.label = label
+ }
+
+ public show(): string {
+ let argStr = []
+ argStr.push(this.i, this.label)
+ return argStr.join('.')
+ }
+}
+
+/**
+ * SymKS: Object to represent terminals in grammar rules
+ */
+class SymKS {
+ public id: string
+ public tokens: string[]
+ public tag?: string
+
+ public constructor(...tokens: string[]) {
+ this.id = 'KS'
+ this.tokens = tokens
+ }
+
+ public show(): string {
+ let terminalStr = []
+ terminalStr.push('"', this.tokens, '"')
+ return terminalStr.join('')
+ }
+
+ public tagWith(tag: string): SymKS {
+ let s = new SymKS()
+ s.tokens = [...this.tokens] // copy array
+ s.tag = tag
+ return s
+ }
+}
+
+/**
+ * SymKP: Object to represent pre in grammar rules
+ */
+class SymKP {
+ public id: string
+ public tokens: SymKS[]
+ public alts: Alt[]
+ public tag?: string
+
+ public constructor(tokens: SymKS[], alts: Alt[]) {
+ this.id = 'KP'
+ this.tokens = tokens
+ this.alts = alts
+ }
+
+ public show(): string {
+ let terminalStr = []
+ terminalStr.push('"', this.tokens, '"')
+ return terminalStr.join('')
+ }
+
+ public tagWith(tag: string): SymKP {
+ let s = new SymKP([...this.tokens], [...this.alts]) // copy arguments
+ s.tag = tag
+ return s
+ }
+}
+
+/**
+ * Alt
+ */
+class Alt {
+ public tokens: SymKS[]
+ public prefixes: string[]
+
+ public constructor(tokens: SymKS[], prefixes: string[]) {
+ this.tokens = tokens
+ this.prefixes = prefixes
+ }
+}
+
+/**
+ * SymLit: Object to represent pre in grammar rules
+ */
+class SymLit {
+ public id: string
+ public i: number
+ public label: number
+
+ public constructor(i: number, label: number) {
+ this.id = 'Lit'
+ this.i = i
+ this.label = label
+ }
+
+ public getId(): string {
+ return this.id
+ }
+
+ public show(): string {
+ let argStr = []
+ argStr.push(this.i, this.label)
+ return argStr.join('.')
+ }
+}
+
+/**
+ * Trie
+ */
+class Trie<T> {
+ public value: T[] | null
+ private items: {[key: string]: Trie<T>}
+
+ public constructor() {
+ this.value = null
+ this.items = {}
+ }
+
+ public insertChain(keys: string[], obj: T[]): void {
+ let node: Trie<T> = this
+ keys.forEach((key: string): void => {
+ let nnode = node.items[key]
+ if (nnode == null) {
+ nnode = new Trie()
+ node.items[key] = nnode
+ }
+ node = nnode
+ })
+ node.value = obj
+ }
+
+ public insertChain1(keys: string[], obj: T): void {
+ let node: Trie<T> = this
+ keys.forEach((key: string): void => {
+ let nnode = node.items[key]
+ if (nnode == null) {
+ nnode = new Trie()
+ node.items[key] = nnode
+ }
+ node = nnode
+ })
+ if (node.value == null)
+ node.value = [obj]
+ else
+ node.value.push(obj)
+ }
+
+ public lookup(key: string): Trie<T> {
+ return this.items[key]
+ }
+
+ public isEmpty(): boolean {
+ if (this.value != null)
+ return false
+
+ for (let _ in this.items) {
+ return false
+ }
+
+ return true
+ }
+}
+
+/**
+ * ParseState
+ */
+class ParseState {
+ private concrete: GFConcrete
+ private startCat: string
+ private items: Trie<ActiveItem>
+ private chart: Chart
+
+ public constructor(concrete: GFConcrete, startCat: string) {
+ this.concrete = concrete
+ this.startCat = startCat
+ this.items = new Trie()
+ this.chart = new Chart(concrete)
+
+ let items = []
+
+ let fids = concrete.startCats[startCat]
+ if (fids != null) {
+ let fid: FId
+ for (fid = fids.s; fid <= fids.e; fid++) {
+ let exProds = this.chart.expandForest(fid)
+ for (let j in exProds) {
+ let rule = exProds[j] as Apply
+ let fun = rule.fun as CncFun
+ for (let lbl in fun.lins) {
+ items.push(new ActiveItem(
+ 0,
+ 0,
+ rule.fun as CncFun,
+ fun.lins[lbl] as Sym[],
+ rule.args,
+ fid,
+ parseInt(lbl))
+ )
+ }
+ }
+ }
+ }
+
+ this.items.insertChain([], items)
+ }
+
+ public next(token: string): boolean {
+ let acc = this.items.lookup(token)
+ if (acc == null) {
+ acc = new Trie()
+ }
+ this.process(
+ this.items.value,
+ function (fid: FId): Const | null {
+ switch (fid) {
+ // String
+ case -1:
+ return new Const(new Fun('"'+token+'"'), [token])
+ // Integer
+ case -2: {
+ let x = parseInt(token,10)
+ if (token == '0' || (x != 0 && !isNaN(x)))
+ return new Const(new Fun(token), [token])
+ else
+ return null
+ }
+ // Float
+ case -3: {
+ let x = parseFloat(token)
+ if (token == '0' || token == '0.0' || (x != 0 && !isNaN(x)))
+ return new Const(new Fun(token), [token])
+ else
+ return null
+ }
+ }
+
+ return null
+ },
+ function (tokens: string[], item: ActiveItem): void {
+ if (tokens[0] == token) {
+ let tokens1 = []
+ for (let i = 1; i < tokens.length; i++) {
+ tokens1[i-1] = tokens[i]
+ }
+ acc.insertChain1(tokens1, item)
+ }
+ }
+ )
+
+ this.items = acc
+ this.chart.shift()
+
+ return !this.items.isEmpty()
+ }
+
+ /**
+ * For a ParseState and a partial input, return all possible completions
+ * Based closely on ParseState.next()
+ * currentToken could be empty or a partial string
+ */
+ public complete(currentToken: string): Trie<ActiveItem> {
+
+ // Initialise accumulator for suggestions
+ let acc = this.items.lookup(currentToken)
+ if (acc == null)
+ acc = new Trie()
+
+ this.process(
+ // Items
+ this.items.value,
+
+ // Deal with literal categories
+ function (_fid: FId): null {
+ // Always return null, as suggested by Krasimir
+ return null
+ },
+
+ // Takes an array of tokens and populates the accumulator
+ function (tokens: string[], item: ActiveItem): void {
+ if (currentToken == '' || tokens[0].indexOf(currentToken) == 0) { //if begins with...
+ let tokens1 = []
+ for (let i = 1; i < tokens.length; i++) {
+ tokens1[i-1] = tokens[i]
+ }
+ acc.insertChain1(tokens1, item)
+ }
+ }
+ )
+
+ // Return matches
+ return acc
+ }
+
+ public extractTrees(): Fun[] {
+ this.process(
+ this.items.value,
+ function (_fid: FId): null {
+ return null
+ },
+ function (_tokens: string[], _item: ActiveItem): void {
+ }
+ )
+
+ let totalFIds = this.concrete.totalFIds
+ let forest = this.chart.forest
+
+ function go(fid: FId): Fun[] {
+ if (fid < totalFIds) {
+ return [new Fun('?')]
+ } else {
+ let trees: Fun[] = []
+
+ let rules = forest[fid] // could be undefined
+ for (let j in rules) {
+ let rule: Rule = rules[j]
+ if (rule.id == 'Const') {
+ trees.push((rule as Const).lit)
+ } else {
+ rule = rule as Apply
+ let arg_ix: number[] = []
+ let arg_ts: Fun[][] = []
+ for (let k in rule.args) {
+ arg_ix[k] = 0
+ arg_ts[k] = go(rule.args[k].fid)
+ }
+
+ while (true) {
+ let t = new Fun((rule.fun as CncFun).name)
+ for (let k = 0; k < arg_ts.length; k++) {
+ t.setArg(k,arg_ts[k][arg_ix[k]])
+ }
+ trees.push(t)
+
+ let i = 0
+ while (i < arg_ts.length) {
+ arg_ix[i]++
+ if (arg_ix[i] < arg_ts[i].length)
+ break
+
+ arg_ix[i] = 0
+ i++
+ }
+
+ if (i >= arg_ts.length)
+ break
+ }
+ }
+ }
+
+ return trees
+ }
+ }
+
+ let trees = []
+ let fids = this.concrete.startCats[this.startCat]
+ if (fids != null) {
+ for (let fid0 = fids.s; fid0 <= fids.e; fid0++) {
+
+ let labels: {[key: number]: boolean} = {}
+ let rules = this.chart.expandForest(fid0)
+ rules.forEach((rule): void => {
+ for (let lbl in (rule.fun as CncFun).lins) {
+ labels[lbl] = true
+ }
+ })
+
+ for (let lbl0 in labels) {
+ let lbl: number = parseInt(lbl0)
+ let fid = this.chart.lookupPC(fid0, lbl, 0)
+ let arg_ts = go(fid)
+ for (let i in arg_ts) {
+ let isMember = false
+ for (let j in trees) {
+ if (arg_ts[i].isEqual(trees[j])) {
+ isMember = true
+ break
+ }
+ }
+
+ if (!isMember)
+ trees.push(arg_ts[i])
+ }
+ }
+ }
+ }
+
+ return trees
+ }
+
+ private process(
+ agenda: ActiveItem[] | null,
+ literalCallback: (fid: FId) => Const | null, // this is right
+ tokenCallback: (tokens: string[], item: ActiveItem) => void
+ ): void {
+ if (agenda != null) {
+ while (agenda.length > 0) {
+ let item = agenda.pop() as ActiveItem
+ let lin = item.seq
+
+ if (item.dot < lin.length) {
+ let sym0 = lin[item.dot]
+ switch (sym0.id) {
+ case 'Arg': {
+ let sym = sym0 as SymCat
+ let fid = item.args[sym.i].fid
+ let label = sym.label
+
+ let items = this.chart.lookupAC(fid,label)
+ if (items == null) {
+ let rules = this.chart.expandForest(fid)
+ for (let j in rules) {
+ let rule = rules[j] as Apply
+ agenda.push(new ActiveItem(
+ this.chart.offset,
+ 0,
+ rule.fun as CncFun,
+ ((rule.fun as CncFun).lins as Sym[][])[label],
+ rule.args,
+ fid,
+ label)
+ )
+ }
+ this.chart.insertAC(fid,label,[item])
+ } else {
+ let isMember = false
+ for (let j in items) {
+ if (items[j].isEqual(item)) {
+ isMember = true
+ break
+ }
+ }
+
+ if (!isMember) {
+ items.push(item)
+
+ let fid2 = this.chart.lookupPC(fid,label,this.chart.offset)
+ if (fid2 != null) {
+ agenda.push(item.shiftOverArg(sym.i,fid2))
+ }
+ }
+ }
+ break
+ }
+ case 'KS': {
+ let sym = sym0 as SymKS
+ tokenCallback(sym.tokens, item.shiftOverTokn())
+ break
+ }
+ case 'KP': {
+ let sym = sym0 as SymKP
+ let pitem = item.shiftOverTokn()
+ sym.tokens.forEach((symks: SymKS): void => { // TODO not sure if this is right
+ tokenCallback(symks.tokens, pitem)
+ })
+ sym.alts.forEach((alt: Alt): void => {
+ // tokenCallback(alt.tokens, pitem)
+ alt.tokens.forEach((symks: SymKS): void => { // TODO not sure if this is right
+ tokenCallback(symks.tokens, pitem)
+ })
+ })
+ break
+ }
+ case 'Lit': {
+ let sym = sym0 as SymLit
+ let fid = item.args[sym.i].fid
+ let rules = this.chart.forest[fid]
+ if (rules != null) {
+ tokenCallback((rules[0] as Const).toks, item.shiftOverTokn())
+ } else {
+ let rule = literalCallback(fid)
+ if (rule != null) {
+ fid = this.chart.nextId++
+ this.chart.forest[fid] = [rule]
+ tokenCallback(rule.toks, item.shiftOverArg(sym.i, fid))
+ }
+ }
+ break
+ }
+ }
+ } else {
+ let fid = this.chart.lookupPC(item.fid,item.lbl,item.offset)
+ if (fid == null) {
+ fid = this.chart.nextId++
+
+ let items = this.chart.lookupACo(item.offset,item.fid,item.lbl)
+ if (items != null) {
+ items.forEach((pitem: ActiveItem): void => {
+ let i = (pitem.seq[pitem.dot] as SymCat).i
+ agenda.push(pitem.shiftOverArg(i,fid))
+ })
+ }
+
+ this.chart.insertPC(item.fid,item.lbl,item.offset,fid)
+ this.chart.forest[fid] = [new Apply(item.fun,item.args)]
+ } else {
+ let labels = this.chart.labelsAC(fid)
+ if (labels != null) {
+ for (let lbl in labels) {
+ agenda.push(new ActiveItem(
+ this.chart.offset,
+ 0,
+ item.fun,
+ item.fun.lins[lbl] as Sym[],
+ item.args,
+ fid,
+ parseInt(lbl))
+ )
+ }
+ }
+
+ let rules = this.chart.forest[fid]
+ let rule = new Apply(item.fun,item.args)
+
+ let isMember = false
+ rules.forEach((rule1): void => {
+ if ((rule1 as Apply).isEqual(rule)) // TODO might need to check if Coerce here
+ isMember = true
+ })
+
+ if (!isMember)
+ rules.push(rule)
+ }
+ }
+ }
+ }
+ }
+}
+
+/**
+ * Map of label to list of ActiveItems
+ */
+interface ActiveItemMap {[key: number]: ActiveItem[]}
+
+/**
+ * Chart
+ */
+class Chart {
+ // private active: {[key: number]: ActiveItem} // key: FId
+ private active: {[key: number]: ActiveItemMap} // key: FId
+ private actives: {[key: number]: ActiveItemMap}[] // key: FId
+ private passive: {[key: string]: FId}
+ public forest: {[key: number]: Rule[]} // key: FId
+ public nextId: number
+ public offset: number
+
+ public constructor(concrete: GFConcrete) {
+ this.active = {}
+ this.actives = []
+ this.passive = {}
+ this.forest = {}
+ this.nextId = concrete.totalFIds
+ this.offset = 0
+
+ for (let fid in concrete.pproductions) {
+ this.forest[fid] = concrete.pproductions[fid]
+ }
+ }
+
+ public lookupAC(fid: FId, label: number): ActiveItem[] | null {
+ let tmp = this.active[fid]
+ if (tmp == null)
+ return null
+ return tmp[label]
+ }
+
+ public lookupACo(offset: number, fid: FId, label: number): ActiveItem[] | null {
+ let tmp: ActiveItemMap
+
+ if (offset == this.offset)
+ tmp = this.active[fid]
+ else
+ tmp = this.actives[offset][fid]
+
+ if (tmp == null)
+ return null
+
+ return tmp[label]
+ }
+
+ public labelsAC(fid: FId): ActiveItemMap {
+ return this.active[fid]
+ }
+
+ public insertAC(fid: FId, label: number, items: ActiveItem[]): void {
+ let tmp: ActiveItemMap = this.active[fid]
+ if (tmp == null) {
+ tmp = {}
+ this.active[fid] = tmp
+ }
+ tmp[label] = items
+ }
+
+ public lookupPC(fid: FId, label: number, offset: number): FId {
+ let key = fid+'.'+label+'-'+offset
+ return this.passive[key]
+ }
+
+ public insertPC(fid1: FId, label: number, offset: number, fid2: FId): void {
+ let key = fid1+'.'+label+'-'+offset
+ this.passive[key] = fid2
+ }
+
+ public shift(): void {
+ this.actives.push(this.active)
+ this.active = {}
+ this.passive = {}
+ this.offset++
+ }
+
+ public expandForest(fid: FId): Apply[] {
+ let rules: Apply[] = []
+ let forest = this.forest
+
+ let go = function (rules0: Rule[]): void {
+ for (let i in rules0) {
+ let rule = rules0[i]
+ switch (rule.id) {
+ case 'Apply':
+ rules.push(rule as Apply)
+ break
+ case 'Coerce':
+ go(forest[(rule as Coerce).arg])
+ break
+ }
+ }
+ }
+
+ go(this.forest[fid])
+ return rules
+ }
+}
+
+/**
+ * ActiveItem
+ */
+class ActiveItem {
+ public offset: number
+ public dot: number
+ public fun: CncFun
+ public seq: Sym[]
+ public args: PArg[]
+ public fid: FId
+ public lbl: number
+
+ public constructor(
+ offset: number,
+ dot: number,
+ fun: CncFun,
+ seq: Sym[],
+ args: PArg[],
+ fid: FId,
+ lbl: number
+ ) {
+ this.offset = offset
+ this.dot = dot
+ this.fun = fun
+ this.seq = seq
+ this.args = args
+ this.fid = fid
+ this.lbl = lbl
+ }
+
+ public isEqual(obj: ActiveItem): boolean {
+ return (this.offset== obj.offset &&
+ this.dot == obj.dot &&
+ this.fun == obj.fun &&
+ this.seq == obj.seq &&
+ this.args == obj.args &&
+ this.fid == obj.fid &&
+ this.lbl == obj.lbl)
+ }
+
+ public shiftOverArg(i: number, fid: FId): ActiveItem {
+ let nargs: PArg[] = []
+ for (let k in this.args) {
+ nargs[k] = this.args[k]
+ }
+ nargs[i] = new PArg(fid)
+ return new ActiveItem(this.offset,this.dot+1,this.fun,this.seq,nargs,this.fid,this.lbl)
+ }
+
+ public shiftOverTokn(): ActiveItem {
+ return new ActiveItem(this.offset,this.dot+1,this.fun,this.seq,this.args,this.fid,this.lbl)
+ }
+}
+
+/**
+ * Utilities
+ */
+
+/* from Remedial JavaScript by Douglas Crockford, http://javascript.crockford.com/remedial.html */
+// function isString(a: any): boolean {
+// return typeof a == 'string' || a instanceof String
+// }
+// function isArray(a: any): boolean {
+// return a && typeof a == 'object' && a.constructor == Array
+// }
+function isUndefined(a: any): boolean { // eslint-disable-line @typescript-eslint/no-explicit-any
+ return typeof a == 'undefined'
+}
+// function isBoolean(a: any): boolean {
+// return typeof a == 'boolean'
+// }
+// function isNumber(a: any): boolean {
+// return typeof a == 'number' && isFinite(a)
+// }
+// function isFunction(a: any): boolean {
+// return typeof a == 'function'
+// }
+// function dumpObject (obj: any): string {
+// if (isUndefined(obj)) {
+// return 'undefined'
+// } else if (isString(obj)) {
+// return '"' + obj.toString() + '"' // FIXME: escape
+// } else if (isBoolean(obj) || isNumber(obj)) {
+// return obj.toString()
+// } else if (isArray(obj)) {
+// let x = '['
+// for (let i = 0; i < obj.length; i++) {
+// x += dumpObject(obj[i])
+// if (i < obj.length-1) {
+// x += ','
+// }
+// }
+// return x + ']'
+// } else {
+// let x = '{'
+// for (let y in obj) {
+// x += y + '=' + dumpObject(obj[y]) + ';'
+// }
+// return x + '}'
+// }
+// }
+
+/**
+ * Polyfills for older targets
+ */
+
+interface String {
+ startsWith: (search: string, pos?: number) => boolean;
+ includes: (search: string, start?: number) => boolean;
+}
+
+// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith#Polyfill
+if (!String.prototype.startsWith) {
+ Object.defineProperty(String.prototype, 'startsWith', {
+ value: function(search: string, pos?: number): boolean {
+ pos = !pos || pos < 0 ? 0 : +pos
+ return this.substring(pos, pos + search.length) === search
+ }
+ })
+}
+// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes#Polyfill
+if (!String.prototype.includes) {
+ Object.defineProperty(String.prototype, 'includes', {
+ value: function(search: string, start?: number): boolean {
+ 'use strict'
+ if (typeof start !== 'number') {
+ start = 0
+ }
+
+ if (start + search.length > this.length) {
+ return false
+ } else {
+ return this.indexOf(search, start) !== -1
+ }
+ }
+ })
+}
+
+/**
+ * gflib.ts as a module
+ * If you want to make this into a proper module, uncomment this:
+ */
+
+// export {
+// GFGrammar,
+// GFAbstract,
+// GFConcrete,
+// Fun,
+// Type,
+// Apply,
+// Coerce,
+// PArg,
+// Const,
+// CncFun,
+// SymCat,
+// SymKS,
+// SymKP,
+// SymLit,
+// Alt,
+// }
diff --git a/src/runtime/typescript/js/gflib.js b/src/runtime/typescript/js/gflib.js
new file mode 100644
index 000000000..7c6352705
--- /dev/null
+++ b/src/runtime/typescript/js/gflib.js
@@ -0,0 +1,1164 @@
+"use strict";
+var GFGrammar = (function () {
+ function GFGrammar(abstract, concretes) {
+ this.abstract = abstract;
+ this.concretes = concretes;
+ }
+ GFGrammar.prototype.translate = function (input, fromLang, toLang) {
+ var outputs = {};
+ var fromConcs = this.concretes;
+ if (fromLang) {
+ fromConcs = {};
+ fromConcs[fromLang] = this.concretes[fromLang];
+ }
+ var toConcs = this.concretes;
+ if (toLang) {
+ toConcs = {};
+ toConcs[toLang] = this.concretes[toLang];
+ }
+ for (var c1 in fromConcs) {
+ var concrete = this.concretes[c1];
+ var trees = concrete.parseString(input, this.abstract.startcat);
+ if (trees.length > 0) {
+ outputs[c1] = [];
+ for (var i in trees) {
+ outputs[c1][i] = {};
+ for (var c2 in toConcs) {
+ outputs[c1][i][c2] = this.concretes[c2].linearize(trees[i]);
+ }
+ }
+ }
+ }
+ return outputs;
+ };
+ return GFGrammar;
+}());
+var Fun = (function () {
+ function Fun(name) {
+ var args = [];
+ for (var _i = 1; _i < arguments.length; _i++) {
+ args[_i - 1] = arguments[_i];
+ }
+ this.name = name;
+ this.args = [];
+ for (var i = 1; i < args.length; i++) {
+ this.args[i - 1] = args[i];
+ }
+ }
+ Fun.prototype.print = function () {
+ return this.show(0);
+ };
+ Fun.prototype.show = function (prec) {
+ if (this.isMeta()) {
+ if (isUndefined(this.type)) {
+ return '?';
+ }
+ else {
+ var s = '?:' + this.type;
+ if (prec > 0) {
+ s = '(' + s + ')';
+ }
+ return s;
+ }
+ }
+ else {
+ var s = this.name;
+ var cs = this.args;
+ for (var i in cs) {
+ s += ' ' + (isUndefined(cs[i]) ? 'undefined' : cs[i].show(1));
+ }
+ if (prec > 0 && cs.length > 0) {
+ s = '(' + s + ')';
+ }
+ return s;
+ }
+ };
+ Fun.prototype.getArg = function (i) {
+ return this.args[i];
+ };
+ Fun.prototype.setArg = function (i, c) {
+ this.args[i] = c;
+ };
+ Fun.prototype.isMeta = function () {
+ return this.name == '?';
+ };
+ Fun.prototype.isComplete = function () {
+ if (this.isMeta()) {
+ return false;
+ }
+ else {
+ for (var i in this.args) {
+ if (!this.args[i].isComplete()) {
+ return false;
+ }
+ }
+ return true;
+ }
+ };
+ Fun.prototype.isLiteral = function () {
+ return (/^[\"\-\d]/).test(this.name);
+ };
+ Fun.prototype.isString = function () {
+ return (/^\".*\"$/).test(this.name);
+ };
+ Fun.prototype.isInt = function () {
+ return (/^\-?\d+$/).test(this.name);
+ };
+ Fun.prototype.isFloat = function () {
+ return (/^\-?\d*(\.\d*)?$/).test(this.name) && this.name != '.' && this.name != '-.';
+ };
+ Fun.prototype.isEqual = function (obj) {
+ if (this.name != obj.name)
+ return false;
+ for (var i in this.args) {
+ if (!this.args[i].isEqual(obj.args[i]))
+ return false;
+ }
+ return true;
+ };
+ return Fun;
+}());
+var GFAbstract = (function () {
+ function GFAbstract(startcat, types) {
+ this.startcat = startcat;
+ this.types = types;
+ }
+ GFAbstract.prototype.addType = function (fun, args, cat) {
+ this.types[fun] = new Type(args, cat);
+ };
+ GFAbstract.prototype.getArgs = function (fun) {
+ return this.types[fun].args;
+ };
+ GFAbstract.prototype.getCat = function (fun) {
+ return this.types[fun].cat;
+ };
+ GFAbstract.prototype.annotate = function (tree, type) {
+ var typ = this.types[tree.name];
+ if (tree.isMeta()) {
+ tree.type = type;
+ }
+ else if (!isUndefined(typ)) {
+ for (var i in tree.args) {
+ this.annotate(tree.args[i], typ.args[i]);
+ }
+ }
+ return tree;
+ };
+ GFAbstract.prototype.handleLiterals = function (tree, type) {
+ if (tree.name != '?') {
+ if (type == 'String' || type == 'Int' || type == 'Float') {
+ tree.name = type + '_Literal_' + tree.name;
+ }
+ else {
+ var typ = this.types[tree.name];
+ for (var i in tree.args) {
+ this.handleLiterals(tree.args[i], typ.args[i]);
+ }
+ }
+ }
+ return tree;
+ };
+ GFAbstract.prototype.copyTree = function (x) {
+ var t = new Fun(x.name);
+ if (!isUndefined(x.type)) {
+ t.type = x.type;
+ }
+ var cs = x.args;
+ if (!isUndefined(cs)) {
+ for (var i = 0; i < cs.length; i++) {
+ t.setArg(i, this.copyTree(cs[i]));
+ }
+ }
+ return t;
+ };
+ GFAbstract.prototype.parseTree = function (str, type) {
+ var pt = this.parseTree_(str.match(/[\w\u00C0-\u00FF\'\.\"]+|\(|\)|\?|\:/g) || [], 0);
+ return pt ? this.annotate(pt, type) : null;
+ };
+ GFAbstract.prototype.parseTree_ = function (tokens, prec) {
+ if (tokens.length == 0 || tokens[0] == ')') {
+ return null;
+ }
+ var t = tokens.shift();
+ if (!t)
+ return null;
+ if (t == '(') {
+ var tree = this.parseTree_(tokens, 0);
+ tokens.shift();
+ return tree;
+ }
+ else if (t == '?') {
+ return new Fun('?');
+ }
+ else {
+ var tree = new Fun(t);
+ if (prec == 0) {
+ var c = void 0;
+ var i = void 0;
+ for (i = 0; (c = this.parseTree_(tokens, 1)) !== null; i++) {
+ tree.setArg(i, c);
+ }
+ }
+ return tree;
+ }
+ };
+ return GFAbstract;
+}());
+var Type = (function () {
+ function Type(args, cat) {
+ this.args = args;
+ this.cat = cat;
+ }
+ return Type;
+}());
+var GFConcrete = (function () {
+ function GFConcrete(flags, productions, functions, sequences, startCats, totalFIds) {
+ this.flags = flags;
+ this.functions = functions;
+ this.startCats = startCats;
+ this.totalFIds = totalFIds;
+ this.pproductions = productions;
+ this.lproductions = {};
+ var _loop_1 = function (fid0) {
+ var fid = parseInt(fid0);
+ var _loop_2 = function (i) {
+ var rule = productions[fid][i];
+ if (rule.id == 'Apply') {
+ rule = rule;
+ var fun_1 = this_1.functions[rule.fun];
+ var lproductions_1 = this_1.lproductions;
+ rule.fun = fun_1;
+ var register_1 = function (args, key, i) {
+ if (i < args.length) {
+ var c = 0;
+ var arg = args[i].fid;
+ for (var k in productions[arg]) {
+ var rule_1 = productions[arg][k];
+ if (rule_1.id == 'Coerce') {
+ rule_1 = rule_1;
+ register_1(args, key + '_' + rule_1.arg, i + 1);
+ c++;
+ }
+ }
+ if (c == 0) {
+ register_1(args, key + '_' + arg, i + 1);
+ }
+ }
+ else {
+ var set = lproductions_1[key];
+ if (set == null) {
+ set = [];
+ lproductions_1[key] = set;
+ }
+ set.push({ fun: fun_1, fid: fid });
+ }
+ };
+ register_1(rule.args, rule.fun.name, 0);
+ }
+ };
+ for (var i in productions[fid]) {
+ _loop_2(i);
+ }
+ };
+ var this_1 = this;
+ for (var fid0 in productions) {
+ _loop_1(fid0);
+ }
+ for (var _i = 0, functions_1 = functions; _i < functions_1.length; _i++) {
+ var fun = functions_1[_i];
+ for (var j in fun.lins) {
+ fun.lins[j] = sequences[fun.lins[j]];
+ }
+ }
+ }
+ GFConcrete.prototype.linearizeSyms = function (tree, tag) {
+ var res = [];
+ if (tree.isString()) {
+ var sym = new SymKS(tree.name);
+ sym.tag = tag;
+ res.push({ fid: -1, table: [[sym]] });
+ }
+ else if (tree.isInt()) {
+ var sym = new SymKS(tree.name);
+ sym.tag = tag;
+ res.push({ fid: -2, table: [[sym]] });
+ }
+ else if (tree.isFloat()) {
+ var sym = new SymKS(tree.name);
+ sym.tag = tag;
+ res.push({ fid: -3, table: [[sym]] });
+ }
+ else if (tree.isMeta()) {
+ var cat = this.startCats[tree.type];
+ var sym = new SymKS(tree.name);
+ sym.tag = tag;
+ for (var fid = cat.s; fid <= cat.e; fid++) {
+ res.push({ fid: fid, table: [[sym]] });
+ }
+ }
+ else {
+ var cs_1 = [];
+ for (var i in tree.args) {
+ cs_1.push(this.linearizeSyms(tree.args[i], tag + '-' + i)[0]);
+ }
+ var key = tree.name;
+ for (var i in cs_1) {
+ if (isUndefined(cs_1[i])) {
+ console.warn(tree.args[i].name + " is undefined");
+ return [{
+ fid: -5,
+ table: [[new SymKS("[" + tree.name + "]").tagWith(tag)]]
+ }];
+ }
+ else if (cs_1[i].fid === -5) {
+ for (var k in this.lproductions) {
+ if (k.includes(tree.name)) {
+ key = k;
+ break;
+ }
+ }
+ break;
+ }
+ else {
+ key = key + '_' + cs_1[i].fid;
+ }
+ }
+ for (var i in this.lproductions[key]) {
+ var rule = this.lproductions[key][i];
+ var row = {
+ fid: rule.fid,
+ table: []
+ };
+ var _loop_3 = function (j) {
+ var lin = rule.fun.lins[j];
+ var toks = [];
+ row.table[j] = toks;
+ lin.forEach(function (sym0) {
+ switch (sym0.id) {
+ case 'Arg':
+ case 'Lit': {
+ var sym = sym0;
+ var ts = cs_1[sym.i].table[sym.label];
+ for (var l in ts) {
+ toks.push(ts[l]);
+ }
+ break;
+ }
+ case 'KS':
+ case 'KP': {
+ var sym = sym0;
+ toks.push(sym.tagWith(tag));
+ break;
+ }
+ }
+ });
+ };
+ for (var j in rule.fun.lins) {
+ _loop_3(j);
+ }
+ res.push(row);
+ }
+ }
+ return res;
+ };
+ GFConcrete.prototype.syms2toks = function (syms) {
+ var ts = [];
+ var _loop_4 = function (i) {
+ var sym0 = syms[i];
+ switch (sym0.id) {
+ case 'KS': {
+ var sym = sym0;
+ for (var j in sym.tokens) {
+ ts.push(new TaggedString(sym.tokens[j], sym.tag));
+ }
+ break;
+ }
+ case 'KP': {
+ var sym_1 = sym0;
+ var addedAlt_1 = false;
+ if (i < syms.length - 1) {
+ var nextSym = syms[i + 1];
+ if (nextSym.id == 'KS') {
+ var nextToken_1 = nextSym.tokens[0];
+ sym_1.alts.forEach(function (alt) {
+ if (alt.prefixes.some(function (p) { return nextToken_1.startsWith(p); })) {
+ alt.tokens.forEach(function (symks) {
+ symks.tokens.forEach(function (t) {
+ ts.push(new TaggedString(t, sym_1.tag));
+ });
+ });
+ addedAlt_1 = true;
+ return;
+ }
+ });
+ }
+ }
+ if (addedAlt_1)
+ break;
+ sym_1.tokens.forEach(function (symks) {
+ symks.tokens.forEach(function (t) {
+ ts.push(new TaggedString(t, sym_1.tag));
+ });
+ });
+ break;
+ }
+ }
+ };
+ for (var i = 0; i < syms.length; i++) {
+ _loop_4(i);
+ }
+ return ts;
+ };
+ GFConcrete.prototype.linearizeAll = function (tree) {
+ var _this = this;
+ return this.linearizeSyms(tree, '0').map(function (r) {
+ return _this.unlex(_this.syms2toks(r.table[0]));
+ });
+ };
+ GFConcrete.prototype.linearize = function (tree) {
+ var res = this.linearizeSyms(tree, '0');
+ if (res.length > 0)
+ return this.unlex(this.syms2toks(res[0].table[0]));
+ else
+ return '';
+ };
+ GFConcrete.prototype.tagAndLinearize = function (tree) {
+ var res = this.linearizeSyms(tree, '0');
+ if (res.length > 0)
+ return this.syms2toks(res[0].table[0]);
+ else
+ return [];
+ };
+ GFConcrete.prototype.unlex = function (ts) {
+ if (ts.length == 0) {
+ return '';
+ }
+ var noSpaceAfter = /^[\(\-\[]/;
+ var noSpaceBefore = /^[\.\,\?\!\)\:\;\-\]]/;
+ var s = '';
+ for (var i = 0; i < ts.length; i++) {
+ var t = ts[i].s;
+ var after = i < ts.length - 1 ? ts[i + 1].s : null;
+ s += t;
+ if (after != null
+ && !t.match(noSpaceAfter)
+ && !after.match(noSpaceBefore)) {
+ s += ' ';
+ }
+ }
+ return s;
+ };
+ GFConcrete.prototype.tokenize = function (string) {
+ var inToken = false;
+ var start = 0;
+ var end;
+ var tokens = [];
+ var i;
+ for (i = 0; i < string.length; i++) {
+ if (string.charAt(i) == ' '
+ || string.charAt(i) == '\f'
+ || string.charAt(i) == '\n'
+ || string.charAt(i) == '\r'
+ || string.charAt(i) == '\t'
+ || string.charAt(i) == '\v'
+ || string.charAt(i) == String.fromCharCode(160)) {
+ if (inToken) {
+ end = i - 1;
+ inToken = false;
+ tokens.push(string.substr(start, end - start + 1));
+ }
+ }
+ else {
+ if (!inToken) {
+ start = i;
+ inToken = true;
+ }
+ }
+ }
+ if (inToken) {
+ end = i - 1;
+ inToken = false;
+ tokens.push(string.substr(start, end - start + 1));
+ }
+ return tokens;
+ };
+ GFConcrete.prototype.parseString = function (string, cat) {
+ var tokens = this.tokenize(string);
+ var ps = new ParseState(this, cat);
+ for (var i in tokens) {
+ if (!ps.next(tokens[i]))
+ return [];
+ }
+ return ps.extractTrees();
+ };
+ GFConcrete.prototype.complete = function (input, cat) {
+ if (input == null)
+ input = '';
+ var tokens = input.trim().split(' ');
+ for (var i = tokens.length - 1; i >= 0; i--) {
+ if (tokens[i] == '') {
+ tokens.splice(i, 1);
+ }
+ }
+ var current = tokens.pop();
+ if (current == null)
+ current = '';
+ var ps = new ParseState(this, cat);
+ var ps2 = new ParseState(this, cat);
+ for (var i = 0; i < tokens.length; i++) {
+ if (!ps.next(tokens[i])) {
+ return { 'consumed': [], 'suggestions': [] };
+ }
+ ps2.next(tokens[i]);
+ }
+ if (ps2.next(current)) {
+ ps.next(current);
+ tokens.push(current);
+ current = '';
+ }
+ var acc = ps.complete(current);
+ var suggs = [];
+ if (acc.value) {
+ acc.value.forEach(function (a) {
+ a.seq.forEach(function (s) {
+ switch (s.id) {
+ case 'KS': {
+ s.tokens.forEach(function (t) {
+ suggs.push(t);
+ });
+ break;
+ }
+ case 'KP': {
+ s.tokens.forEach(function (symks) {
+ symks.tokens.forEach(function (t) {
+ suggs.push(t);
+ });
+ });
+ break;
+ }
+ }
+ });
+ });
+ }
+ return { 'consumed': tokens, 'suggestions': suggs };
+ };
+ return GFConcrete;
+}());
+var TaggedString = (function () {
+ function TaggedString(s, tag) {
+ this.s = s;
+ this.tag = tag;
+ }
+ return TaggedString;
+}());
+var Apply = (function () {
+ function Apply(fun, args) {
+ this.id = 'Apply';
+ this.fun = fun;
+ this.args = args;
+ }
+ Apply.prototype.show = function (cat) {
+ var recStr = [];
+ recStr.push(cat, ' -> ', this.fun.name, ' [', this.args, ']');
+ return recStr.join('');
+ };
+ Apply.prototype.isEqual = function (obj) {
+ if (this.id != obj.id || this.fun != obj.fun || this.args.length != obj.args.length)
+ return false;
+ for (var i in this.args) {
+ if (this.args[i] != obj.args[i])
+ return false;
+ }
+ return true;
+ };
+ return Apply;
+}());
+var Coerce = (function () {
+ function Coerce(arg) {
+ this.id = 'Coerce';
+ this.arg = arg;
+ }
+ Coerce.prototype.show = function (cat) {
+ var recStr = [];
+ recStr.push(cat, ' -> _ [', this.arg, ']');
+ return recStr.join('');
+ };
+ return Coerce;
+}());
+var PArg = (function () {
+ function PArg() {
+ var hypos = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ hypos[_i] = arguments[_i];
+ }
+ this.fid = hypos[hypos.length - 1];
+ if (hypos.length > 1)
+ this.hypos = hypos.slice(0, hypos.length - 1);
+ else
+ this.hypos = [];
+ }
+ return PArg;
+}());
+var Const = (function () {
+ function Const(lit, toks) {
+ this.id = 'Const';
+ this.lit = lit;
+ this.toks = toks;
+ }
+ Const.prototype.show = function (cat) {
+ var recStr = [];
+ recStr.push(cat, ' -> ', this.lit.print());
+ return recStr.join('');
+ };
+ Const.prototype.isEqual = function (obj) {
+ if (this.id != obj.id || this.lit.isEqual(obj.lit) || this.toks.length != obj.toks.length)
+ return false;
+ for (var i in this.toks) {
+ if (this.toks[i] != obj.toks[i])
+ return false;
+ }
+ return true;
+ };
+ return Const;
+}());
+var CncFun = (function () {
+ function CncFun(name, lins) {
+ this.name = name;
+ this.lins = lins;
+ }
+ return CncFun;
+}());
+var SymCat = (function () {
+ function SymCat(i, label) {
+ this.id = 'Arg';
+ this.i = i;
+ this.label = label;
+ }
+ SymCat.prototype.show = function () {
+ var argStr = [];
+ argStr.push(this.i, this.label);
+ return argStr.join('.');
+ };
+ return SymCat;
+}());
+var SymKS = (function () {
+ function SymKS() {
+ var tokens = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ tokens[_i] = arguments[_i];
+ }
+ this.id = 'KS';
+ this.tokens = tokens;
+ }
+ SymKS.prototype.show = function () {
+ var terminalStr = [];
+ terminalStr.push('"', this.tokens, '"');
+ return terminalStr.join('');
+ };
+ SymKS.prototype.tagWith = function (tag) {
+ var s = new SymKS();
+ s.tokens = this.tokens.slice();
+ s.tag = tag;
+ return s;
+ };
+ return SymKS;
+}());
+var SymKP = (function () {
+ function SymKP(tokens, alts) {
+ this.id = 'KP';
+ this.tokens = tokens;
+ this.alts = alts;
+ }
+ SymKP.prototype.show = function () {
+ var terminalStr = [];
+ terminalStr.push('"', this.tokens, '"');
+ return terminalStr.join('');
+ };
+ SymKP.prototype.tagWith = function (tag) {
+ var s = new SymKP(this.tokens.slice(), this.alts.slice());
+ s.tag = tag;
+ return s;
+ };
+ return SymKP;
+}());
+var Alt = (function () {
+ function Alt(tokens, prefixes) {
+ this.tokens = tokens;
+ this.prefixes = prefixes;
+ }
+ return Alt;
+}());
+var SymLit = (function () {
+ function SymLit(i, label) {
+ this.id = 'Lit';
+ this.i = i;
+ this.label = label;
+ }
+ SymLit.prototype.getId = function () {
+ return this.id;
+ };
+ SymLit.prototype.show = function () {
+ var argStr = [];
+ argStr.push(this.i, this.label);
+ return argStr.join('.');
+ };
+ return SymLit;
+}());
+var Trie = (function () {
+ function Trie() {
+ this.value = null;
+ this.items = {};
+ }
+ Trie.prototype.insertChain = function (keys, obj) {
+ var node = this;
+ keys.forEach(function (key) {
+ var nnode = node.items[key];
+ if (nnode == null) {
+ nnode = new Trie();
+ node.items[key] = nnode;
+ }
+ node = nnode;
+ });
+ node.value = obj;
+ };
+ Trie.prototype.insertChain1 = function (keys, obj) {
+ var node = this;
+ keys.forEach(function (key) {
+ var nnode = node.items[key];
+ if (nnode == null) {
+ nnode = new Trie();
+ node.items[key] = nnode;
+ }
+ node = nnode;
+ });
+ if (node.value == null)
+ node.value = [obj];
+ else
+ node.value.push(obj);
+ };
+ Trie.prototype.lookup = function (key) {
+ return this.items[key];
+ };
+ Trie.prototype.isEmpty = function () {
+ if (this.value != null)
+ return false;
+ for (var _ in this.items) {
+ return false;
+ }
+ return true;
+ };
+ return Trie;
+}());
+var ParseState = (function () {
+ function ParseState(concrete, startCat) {
+ this.concrete = concrete;
+ this.startCat = startCat;
+ this.items = new Trie();
+ this.chart = new Chart(concrete);
+ var items = [];
+ var fids = concrete.startCats[startCat];
+ if (fids != null) {
+ var fid = void 0;
+ for (fid = fids.s; fid <= fids.e; fid++) {
+ var exProds = this.chart.expandForest(fid);
+ for (var j in exProds) {
+ var rule = exProds[j];
+ var fun = rule.fun;
+ for (var lbl in fun.lins) {
+ items.push(new ActiveItem(0, 0, rule.fun, fun.lins[lbl], rule.args, fid, parseInt(lbl)));
+ }
+ }
+ }
+ }
+ this.items.insertChain([], items);
+ }
+ ParseState.prototype.next = function (token) {
+ var acc = this.items.lookup(token);
+ if (acc == null) {
+ acc = new Trie();
+ }
+ this.process(this.items.value, function (fid) {
+ switch (fid) {
+ case -1:
+ return new Const(new Fun('"' + token + '"'), [token]);
+ case -2: {
+ var x = parseInt(token, 10);
+ if (token == '0' || (x != 0 && !isNaN(x)))
+ return new Const(new Fun(token), [token]);
+ else
+ return null;
+ }
+ case -3: {
+ var x = parseFloat(token);
+ if (token == '0' || token == '0.0' || (x != 0 && !isNaN(x)))
+ return new Const(new Fun(token), [token]);
+ else
+ return null;
+ }
+ }
+ return null;
+ }, function (tokens, item) {
+ if (tokens[0] == token) {
+ var tokens1 = [];
+ for (var i = 1; i < tokens.length; i++) {
+ tokens1[i - 1] = tokens[i];
+ }
+ acc.insertChain1(tokens1, item);
+ }
+ });
+ this.items = acc;
+ this.chart.shift();
+ return !this.items.isEmpty();
+ };
+ ParseState.prototype.complete = function (currentToken) {
+ var acc = this.items.lookup(currentToken);
+ if (acc == null)
+ acc = new Trie();
+ this.process(this.items.value, function (_fid) {
+ return null;
+ }, function (tokens, item) {
+ if (currentToken == '' || tokens[0].indexOf(currentToken) == 0) {
+ var tokens1 = [];
+ for (var i = 1; i < tokens.length; i++) {
+ tokens1[i - 1] = tokens[i];
+ }
+ acc.insertChain1(tokens1, item);
+ }
+ });
+ return acc;
+ };
+ ParseState.prototype.extractTrees = function () {
+ this.process(this.items.value, function (_fid) {
+ return null;
+ }, function (_tokens, _item) {
+ });
+ var totalFIds = this.concrete.totalFIds;
+ var forest = this.chart.forest;
+ function go(fid) {
+ if (fid < totalFIds) {
+ return [new Fun('?')];
+ }
+ else {
+ var trees_1 = [];
+ var rules = forest[fid];
+ for (var j in rules) {
+ var rule = rules[j];
+ if (rule.id == 'Const') {
+ trees_1.push(rule.lit);
+ }
+ else {
+ rule = rule;
+ var arg_ix = [];
+ var arg_ts = [];
+ for (var k in rule.args) {
+ arg_ix[k] = 0;
+ arg_ts[k] = go(rule.args[k].fid);
+ }
+ while (true) {
+ var t = new Fun(rule.fun.name);
+ for (var k = 0; k < arg_ts.length; k++) {
+ t.setArg(k, arg_ts[k][arg_ix[k]]);
+ }
+ trees_1.push(t);
+ var i = 0;
+ while (i < arg_ts.length) {
+ arg_ix[i]++;
+ if (arg_ix[i] < arg_ts[i].length)
+ break;
+ arg_ix[i] = 0;
+ i++;
+ }
+ if (i >= arg_ts.length)
+ break;
+ }
+ }
+ }
+ return trees_1;
+ }
+ }
+ var trees = [];
+ var fids = this.concrete.startCats[this.startCat];
+ if (fids != null) {
+ var _loop_5 = function (fid0) {
+ var labels = {};
+ var rules = this_2.chart.expandForest(fid0);
+ rules.forEach(function (rule) {
+ for (var lbl in rule.fun.lins) {
+ labels[lbl] = true;
+ }
+ });
+ for (var lbl0 in labels) {
+ var lbl = parseInt(lbl0);
+ var fid = this_2.chart.lookupPC(fid0, lbl, 0);
+ var arg_ts = go(fid);
+ for (var i in arg_ts) {
+ var isMember = false;
+ for (var j in trees) {
+ if (arg_ts[i].isEqual(trees[j])) {
+ isMember = true;
+ break;
+ }
+ }
+ if (!isMember)
+ trees.push(arg_ts[i]);
+ }
+ }
+ };
+ var this_2 = this;
+ for (var fid0 = fids.s; fid0 <= fids.e; fid0++) {
+ _loop_5(fid0);
+ }
+ }
+ return trees;
+ };
+ ParseState.prototype.process = function (agenda, literalCallback, tokenCallback) {
+ if (agenda != null) {
+ var _loop_6 = function () {
+ var item = agenda.pop();
+ var lin = item.seq;
+ if (item.dot < lin.length) {
+ var sym0 = lin[item.dot];
+ switch (sym0.id) {
+ case 'Arg': {
+ var sym = sym0;
+ var fid = item.args[sym.i].fid;
+ var label = sym.label;
+ var items = this_3.chart.lookupAC(fid, label);
+ if (items == null) {
+ var rules = this_3.chart.expandForest(fid);
+ for (var j in rules) {
+ var rule = rules[j];
+ agenda.push(new ActiveItem(this_3.chart.offset, 0, rule.fun, rule.fun.lins[label], rule.args, fid, label));
+ }
+ this_3.chart.insertAC(fid, label, [item]);
+ }
+ else {
+ var isMember = false;
+ for (var j in items) {
+ if (items[j].isEqual(item)) {
+ isMember = true;
+ break;
+ }
+ }
+ if (!isMember) {
+ items.push(item);
+ var fid2 = this_3.chart.lookupPC(fid, label, this_3.chart.offset);
+ if (fid2 != null) {
+ agenda.push(item.shiftOverArg(sym.i, fid2));
+ }
+ }
+ }
+ break;
+ }
+ case 'KS': {
+ var sym = sym0;
+ tokenCallback(sym.tokens, item.shiftOverTokn());
+ break;
+ }
+ case 'KP': {
+ var sym = sym0;
+ var pitem_1 = item.shiftOverTokn();
+ sym.tokens.forEach(function (symks) {
+ tokenCallback(symks.tokens, pitem_1);
+ });
+ sym.alts.forEach(function (alt) {
+ alt.tokens.forEach(function (symks) {
+ tokenCallback(symks.tokens, pitem_1);
+ });
+ });
+ break;
+ }
+ case 'Lit': {
+ var sym = sym0;
+ var fid = item.args[sym.i].fid;
+ var rules = this_3.chart.forest[fid];
+ if (rules != null) {
+ tokenCallback(rules[0].toks, item.shiftOverTokn());
+ }
+ else {
+ var rule = literalCallback(fid);
+ if (rule != null) {
+ fid = this_3.chart.nextId++;
+ this_3.chart.forest[fid] = [rule];
+ tokenCallback(rule.toks, item.shiftOverArg(sym.i, fid));
+ }
+ }
+ break;
+ }
+ }
+ }
+ else {
+ var fid_1 = this_3.chart.lookupPC(item.fid, item.lbl, item.offset);
+ if (fid_1 == null) {
+ fid_1 = this_3.chart.nextId++;
+ var items = this_3.chart.lookupACo(item.offset, item.fid, item.lbl);
+ if (items != null) {
+ items.forEach(function (pitem) {
+ var i = pitem.seq[pitem.dot].i;
+ agenda.push(pitem.shiftOverArg(i, fid_1));
+ });
+ }
+ this_3.chart.insertPC(item.fid, item.lbl, item.offset, fid_1);
+ this_3.chart.forest[fid_1] = [new Apply(item.fun, item.args)];
+ }
+ else {
+ var labels = this_3.chart.labelsAC(fid_1);
+ if (labels != null) {
+ for (var lbl in labels) {
+ agenda.push(new ActiveItem(this_3.chart.offset, 0, item.fun, item.fun.lins[lbl], item.args, fid_1, parseInt(lbl)));
+ }
+ }
+ var rules = this_3.chart.forest[fid_1];
+ var rule_2 = new Apply(item.fun, item.args);
+ var isMember_1 = false;
+ rules.forEach(function (rule1) {
+ if (rule1.isEqual(rule_2))
+ isMember_1 = true;
+ });
+ if (!isMember_1)
+ rules.push(rule_2);
+ }
+ }
+ };
+ var this_3 = this;
+ while (agenda.length > 0) {
+ _loop_6();
+ }
+ }
+ };
+ return ParseState;
+}());
+var Chart = (function () {
+ function Chart(concrete) {
+ this.active = {};
+ this.actives = [];
+ this.passive = {};
+ this.forest = {};
+ this.nextId = concrete.totalFIds;
+ this.offset = 0;
+ for (var fid in concrete.pproductions) {
+ this.forest[fid] = concrete.pproductions[fid];
+ }
+ }
+ Chart.prototype.lookupAC = function (fid, label) {
+ var tmp = this.active[fid];
+ if (tmp == null)
+ return null;
+ return tmp[label];
+ };
+ Chart.prototype.lookupACo = function (offset, fid, label) {
+ var tmp;
+ if (offset == this.offset)
+ tmp = this.active[fid];
+ else
+ tmp = this.actives[offset][fid];
+ if (tmp == null)
+ return null;
+ return tmp[label];
+ };
+ Chart.prototype.labelsAC = function (fid) {
+ return this.active[fid];
+ };
+ Chart.prototype.insertAC = function (fid, label, items) {
+ var tmp = this.active[fid];
+ if (tmp == null) {
+ tmp = {};
+ this.active[fid] = tmp;
+ }
+ tmp[label] = items;
+ };
+ Chart.prototype.lookupPC = function (fid, label, offset) {
+ var key = fid + '.' + label + '-' + offset;
+ return this.passive[key];
+ };
+ Chart.prototype.insertPC = function (fid1, label, offset, fid2) {
+ var key = fid1 + '.' + label + '-' + offset;
+ this.passive[key] = fid2;
+ };
+ Chart.prototype.shift = function () {
+ this.actives.push(this.active);
+ this.active = {};
+ this.passive = {};
+ this.offset++;
+ };
+ Chart.prototype.expandForest = function (fid) {
+ var rules = [];
+ var forest = this.forest;
+ var go = function (rules0) {
+ for (var i in rules0) {
+ var rule = rules0[i];
+ switch (rule.id) {
+ case 'Apply':
+ rules.push(rule);
+ break;
+ case 'Coerce':
+ go(forest[rule.arg]);
+ break;
+ }
+ }
+ };
+ go(this.forest[fid]);
+ return rules;
+ };
+ return Chart;
+}());
+var ActiveItem = (function () {
+ function ActiveItem(offset, dot, fun, seq, args, fid, lbl) {
+ this.offset = offset;
+ this.dot = dot;
+ this.fun = fun;
+ this.seq = seq;
+ this.args = args;
+ this.fid = fid;
+ this.lbl = lbl;
+ }
+ ActiveItem.prototype.isEqual = function (obj) {
+ return (this.offset == obj.offset &&
+ this.dot == obj.dot &&
+ this.fun == obj.fun &&
+ this.seq == obj.seq &&
+ this.args == obj.args &&
+ this.fid == obj.fid &&
+ this.lbl == obj.lbl);
+ };
+ ActiveItem.prototype.shiftOverArg = function (i, fid) {
+ var nargs = [];
+ for (var k in this.args) {
+ nargs[k] = this.args[k];
+ }
+ nargs[i] = new PArg(fid);
+ return new ActiveItem(this.offset, this.dot + 1, this.fun, this.seq, nargs, this.fid, this.lbl);
+ };
+ ActiveItem.prototype.shiftOverTokn = function () {
+ return new ActiveItem(this.offset, this.dot + 1, this.fun, this.seq, this.args, this.fid, this.lbl);
+ };
+ return ActiveItem;
+}());
+function isUndefined(a) {
+ return typeof a == 'undefined';
+}
+if (!String.prototype.startsWith) {
+ Object.defineProperty(String.prototype, 'startsWith', {
+ value: function (search, pos) {
+ pos = !pos || pos < 0 ? 0 : +pos;
+ return this.substring(pos, pos + search.length) === search;
+ }
+ });
+}
+if (!String.prototype.includes) {
+ Object.defineProperty(String.prototype, 'includes', {
+ value: function (search, start) {
+ 'use strict';
+ if (typeof start !== 'number') {
+ start = 0;
+ }
+ if (start + search.length > this.length) {
+ return false;
+ }
+ else {
+ return this.indexOf(search, start) !== -1;
+ }
+ }
+ });
+}
+//# sourceMappingURL=gflib.js.map \ No newline at end of file
diff --git a/src/runtime/typescript/js/gflib.js.map b/src/runtime/typescript/js/gflib.js.map
new file mode 100644
index 000000000..fbc04aca3
--- /dev/null
+++ b/src/runtime/typescript/js/gflib.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"gflib.js","sourceRoot":"","sources":["../gflib.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/src/runtime/typescript/tsconfig.json b/src/runtime/typescript/tsconfig.json
new file mode 100644
index 000000000..2b2a77099
--- /dev/null
+++ b/src/runtime/typescript/tsconfig.json
@@ -0,0 +1,12 @@
+{
+ "compilerOptions": {
+ "module": "none",
+ "target": "es3",
+ "strict": true,
+ "noImplicitAny": true,
+ "removeComments": true,
+ "outDir": "js",
+ "sourceMap": true
+ },
+ "compileOnSave": true
+}