Changed gflib.js to handle linearization of literals. This duplicates some functionality from gfjseditor.js, but is required for the translator to be able to linearize literals. The editor should be fixed to remove the special code for literals, but it is a bit to much for me to understand right now.

This commit is contained in:
bjorn
2008-10-29 09:33:58 +00:00
parent 8857b7c11c
commit e5871c7c1d

View File

@@ -97,6 +97,9 @@ Fun.prototype.isComplete = function() {
return true; return true;
} }
} ; } ;
Fun.prototype.isLiteral = function() {
return (/^[\"\d]/).test(this.name);
} ;
/* Concrete syntax terms */ /* Concrete syntax terms */
@@ -279,7 +282,14 @@ function GFConcrete(flags, rules, parser) {
this.parser = undefined; this.parser = undefined;
} }
} }
GFConcrete.prototype.rule = function (name, cs) { return this.rules[name](cs); }; GFConcrete.prototype.rule = function (name, cs) {
var r = this.rules[name];
if (r) {
return this.rules[name](cs);
} else {
window.alert("Missing rule " + name);
}
};
GFConcrete.prototype.addRule = function (name, f) { this.rules[name] = f; }; GFConcrete.prototype.addRule = function (name, f) { this.rules[name] = f; };
GFConcrete.prototype.lindef = function (cat, v) { return this.rules[cat]([new Str(v)]); } ; GFConcrete.prototype.lindef = function (cat, v) { return this.rules[cat]([new Str(v)]); } ;
GFConcrete.prototype.linearize = function (tree) { GFConcrete.prototype.linearize = function (tree) {
@@ -297,8 +307,11 @@ GFConcrete.prototype.linearizeToTerm = function (tree) {
for (var i in tree.args) { for (var i in tree.args) {
cs.push(this.linearizeToTerm(tree.args[i])); cs.push(this.linearizeToTerm(tree.args[i]));
} }
var newTerm = this.rule(tree.name, cs); if (tree.isLiteral()) {
return newTerm; return new Arr(new Str(tree.name));
} else {
return this.rule(tree.name, cs);
}
} }
}; };
GFConcrete.prototype.unlex = function (ts) { GFConcrete.prototype.unlex = function (ts) {