mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-23 19:42:50 -06:00
bugfix in the javascript parser
This commit is contained in:
@@ -646,8 +646,55 @@ ParseState.prototype.extractTrees = function() {
|
|||||||
, function (tokens, item) {
|
, function (tokens, item) {
|
||||||
});
|
});
|
||||||
|
|
||||||
var trees = new Array();
|
|
||||||
|
var totalCats = this.parser.totalCats;
|
||||||
|
var forest = this.chart.forest;
|
||||||
|
|
||||||
|
function go(fid) {
|
||||||
|
if (fid < totalCats) {
|
||||||
|
return [new Fun("?")];
|
||||||
|
} else {
|
||||||
|
var trees = new Array();
|
||||||
|
|
||||||
|
var rules = forest[fid];
|
||||||
|
for (j in rules) {
|
||||||
|
var rule = rules[j];
|
||||||
|
|
||||||
|
var arg_ix = new Array();
|
||||||
|
var arg_ts = new Array();
|
||||||
|
for (k in rule.args) {
|
||||||
|
arg_ix[k] = 0;
|
||||||
|
arg_ts[k] = go(rule.args[k]);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
var t = new Fun(rule.fun.name);
|
||||||
|
for (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]++;
|
||||||
|
if (arg_ix[i] < arg_ts[i].length)
|
||||||
|
break;
|
||||||
|
|
||||||
|
arg_ix[i] = 0;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= arg_ts.length)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return trees;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var trees = new Array();
|
||||||
var fids = this.parser.startCats[this.startCat];
|
var fids = this.parser.startCats[this.startCat];
|
||||||
if (fids != null) {
|
if (fids != null) {
|
||||||
for (fid0 = fids.s; fid0 <= fids.e; fid0++) {
|
for (fid0 = fids.s; fid0 <= fids.e; fid0++) {
|
||||||
@@ -655,62 +702,13 @@ ParseState.prototype.extractTrees = function() {
|
|||||||
var labels = new Object();
|
var labels = new Object();
|
||||||
var rules = this.chart.expandForest(fid0);
|
var rules = this.chart.expandForest(fid0);
|
||||||
for (i in rules) {
|
for (i in rules) {
|
||||||
var rule = rules[i];
|
for (lbl in rules[i].fun.lins) {
|
||||||
var fun = rule.fun;
|
|
||||||
for (lbl in fun.lins) {
|
|
||||||
labels[lbl] = true;
|
labels[lbl] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var ps = this;
|
|
||||||
|
|
||||||
function go(fid) {
|
|
||||||
if (fid < ps.parser.totalCats) {
|
|
||||||
return [new Fun("?")];
|
|
||||||
} else {
|
|
||||||
var trees = new Array();
|
|
||||||
|
|
||||||
var rules = ps.chart.forest[fid];
|
|
||||||
for (j in rules) {
|
|
||||||
var rule = rules[j];
|
|
||||||
var fun = rule.fun;
|
|
||||||
|
|
||||||
var arg_ix = new Array();
|
|
||||||
var arg_ts = new Array();
|
|
||||||
for (k in rule.args) {
|
|
||||||
arg_ix[k] = 0;
|
|
||||||
arg_ts[k] = go(rule.args[k]);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
|
|
||||||
var t = new Fun(fun.name);
|
|
||||||
for (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]++;
|
|
||||||
if (arg_ix[i] < arg_ts[i].length)
|
|
||||||
break;
|
|
||||||
|
|
||||||
arg_ix[i] = 0;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= arg_ts.length)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return trees;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (lbl in labels) {
|
for (lbl in labels) {
|
||||||
fid = this.chart.lookupPC(fid0,lbl,0);
|
var fid = this.chart.lookupPC(fid0,lbl,0);
|
||||||
var arg_ts = go(fid);
|
var arg_ts = go(fid);
|
||||||
for (i in arg_ts) {
|
for (i in arg_ts) {
|
||||||
trees.push(arg_ts[i]);
|
trees.push(arg_ts[i]);
|
||||||
@@ -793,18 +791,19 @@ ParseState.prototype.process = function (agenda,callback) {
|
|||||||
for (lbl in labels) {
|
for (lbl in labels) {
|
||||||
agenda.push(new ActiveItem(this.chart.offset,0,item.fun,item.fun.lins[lbl],item.args,fid,lbl));
|
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 Rule(item.fun,item.args);
|
|
||||||
|
|
||||||
var isMember = false;
|
|
||||||
for (j in rules) {
|
|
||||||
if (rules[j].isEqual(rule))
|
|
||||||
isMember = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isMember)
|
|
||||||
rules.push(rule);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var rules = this.chart.forest[fid];
|
||||||
|
var rule = new Rule(item.fun,item.args);
|
||||||
|
|
||||||
|
var isMember = false;
|
||||||
|
for (j in rules) {
|
||||||
|
if (rules[j].isEqual(rule))
|
||||||
|
isMember = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isMember)
|
||||||
|
rules.push(rule);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user