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 ""; - } + if (ts.length == 0) { + return ""; + } - var noSpaceAfter = /^[\(\-\[]/; - var noSpaceBefore = /^[\.\,\?\!\)\:\;\-\]]/; + 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; + 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) //   ) { - 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 = ""; + // Parameter defaults + if (input == null) input = ""; + if (cat == null) cat = grammar.abstract.startcat; - // 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 }; + // 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> - 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>, - 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 - args: PArg[] - fid: FId - lbl: number - - constructor( - offset: number, - dot: number, - fun: CncFun, - seq: Array, - 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) //   + ) { + 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 { + public value: T[] | null + private items: {[key: string]: Trie} + + public constructor() { + this.value = null + this.items = {} + } + + public insertChain(keys: string[], obj: T[]): void { + let node: Trie = 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 = 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 { + 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 + 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 { + + // 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 +}