diff --git a/lib/javascript/gflib.js b/lib/javascript/gflib.js index faf7b1d69..728655469 100644 --- a/lib/javascript/gflib.js +++ b/lib/javascript/gflib.js @@ -97,6 +97,9 @@ Fun.prototype.isComplete = function() { return true; } } ; +Fun.prototype.isLiteral = function() { + return (/^[\"\d]/).test(this.name); +} ; /* Concrete syntax terms */ @@ -279,7 +282,14 @@ function GFConcrete(flags, rules, parser) { 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.lindef = function (cat, v) { return this.rules[cat]([new Str(v)]); } ; GFConcrete.prototype.linearize = function (tree) { @@ -297,8 +307,11 @@ GFConcrete.prototype.linearizeToTerm = function (tree) { for (var i in tree.args) { cs.push(this.linearizeToTerm(tree.args[i])); } - var newTerm = this.rule(tree.name, cs); - return newTerm; + if (tree.isLiteral()) { + return new Arr(new Str(tree.name)); + } else { + return this.rule(tree.name, cs); + } } }; GFConcrete.prototype.unlex = function (ts) {