From 2c2a8a51e3b9828e242e450b92cdd48b78f82169 Mon Sep 17 00:00:00 2001 From: bjorn Date: Wed, 29 Oct 2008 09:33:58 +0000 Subject: [PATCH] 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. --- lib/javascript/gflib.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) 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) {